« 1 2 »
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
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
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
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
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
Právě že to nevrací žádný výsledek, jako kdyby zadaná mailová adresa v DB neexistovala ale přitom v DB existuje.
mimochodec
Profil
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
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
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
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
Ok zkusil jsem a dostal výsledek SELECT mail FROM uzivatele WHERE mail='josifek.dvori@seznam.cz'
Dan Charousek
Profil
leorond:
A když to spustíš v PHPMyAdmin tak ti to vrátí požadovaný řádek? Pokud ano, tak je chyba jinde.
leorond
Profil
Ano phpmyadmin vrací to co má, najde a vypíše mi mailovou adresu
Keeehi
Profil
Tak za tím dotazem skus vypsat chyby.
var_dump(mysql_errno());
leorond
Profil
Keeehi: je možné že mi to píše int(0)?


tedy pokud to vložím do toho příkazu z [#11], pokud to vložím do kódu v [#1] tak vůbec nic.
Keeehi
Profil
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
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
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
Jsem v koncích, už nevím co víc zkusit.
Dan Charousek
Profil
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
Napadá mě jen, může být problém v DB? Mám to v varchar(255)
Dan Charousek
Profil
leorond:
Může a nemusí. Vím, že je to mnohdy komplikované zdlouhavé debuggovat delší/složitější kód, ale my víme tolik co ty, možná i míň, protože ty apsoň vidíš, jak se ten kód chová. Tím, že se nás tu budeš vyptávat, v čem dalším by mohl být problém jen deleguješ svou práci, kterou bys potřeboval na odhalení chyby na nás. To o nic efektivnější nebude, ba naopak, zde po diskusi spíš neefektivní. Zkus is pročíst ten článek, třeba tě to někam posune.
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.
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: