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());
        } 
    }
?>
Tabulka má dva sloupce
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
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
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
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
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
spacek145:
Nejčastější potíže s PHP (FAQ) » Chyba „Parse error: syntax error, …“
www.php.net/function.mysql_real_escape_string
spacek145
Profil
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
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í

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:

0