| 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: 13 let
|
|||
0