Autor Zpráva
turtle
Profil *
Ahoj
Potřeboal bych pomoct s měněním hodnot v databazi.
Když se mi na webu registruje nějaký uživatel tak po něm vyžduji aktivaci pře email a tady mi nastává chyba.
Když se klikne na potvrzujici odkaz tak pokud účet aktivuje po více jak hodině tak se místo aktivace má účet smazat a vyhodit to hlášku. Problémje v tom že hláške se vyhodí vždy a účet to z databáze nesmaže.

skript:

    $query2 = mysql_query("SELECT * FROM `users` WHERE `id`=$uid AND `activation`='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 3600");
    if(mysql_num_rows($query2)==1){
    $query3 = mysql_query("DELETE * FROM `users` WHERE `id`=$uid AND `activation`=0");
    echo"uplynulo více jak 1 hodina opakujte registraci";
    }else{
            $query1 = mysql_query("UPDATE `users` SET `activation`=1 WHERE `id`='".$uid."'");
            if(!$query1) { echo mysql_error() . " - " . mysql_errno(); }
            else {
                echo "Váš e-mail byl úspěšně potvrzen, teď se můžete <a href=\"index.php\">přihlásit</a>.";
            }}
Předem díky za pomoc
Keeehi
Profil
Zpětné apostrofy kolem date v prvním dotazu?
turtle
Profil *
přidal jsem za všechny mysql query - or die(mysql_error()); a nyní mi to hlasi error :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM `users` WHERE `id`=37 AND `activation`=0' at line 1
Monkeys
Profil *
turtle:
Premenne v dotazoch sa mozu / davaju do spicatych zatvoriek.

napr.
$query2 = mysql_query("SELECT * FROM users WHERE id={$uid} .....");

M.
turtle
Profil *
Monkeys:
bohužel nepomohlo
Alphard
Profil
Monkeys [#4]:
Smysl těchto závorek je např. tam, kde mají bezprostředně za názvem proměnné pokračovat alfanumerické znaky. Bez zárovek by interpret nepoznal, co je název proměnné a co už je součástí řetězce. Pokud po názvu proměnné následuje (nejen) bílý znak, není k tomu důvod.

turtle [#3]:
Do syntaxe delete nepatří * (není k tomu důvod, vždy se maže celý záznam).
lionel messi
Profil
Najväčším problémom je chybná syntax DELETE dotazu.

Správna verzia:
$query3 = mysql_query("DELETE FROM `users` WHERE `id`=$uid AND `activation`=0"); //skutočne bez hviezdičky!

Pardon, Alphard bol o 11 sekúnd rýchlejší a dodal i vysvetlenie.
turtle
Profil *
neco jse tam pozmenil a nyni error vypada takto:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`='37' AND `activation`='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`date`) > 3600' at line 1
Keeehi
Profil
Že jsi něco pozměnil je hezké ale bylo by ještě hezčí, kdybys nám to tu i ukázal. Chyba bude nejspíše před tím co se objevilo v chybové hlášce.
turtle
Profil *
současná podoba skriptu:
$z="0";
$o="1";
$query2 = mysql_query("SELECT * FROM `users` WHERE id`='".$uid."' AND `activation`='".$z."' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`date`) > 3600")or die(mysql_error());
    if(mysql_num_rows($query2)==1){
    $query3 = mysql_query("DELETE FROM `users` WHERE id`='".$uid."' AND `activation`='".$z."'")or die(mysql_error());
    echo"uplynulo více jak 1 hodina opakujte registraci";
    }else{
            $query1 = mysql_query("UPDATE $DB.users SET `activation`='".$o."' WHERE `id`='".$uid."'");
            if(!$query1) { echo mysql_error() . " - " . mysql_errno(); }
            else {
                echo "Váš e-mail byl úspěšně potvrzen, teď se můžete <a href=\"index.php\">přihlásit</a>.";
            }}
lionel messi
Profil
turtle:
$query2 = mysql_query("SELECT * FROM `users` WHERE `id`='".$uid."' AND `activation`='".$z."' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`date`) > 3600")or die(mysql_error());

Presne ako predpokladal Keeehi. Pred názvom stĺpca ti chýba spätný apostrof.
turtle
Profil *
tak error konecne zmizel a pri vyskoceni hlasky se zaznam z databaze vymaze ale porad se mi deje to ze hlaska vyskakuje nehlede na to ze provadim aktivaci behem nekolika vterin
Keeehi
Profil
turtle:
A ve sloupci date máš co? Nebo jakého je vlastně typu? INT, DATE, DATETIME, TIMESTAMP? Když už pracuješ s časovými značkami nebylo by vhodné mít k tomu i odpovídající datový typ?

Možná nefunguje správně ten rozdíl. S funkcemi UNIX_TIMESTAMP() jsem nikdy nepracoval a zkoušet se mi to nechce. Co se ti vlastně vrátí když si nad databází spustíš
SELECT `date`, UNIX_TIMESTAMP() as now, UNIX_TIMESTAMP(`date`) as past, UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`date`) as difference FROM `users` WHERE `activation`= 0 LIMIT 5;

A nebo na slepo zkus. Mělo by to dělat to stejné jen je to jinak zapsané.
TIMESTAMPDIFF(SECOND, `date`, NOW()) > 3600

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: