Autor | Zpráva | ||
---|---|---|---|
TooFew Profil |
#1 · Zasláno: 20. 7. 2006, 19:21:47
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 |
#2 · Zasláno: 20. 7. 2006, 19:25:11
Proved update a zkontroluj pocet ovlivnenych radku. Pokud bude nula, tak udelas insert. Pokud bude 1, tak skript ukoncis.
|
||
djlj Profil |
#3 · Zasláno: 20. 7. 2006, 19:25:36
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 |
#4 · Zasláno: 20. 7. 2006, 19:29:19
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 |
#5 · Zasláno: 20. 7. 2006, 19:32:42 · Upravil/a: djlj
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 |
#6 · Zasláno: 20. 7. 2006, 19:45:14
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 |
#7 · Zasláno: 20. 7. 2006, 19:46:35
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 |
#8 · Zasláno: 20. 7. 2006, 19:47:50
Hugo
Ano, to máš pravdu. Toto byl jen náčrt ;). Stačí se v manuálu mrknout na číslo chyby při duplicitě... |
||
TooFew Profil |
#9 · Zasláno: 20. 7. 2006, 20:47:24
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 |
#10 · Zasláno: 20. 7. 2006, 20:55:17
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 |
#11 · Zasláno: 20. 7. 2006, 20:57:45
joo. Tak tam bude chyba. Já jsem si těch "hodnot" vůbec nevšiml... Asi jsem už unavený.
|
||
TooFew Profil |
#12 · Zasláno: 20. 7. 2006, 21:06:42 · Upravil/a: TooFew
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 |
#13 · Zasláno: 20. 7. 2006, 21:09:09
TooFew
Ještě upravit WHERE ip=VALUES(ip) na WHERE ip='".$_SERVER['REMOTE_ADDR']."' |
||
TooFew Profil |
#14 · Zasláno: 20. 7. 2006, 21:14:00
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 |
#15 · Zasláno: 20. 7. 2006, 21:28:18 · Upravil/a: TooFew
Ale teď mě napadá, že to values tam asi nemá být...
|
||
TooFew Profil |
#16 · Zasláno: 20. 7. 2006, 21:51:10
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 * |
#17 · Zasláno: 20. 7. 2006, 23:49:39
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á. |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0