Autor Zpráva
MrMuffin53
Profil *
Zdravím,

v PHP jsem ještě začátečník, největší problémy mi dělá SQL. Snažím se napsat skritp, který uživateli s ID předaným přes GET vygeneruje náhodně heslo a v MD5 ho uloží do databáze. Aktuální kód vypadá takto :
...
$password_hash = MD5( rand(10000,99999) );

mysql_query("INSERT INTO users (`password`) WHERE `id`=`".$_GET['id']."` VALUES(`".$password_hash."`) ") or die(mysql_error());
mysql_close();
...

Prohlížeč mi ale vyhazuje hlášku :
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 'WHERE `id`=`146` VALUES(`7f062e654e2ef93d0f5a8dda92877138`)' at line 1

Proto bych se rád zeptal, kde mám chybu, případně jak ji opravit. Děkuji mnohokrát
David Klouček
Profil
Při vkládání nemůžeš používat WHERE. Nehledáš spíš update?

mysql_query("UPDATE users SET `password`='".$password_hash."' WHERE `id`=".intval($_GET['id'])) or die(mysql_error());

Funkce intval() je tam proti SQL injekci. Jinak mysql_* funkce jsou zastaralý, měl bys používat mysqli_* nebo PDO. Já ale v tom případě už rovnou doporučuju přejít na nějakej DB layer - třeba NotORM.
Radek9
Profil
MrMuffin53:
Pro SQL stringy se nepoužívají zpětné uvozovky, ale rovné (jednoduché). Tedy tyto: 'řetězec'.
MrMuffin53
Profil *
Díky moc, už to pracuje správně.
juriad
Profil
Radek9:
A string is a sequence of bytes or characters, enclosed within either single quote (“'”) or double quote (“"”) characters. Examples:
'a string'
"another string"
http://dev.mysql.com/doc/refman/5.0/en/string-literals.html
Radek9
Profil
juriad:
Ok, že jdou použít i dvojité, jsem netušil. Každopádně jsem hlavně upozorňoval na ten fakt, že MrMuffin53 použil zpětné, které jsou určené pro názvy.
Jan Tvrdík
Profil
Pro jistotu zmíním pár věcí ohledně bezpečnosti:

1) Funkce rand není kryptograficky bezpečný generátor náhodných čísel, takže je pro generování náhodných hesel velmi nevhodná. Lépe je použít např. openssl_random_pseudo_bytes.
2) Funkce md5 není vhodná pro hashování hesel, viz např. dokumentace. Lépe je použít funkci password_hash.

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: