Autor | Zpráva | ||
---|---|---|---|
Hello Profil * |
#1 · Zasláno: 14. 1. 2010, 13:03:23
Ahoj, prosímo pomoc při procházení polem. Kvůli zabránění opakovému hlasování chci ukládat ip a číslo položky do db. Následně potřebuji ověřit jestli daná IP k určité položce už nehlasovala. Pokoušel jsem se projít pole pomocí while, ale to hází syntax error. Možná by bylo lepší foreach, ale to neumím. Poradí mi někdo?
$sql = "SELECT id, ipecko FROM ipecka WHERE id = '.$cisloslozky.' AND ipecko = '.$ipecko.'"; $dotaz=mysql_query($sql,$spojeni); if (!$dotaz) die ('Dotaz nedošel'); while($zaznam=mysql_fetch_array($dotaz)) { if ($zaznam[id] == $cisloslozky) && ($zaznam[ipecko] == $ipecko) die('<script>alert("Opakované hlasování není povoleno!")</script>'); } |
||
Majkl578 Profil |
#2 · Zasláno: 14. 1. 2010, 13:06:34 · Upravil/a: Majkl578
Parse error způsobují špatně zapsané závorky podmínky. Následný notice by vypsaly klíče polí.
if ($zaznam[id] == $cisloslozky) && ($zaznam[ipecko] == $ipecko) nahradit za: if ($zaznam['id'] == $cisloslozky && $zaznam['ipecko'] == $ipecko) EDIT: Řešení v [#4] od nightfishe je lepší, neuvědomil jsem si, že daná podmínka je už v SQL dotazu. |
||
radas Profil * |
#3 · Zasláno: 14. 1. 2010, 13:07:20
nevím co píše syntax error ale zkus misto die dat echo....
|
||
nightfish Profil |
#4 · Zasláno: 14. 1. 2010, 13:08:06 · Upravil/a: nightfish
řádky 1 a 2 nechat původní
zbytek nahradit za if (mysql_num_rows($dotaz) > 0) die('<script>alert("Opakované hlasování není povoleno!")</script>'); |
||
Hello Profil * |
#5 · Zasláno: 14. 1. 2010, 13:49:48
nightfish:
Díky, už to prošlo. Taky jsem si nevědomil, že podmínka je vlastně v sql. Ale hned za tím mám tohle a pořád to nechce ukládat. Háže to die, že neuloženo. $sql = "INSERT INTO ipecka VALUES (NULL, '$cisloslozky', '$ipecko', NULL)"; $dotaz=mysql_query($sql,$spojeni); if (!$dotaz) die ('Ipečko neuloženo'); Asi mám vlčí mlhu:-) |
||
lingvik Profil |
#6 · Zasláno: 14. 1. 2010, 14:03:18 · Upravil/a: lingvik
Hello:
Pomohlo by, kdybys napsal, jaké sloupce má tabulka "ipecka". Hádám, že se snažíš nacpat hodnotu NULL do sloupce, který takovou hodnotu nepovoluje. Edit: A nebo pokud je $cisloslozky číselná hodnota (nějaký int nebo co já vím), tak to sletí na tom, protože v tom dotazu to do databáze předáváš jako string. V tom případě je potřeba odstranit apostrofy kolem $cisloslozky. |
||
Hello Profil * |
#7 · Zasláno: 14. 1. 2010, 14:29:27
lingvik:
Jojo, $cisloslozky je int. Já hlava... Díky |
||
Hello Profil * |
#8 · Zasláno: 14. 1. 2010, 14:47:21
Tak už to chodí, ale nefunguje ta kontrola (viz. původní dotaz) Opakovaně to povoluje hodnocení. Nevím, jestli není zase chyba v typu sloupce db nebo typu proměnné.
proměnné: $ipecko = $_SERVER["REMOTE_ADDR"]; $cisloslozky = basename(realpath(dirname(__FILE__) . '/')); db: sloupec id je int(3) a ipecko varchar(10) |
||
fuckin Profil |
#9 · Zasláno: 14. 1. 2010, 14:55:19
Hello:
„ipecko varchar(10)“ Nevím zda je to způsobené tímto (nečetl jsem začátek) ale toto mě opravdu zarazilo. To by mě teda zajímalo, jak jsi zjistil toto číslo. Maximum je 255.255.255.255 tedy 15 znaků. |
||
lingvik Profil |
#10 · Zasláno: 14. 1. 2010, 15:00:17 · Upravil/a: lingvik
Hello:
Asi tak od každého něco. Ten první dotaz je skutečně blbě. Musí být napsaný takto: $sql = "SELECT id, ipecko FROM ipecka WHERE id = $cisloslozky AND ipecko = '$ipecko'"; Potom je potřeba nejen testovat počet řádků, ale ještě předtím i to, jestli dotaz vůbec proběhl správně. Čili původní řádek č.3 z kódu nebrat. Jo a taky varchar(10) pro IP adresu nestačí, protože může mít až 15 znaků. Teď se děje to, že MySQL server příliš dlouhé stringy zkracuje. Když hlasuje někdo z IP adresy 123.456.789.123, tak se uloží jenom '123.456.78'. Ten člověk pak může vesele hlasovat znovu. No a potom už jenom drobnost. Ten první dotaz stačí začít takto: SELECT COUNT(*) FROM ... Jako výsledek dostaneš jedinou hodnotu, kterou je počet řádků. Nemusíš potom používat funkci mysql_num_rows(), ale rovnou tu hodnotu porovnat s nulou. |
||
Hello Profil * |
#11 · Zasláno: 14. 1. 2010, 15:01:29
fuckin:
To je pravda. Neuvědomil jsem si to. Asi proto, že to testuju na locale a tam mám adresu s 9 znaky. Tak jsem to tam dočasně dal. Nicméně to neřeší můj problém. |
||
Lamicz Profil |
#12 · Zasláno: 15. 1. 2010, 06:37:04
lingvik: Hlavne COUNT(*) je u MyISAM tabulek optimalizovane na vykon pro zjisteni poctu radku ;)
|
||
Časová prodleva: 13 let
|
0