Autor | Zpráva | ||
---|---|---|---|
leorond Profil |
Ahoj mám problém s ověřením existence mailu v DB, napsal jsem si takovou lepší kontrolu abych zajistil že uživatel okamžitě zjistí že napsal něco špatně nebo že například mail již existuje ale nějak mi to neověřuje zda již mail v DB existuje. Mohli by jste na to kouknout kde dělám chybu?
registrace.php <script type="text/javascript" src="nastaveni/js/regajax.js"></script> <?php if(isset($_POST["OK"])) { $email = trim($_POST['email']); $result = mysql_query("SELECT mail FROM uzivatele WHERE mail='$email'"); $myrow = mysql_num_rows($result); if (empty($email)) { echo "<ul><li>".eror_complete_data."</li></ul>"; } elseif (!preg_match("/^[_a-z0-9\-\_]+(\.[_a-z0-9\-\_]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i", $email)) { echo "<ul><li>".eror_email."</li></ul>"; } } ?> <div> </div> <form action="#" id="register"> <table style="margin:0px auto;"> <tr> <td valign="top"><strong>mail:</strong></td> <td><input name="email" type="text" size="30" maxlength="40" onblur="document.getElementById('email').innerHTML='<img alt=\'\' src=<? echo $_SERVER['IMAGES_HOST'];?>images/wait.gif>'; AjaxRegCheck(this.value,'email');"> <br><font color="#CC6600" size="1">email@domena.tld</font></td> <td valign="top" width="150"><div id="email"></div></td> </tr> </table> </form> regcheck.php <?php if ($_POST['email']) { $email = $_POST['email']; if (preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i", $email) or empty($email)) { $result = mysql_query("SELECT mail FROM uzivatele WHERE mail='".$email."'"); if(mysql_num_rows($result) > 0) { echo "<img width='20' alt='Error' src='".$_SERVER['IMAGES_HOST']."images/nok.png'><font color='red'>Email already exist</font>"; } else { echo "<img width='20' alt='Correct' src='".$_SERVER['IMAGES_HOST']."images/ok.png'><font color='green'>Email is valid</font>"; } } else { echo "<img width='20' alt='Error' src='".$_SERVER['IMAGES_HOST']."images/nok.png'><font color='red'>Inalid email string</font>"; } } ?> regajax.js function AjaxRegCheck(dataSource, PostInfo) { var data = PostInfo+'='+dataSource; var XMLHttpRequestobject = false; if (window.XMLHttpRequest) { XMLHttpRequestobject = new XMLHttpRequest() if (XMLHttpRequestobject.overrideMimeType) { XMLHttpRequestobject.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { try { XMLHttpRequestobject = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { XMLHttpRequestobject = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!XMLHttpRequestobject) { alert('Your Browser don\'t support Ajax!'); return false; } if (XMLHttpRequestobject) { function stateck() { if(XMLHttpRequestobject.readyState==4) { document.getElementById(PostInfo).innerHTML=XMLHttpRequestobject.responseText; } } XMLHttpRequestobject.onreadystatechange=stateck; XMLHttpRequestobject.open("POST", "nastaveni/regcheck.php"); XMLHttpRequestobject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8'); XMLHttpRequestobject.send(data); } } function refreshimage(dataSource, PostInfo) { dataSource = dataSource+"?sid="+Math.random()*3; document.getElementById(PostInfo).innerHTML = ' Fetching data...'; var XMLHttpRequestobject = false; if (window.XMLHttpRequest) { XMLHttpRequestobject = new XMLHttpRequest() if (XMLHttpRequestobject.overrideMimeType) { XMLHttpRequestobject.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { try { XMLHttpRequestobject = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { XMLHttpRequestobject = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!XMLHttpRequestobject) { alert('Your Browser don\'t support Ajax!'); return false; } if (XMLHttpRequestobject) { function stateck() { if(XMLHttpRequestobject.readyState==4) { document.getElementById(PostInfo).innerHTML="<img alt='' src=\""+dataSource+"\" border=\"0\">"; document.getElementById("imgvalue").value = null; document.getElementById("checktype").innerHTML = null; } } XMLHttpRequestobject.onreadystatechange=stateck; XMLHttpRequestobject.open("GET", dataSource, true); XMLHttpRequestobject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8'); XMLHttpRequestobject.send(""); } } Děkuji Podle mne je chyba v regcheck.php jelikož vše funguje jak má ale neověří existenci mailu. Jinak jde o to že pokud se vyplní políčko mail tak se hned vedle ukáže zda je vyplněno správně nebo zda je někde chyba. |
||
leorond Profil |
#2 · Zasláno: 13. 12. 2015, 00:12:13
Zkusil jsem už snad všechno, dokonce jsem script celý přepsal, zkusil jsem nechat jen kontrolu existence mailu, zkusil jsem dát místo podmínky funkci,... stále jak kdyby se to do DB vůbec nedostalo
|
||
mimochodec Profil |
#3 · Zasláno: 13. 12. 2015, 00:30:06
Obecná rada: dopátrej se konkrétního řádku, který se chová jinak, než chceš. Kód prokládej alerty a echem, podle toho, co se ti vypíše, rozpoznej kudy kód jde a proč. 150 řádků a popis "nefunguje to" je k ničemu. Možná máš chybu hned v úplně prvním řádku, protože máš špatně cestu k tomu JS. Nebo taky ne a problém je kdekoliv jinde. Najdi konkrétní chybu.
|
||
leorond Profil |
#4 · Zasláno: 13. 12. 2015, 00:40:43
mimochodec: Nejhorší je že mi to nehodí ani žádnou chybu, pokud změním řádek
if(mysql_num_rows($result) > 0) na if(!mysql_num_rows($result) > 0) tak mi to začne u každé mailové adresy že již existuje. Cesty jsou navolené správně, php kód v souboru registrace nemusí ani být aby to fungovalo, html kód je správný, přístup do DB je nastaven a je správný to jsem si zjistil echováním z DB, JS by měl být také v pořádku ten jsem procházel snad už stokrát.
Netuším kde dělám chybu jinak bych ji opravil. |
||
mimochodec Profil |
#5 · Zasláno: 13. 12. 2015, 00:47:18
leorond:
„pokud změním řádek if(mysql_num_rows($result) > 0) na if(!mysql_num_rows($result) > 0) tak mi to začne u každé mailové adresy že již existuje.“
Nechápu. Jednak jsem si skoro jist, že ten vykřičník se vztáhne jen na mysql_num_rows($result), nikoliv na výsledek toho ifu, druhak nevím, cos tou větou chtěl říct. Vrací mysql_num_rows($result) to co má? Tzn. počet výskytů daného mailu v databázi. |
||
leorond Profil |
#6 · Zasláno: 13. 12. 2015, 00:50:00
Právě že to nevrací žádný výsledek, jako kdyby zadaná mailová adresa v DB neexistovala ale přitom v DB existuje.
|
||
mimochodec Profil |
#7 · Zasláno: 13. 12. 2015, 00:56:08
leorond:
Takže ze 150 řádků je podstatný asi tak jeden. Nemáš v té databázi nebo v té ověřované proměnné místo třeba navíc mezeru? |
||
leorond Profil |
takže
email is valid to vypíše jak má Inalid email string to vypíše taky v pořádku ale jediné na co nedojde je jen kontrola zda je mail v DB není tam žádná mezera, několikrát jsem kontroloval zápis v DB |
||
Dan Charousek Profil |
#9 · Zasláno: 13. 12. 2015, 00:58:29
leorond:
Vypiš si dotaz a zkus si ho ručně spustit: echo $sql = "SELECT mail FROM uzivatele WHERE mail='" . $email . "'"; // zde ti chybí ošetření pomocí mysql_real_escape_string $result = mysql_query($sql); |
||
tiso Profil |
#10 · Zasláno: 13. 12. 2015, 01:00:16
leorond: začni tým že zisti či ti zbehol dotaz, čo je v premennej
$result ?
|
||
leorond Profil |
Dan Charousek: myslím že ten dotaz co jsi napsal mi vypíše pouze
SELECT mail FROM uzivatele WHERE mail=" jinak ano vím o tom provádím ted pouze testy zda to bude ok a potom napíšu celý script i se zabezpečením.
Zkusil jsem zadat toto $email = "josifek.dvori@seznam.cz"; $result = mysql_query("SELECT mail FROM uzivatele WHERE mail='$email'"); if(mysql_num_rows($result) > 0) echo "nalezeno"; else echo "nenalezeno"; A vyskočila hláška nalezeno, pokud zadám jinou mailovou adresu tak nenalezeno. |
||
mimochodec Profil |
leorond:
„Dan Charousek: myslím že ten dotaz co jsi napsal mi vypíše pouze SELECT mail FROM uzivatele WHERE mail=" “
Nepřipadá ti to jako dostatečně chybné? Místo nějakých hlášek za tímto místem, kde už je něco jasně špatně, zjisti důvod, proč ten email v dotazu není. |
||
Dan Charousek Profil |
#13 · Zasláno: 13. 12. 2015, 01:17:05
leorond:
„myslím že ten dotaz co jsi napsal mi vypíše pouze“ Samozřejmě počítám s tím, že ho necháš, tam kde je proměnná $email definována.
„pokud zadám jinou mailovou adresu tak nenalezeno.“ Tak si nech vypsat ten dotaz s tou adresou, pro kterou to nefunguje a zkus ho ručně spustit. |
||
leorond Profil |
#14 · Zasláno: 13. 12. 2015, 01:19:21
Ok zkusil jsem a dostal výsledek
SELECT mail FROM uzivatele WHERE mail='josifek.dvori@seznam.cz'
|
||
Dan Charousek Profil |
#15 · Zasláno: 13. 12. 2015, 01:20:07
leorond:
A když to spustíš v PHPMyAdmin tak ti to vrátí požadovaný řádek? Pokud ano, tak je chyba jinde. |
||
leorond Profil |
#16 · Zasláno: 13. 12. 2015, 01:23:10
Ano phpmyadmin vrací to co má, najde a vypíše mi mailovou adresu
|
||
Keeehi Profil |
#17 · Zasláno: 13. 12. 2015, 01:25:51
Tak za tím dotazem skus vypsat chyby.
var_dump(mysql_errno()); |
||
leorond Profil |
|||
Keeehi Profil |
#19 · Zasláno: 13. 12. 2015, 01:35:04
leorond:
Ano možné to je. Jediné co už mě napadá je, že máte 2 databáze, jednu produkční a jednu testovací a script se připojuje na jednu a vy na druhou. |
||
leorond Profil |
jinak
Email is valid int(2002)
a taky Inalid email string bool(false) Bože ono to tu kontrolu normálně ignoruje :D |
||
Keeehi Profil |
#21 · Zasláno: 13. 12. 2015, 01:39:21
No výborně, 2002 značí problémy s připojením k databázi. Doufámm, že někde voláte mysql_connect, protože v kódu to nevidím.
|
||
leorond Profil |
#22 · Zasláno: 13. 12. 2015, 01:39:22
Zkouším to vše na hostingu kde mám jen jedinou DB
|
||
Keeehi Profil |
Kromě kódu chyby si můžete vypsat i hlášku. Může pomoct.
mysql_error() |
||
leorond Profil |
Ano mám to v jiném skriptu a nikdy jsem s tím problémy neměl, pokud dole dám dotaz z [#11] tak vše OK
No such file or directory :D buď netuším já nebo ten skript :D No každopádně pokud zadám do toho samého skriptu pod kód <?php $email = "josifek.dvori@seznam.cz"; $result = mysql_query("SELECT mail FROM uzivatele WHERE mail='".$email."'"); if(mysql_num_rows($result) > 0) { echo "<img width='20' alt='Error' src='images/nok.png'><font color='red'>Email already exist</font>"; } ?> Tak to vypíše Email already exist Nemůže být chyba v if (preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i", $email) or empty($email))
|
||
leorond Profil |
#25 · Zasláno: 13. 12. 2015, 17:17:57
Jsem v koncích, už nevím co víc zkusit.
|
||
Dan Charousek Profil |
#26 · Zasláno: 13. 12. 2015, 17:28:50
Zkus se inspirovat mým článkem při hledání chyb. Je celá řada věcí, kvůli kterým to nemusí fungovat a není v našich silách, to tu teď analyzovat.
|
||
leorond Profil |
#27 · Zasláno: 13. 12. 2015, 17:29:25
Napadá mě jen, může být problém v DB? Mám to v varchar(255)
|
||
Dan Charousek Profil |
#28 · Zasláno: 13. 12. 2015, 17:39:17
leorond:
Může a nemusí. Vím, že je to mnohdy |
||
mimochodec Profil |
leorond:
„Nemůže být chyba v if (preg_match “
V čem by ta chyba spočívala? Ta podmínka má něco vyhodnocovat. Dělá to přesně co má? Dej tomu vyhodnotit mail, který má projít a který nemá projít. Funguje to? „může být problém v DB?“ Ve fungování databáze ne. V tom, že se k ní nějak špatně připojuješ nebo v ní máš něco jiného nebo jinak než myslíš, to možné je. Jestli jsem správně četl, tak dotaz, který tam pošleš ze skriptu, vrací něco jiného, než stejný dotaz vložený přes phpmyadmina. Tam bude nejspíš problém - buď se ty dotazy liší, nebo děláš v php nějakou chybu v jeho volání nebo vyhodnocení. leorond: „Mám to v varchar(255)“ Jestli "to" je řetězec kratší než 256 znaků (a jestli z principu aplikace zajistíš, aby to tak bylo vždy), je to v pořádku. |
||
leorond Profil |
Co se týká připojení k DB, tak mám hlavní index.php kde includuji styl, připojení k DB,... takže tam problém nebude jinak by mi nefungoval připojení nikde.
V DB jsou správné informace a dotaz je také správný, zkoušel jsem samotný dotaz a vypsalo to v pořádku že mail existuje. Zkusím celý skript napsat ještě jednou jen s kontrolou záznamu v DB a uvidíme zda to projde nebo ne. Zajímavé je že pokud upravím script a použiji to s MSSQL s tou samou DB, tak vše proběhne naprosto v pořádku. |
||
Téma pokračuje na další straně.
|
0