Autor Zpráva
TooFew
Profil
Mám tabulku se strukturou cislo int, ip varchar(20) a další...
Potřebuju, aby se mi do ní vložil nový záznam, pokud script nenajde ip návštěvníka ve sloupci ip. Pokud jo, aby zvětšil cislo v řádku u té IP o1. Jak na to? Díky.
Hugo
Profil
Proved update a zkontroluj pocet ovlivnenych radku. Pokud bude nula, tak udelas insert. Pokud bude 1, tak skript ukoncis.
djlj
Profil
mysql_query("INSERT INTO ip.....");

if(mysql_errno()>0){

mysql_query("UPDATE ...");

}


IP adresu si v tabulce nastav jako unikátní (jinak to nebude fungovat).
TooFew
Profil
djlj
Ten kód nechápu. Ono to přece udělá insert, a pokud mysql_errno() (funkci neznám) bude kladné, provede update. Ale insert se provede pokaždé. I když tam ta IP už je. Ne?
A jak si ji nastavím jako unikátní? Já jsem v tomto amatér, takže prosím vysvětlení nebo přiblížení. Díky.
djlj
Profil
Ale insert se provede pokaždé. I když tam ta IP už je.
Jasně, ale pokud bude IP unikátní (tedy, že může být v daném sloupci každá hodnota jen jednou), nic se do databáze nevloží a mysql_errno (vrací číslo chyby při posledním dotazu na MySQL) bude větší než nula..

Unikátnost nastavíš buď kli¨knutím na "Unikátní", nebo sql dotazem:

ALTER TABLE `tabulka` ADD UNIQUE (`ip`)
Hugo
Profil
djlj

Toto ale neni moc rozumne reseni, protoze mysql muze zahlasit chybu i z jineho duvodu nez je duplicita. Prinejmensim je rozumne bud porovnavat cislo chyby nebo parsovat chybovou hlasku.
koudi
Profil
Udělal bych asi jednodše takhle (musíš mít ip jako unique):
INSERT INTO tabulka (cislo,ip) VALUES (hodnota1, hodnota2) ON DUPLICATE KEY UPDATE cislo = cislo +1 where ip=VALUES(ip)

Pokusí se to vložit a pokud tam už je, tak to updatuje. Takhle nějak to bude (psáno narychlo z hlavy).
djlj
Profil
Hugo
Ano, to máš pravdu. Toto byl jen náčrt ;). Stačí se v manuálu mrknout na číslo chyby při duplicitě...
TooFew
Profil
koudi

Ten zápis tam můžu vložit beze změn? Jde o to, že mi nefunguje. A ip by podle všeho měly být nastavené jako unikátní.
DJ Miky
Profil
TooFew

Ne, nemůžeš. Musíš si upravit názvy tvých sloupců, místo hodnota1 a hodnota2 dosadit hodnoty, které tam chceš vkládat...
TooFew
Profil
joo. Tak tam bude chyba. Já jsem si těch "hodnot" vůbec nevšiml... Asi jsem už unavený.
TooFew
Profil
No takže když to vytrhnu přímo ze zdrojáku, vypadá to tako:

mysql_query("INSERT INTO visitors (uses, ip, browser, os, time)
VALUES (1,'$REMOTE_ADDR','$nav_name','$os_name','$visit_time')
ON DUPLICATE KEY UPDATE uses=uses+1 WHERE ip=VALUES(ip)");

A to mi nefunguje. Na mysql.wz.cz v administraci jsem klikl na "U" s titulkem "unique".
Vypisuju to tu, protože uz fakt nevím.
DJ Miky
Profil
TooFew
Ještě upravit WHERE ip=VALUES(ip) na WHERE ip='".$_SERVER['REMOTE_ADDR']."'
TooFew
Profil
Nejde. Ale tam přece bylo VALUES(ip), takže by tam spíše mělo být VALUES($REMOTE_ADDR) ne?
Nicméně ani to nefunguje. :-(
TooFew
Profil
Ale teď mě napadá, že to values tam asi nemá být...
TooFew
Profil
Mám to. Hodně jsem se v této diskusi přiučil, nicméně jsem vymyslel neco jiného:

$select=mysql_query("SELECT * FROM visitors");
$ips=mysql_fetch_array($select);
$rows=mysql_num_rows($select);

$i=0;
while($i<=$rows) {
if($REMOTE_ADDR==$ips["ip"]) {
mysql_query("UPDATE visitors set uses=uses+1 WHERE ip='$REMOTE_ADDR'");
break;
} else {
mysql_query("INSERT INTO visitors (uses, ip, browser, os, time)
VALUES (1,'$REMOTE_ADDR','$nav_name','$os_name','$visit_time')");
break;
}
$i++;
}

Ovšem jsem Vám vděčný za rady, kterými jsem si rožšířil znalosti SQL.
Kajman_
Profil *
Dovolil jsem si toto téma na chvíli odemknout pro budoucí čtenáře vložit poznámku...

Poslední uváděné řešení prosím nikdy nepožívejte, je to programátoská zhovadilost.

Dříve dvě navrhnutá řešení (djlj,koudi) jsou naopak smysluplná.
Toto téma je uzamčeno. Odpověď nelze zaslat.