Autor | Zpráva | ||
---|---|---|---|
spacek145 Profil |
Dobrý den, mám následující kód, ale nefunguje mi v něm zápis do databáze a aktualizace údajů. Co tam mám blbě? Potřeboval bych, aby se po odeslání formulare zapsalo jmeno z inputu do MYSQL a pridelil se mu pocet "1". Pokud by stejne jmeno zadal podruhe, jmeno v db by bylo stejne ale pocet by se zvedl na "2". Toto by šlo provést každé dvě hodiny. Jak na to? Pomůžete mi :) Díky
<?php header("Content-Type: text/html; charset=windows-1250"); ?> <form method="post"> <label for="nick"><b>Nick:</b></label> <input type="text" name="nick"> <input type="submit" name="submit"> </form> <?php $nick = $_POST[nick]; if(isset($_POST[submit])) { mysql_connect("hostitel", "jmeno", "heslo") or die("DB Connection Failed. ".mysql_error()); mysql_select_db("jmenodb") or die(mysql_error()); if(!$nick) { $sql = mysql_query("SELECT * FROM hlasovani WHERE nick='".$nick."'") or die(mysql_error()); if (mysql_num_rows($sql) == 0) { mysql_query("INSERT INTO hlasovani(count, nick) VALUES ('0', '".$nick."', '')") or die(mysql_error()); } $sql = mysql_fetch_array($sql); $count = $sql['count'] + 1; mysql_query("UPDATE hlasovani SET count=".$count." WHERE nick = '".$nick."'") or die(mysql_error()); } } ?> Mělo by se to zapisovat takto: ----------------------------------- COUNT / NICK ---------------------------------- 5 franta a při každém odeslání stejného jména aktualizovat. |
||
soucekgns Profil |
#2 · Zasláno: 29. 3. 2013, 09:34:22
Předpokládám, že $nick má nějakou hodnotu, tj. negace $nick ti vyhodí false a podmínka nebude probíhat
-> na řádku 15 odstraň ! |
||
Jan Tvrdík Profil |
#3 · Zasláno: 29. 3. 2013, 09:37:33
spacek145:
Chybí ti uvozovky okolo klíčů v poli. Není to $_POST[nick] ale $_POST['nick'] . Bez uvozovek to funguje jen historickou shodou náhod a navíc to vyhazuje chybu úrovně E_NOTICE .
|
||
spacek145 Profil |
#4 · Zasláno: 29. 3. 2013, 09:38:22
Když to odešlu, nic se nezapíše a ukáže se toto:
Column count doesn't match value count at row 1 |
||
Jan Tvrdík Profil |
A rovnou si doplň i ošetření proměnné
$nick pomocí mysql_real_escape_string. Teď jde ten skript napadnou pomocí SQL injection.A pak to stejně můžeš v podstatě zahodit, takhle to nemůže nikdy fungovat. Správné řešení je mít unikátní (nebo primární) klíč nad sloupcem `nick` a použití dotazu
mysql_query(" INSERT INTO `hlasovani` (`count`, `nick`) VALUES(0, '" . mysql_real_escape_string($nick) . "') ON DUPLICATE KEY UPDATE `count` = `count` + 1 ") |
||
spacek145 Profil |
<?php $nick = $_POST['nick']; if(isset($_POST[submit])) { mysql_connect("mysql udaje") or die("DB Connection Failed. ".mysql_error()); mysql_real_escape_string($nick)); mysql_select_db("jmeno") or die(mysql_error()); if($nick) { $sql = mysql_query("SELECT * FROM hlasovani WHERE nick='".$nick."'") or die(mysql_error()); if (mysql_num_rows($sql) == 0) { mysql_query("INSERT INTO hlasovani(count, nick) VALUES ('0', '".$nick."', '')") or die(mysql_error()); } $sql = mysql_fetch_array($sql); $count = $sql['count'] + 1; mysql_query("UPDATE hlasovani SET count=".$count." WHERE nick = '".$nick."'") or die(mysql_error()); } } ?> |
||
soucekgns Profil |
#7 · Zasláno: 29. 3. 2013, 09:47:23
spacek145:
„('0', '".$nick."', '')")“ Proč tam máš 3 hodnoty místo 2? Který řádek je 14.? Jan Tvrdík: „ošetření proměnné $nick pomocí mysql_real_escape_string“ Již deprecated, už radši použijte msqli |
||
Jan Tvrdík Profil |
#8 · Zasláno: 29. 3. 2013, 09:47:35
|
||
spacek145 Profil |
#9 · Zasláno: 29. 3. 2013, 09:55:25
Děkuji za rady. Ještě, mohu poprosit o malé ošetření, že na 1 IP adresu půjde formular odesilat 1x za 2 hodiny?
|
||
soucekgns Profil |
#10 · Zasláno: 29. 3. 2013, 10:03:58
spacek145:
Tak to si vytvoř další tabulku s IP adresama a timestamp, pak už jen ověř, že pokud se v tabulce vyskytuje jeho IP, tak že timestamp +2 hodiny je menší než aktuální |
||
Časová prodleva: 11 let
|
0