Autor Zpráva
Hello
Profil *
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
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 *
nevím co píše syntax error ale zkus misto die dat echo....
nightfish
Profil
řá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 *
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
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 *
lingvik:
Jojo, $cisloslozky je int. Já hlava... Díky
Hello
Profil *
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
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
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 *
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
lingvik: Hlavne COUNT(*) je u MyISAM tabulek optimalizovane na vykon pro zjisteni poctu radku ;)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0