Autor | Zpráva | ||
---|---|---|---|
DJ Profil * |
#1 · Zasláno: 25. 9. 2011, 13:50:45
Ahoj,
mám funkci, která počítá, kolik lidí dalo danému článku "Like". Funguje to následovně: pokud už článek nějaký "Like" má, tak už v tabulce (top_likes(id_article,nr_likes)) je. Tudíž je třeba jen zvětšit hodnotu v sloupci nr_like. Takže zjistím pomocí SELECTu počet ($result), zvětším ho o 1 a dám UPDATE. Dá se toto udělat jednodušeji, jen jedním příkazem? A druhá varianta je: pokud článek ještě žádný "Like" předtím nedostal, musí se vytvořit nový záznam v tabulce (odpovídá tomu podmínka else v kódu níže). Funguje to správně, záznam to uloží, ale díky if($result = mysql_result($query,0)) se vypíše warning... Jak se to dá šikovně ošetřit? Děkuji za odpovědi, zde je skript $query = MySQL_Query(" SELECT nr_likes FROM top_likes WHERE id_article = '$id_article' "); if($result = mysql_result($query,0)) { $result++; $query2 = MySQL_Query(" UPDATE top_likes SET nr_likes = '$result' WHERE id_article = '$id_article' "); } else { $query2 = MySQL_Query(" INSERT INTO top_likes VALUES ('$id_article','1') "); } |
||
Tori Profil |
#2 · Zasláno: 25. 9. 2011, 14:01:59
DJ:
Jde to všechno jedním dotazem, předpokládá se UNIQUE index na sloupci id_article (aby se nemohlo vyskytnout dvakrát stejné ID): INSERT INTO top_likes (id_article, nr_likes) VALUES ($id_article, 1) ON DUPLICATE KEY UPDATE nr_likes = nr_likes+1 |
||
DJ Profil * |
#3 · Zasláno: 25. 9. 2011, 15:32:23
Tori:
Paráda. A šlo by něco podobně jednoduchého a krásného i opačně? Tj. nr_likes o jedno zmenšit (pokud je nr_likes>1), v případě, že je tam like jen jeden, tak rovnou smazat řádek? |
||
DJ Miky Profil |
#4 · Zasláno: 25. 9. 2011, 18:48:42 · Upravil/a: DJ Miky
Jde to vyřešit dvěma dotazy:
UPDATE top_likes SET nr_likes = nr_likes - 1 WHERE id_article = 123 AND nr_likes > 1 LIMIT 1 A následně, pokud mysql_affected_rows() vrátí nulu (nr_likes je rovno jedné nebo záznam pro článek 123 vůbec neexistuje), zavolat: DELETE FROM top_likes WHERE id_article = 123 AND nr_likes <= 1 LIMIT 1 Tím se zavolá jeden až dva dotazy podle situace. |
||
Časová prodleva: 13 let
|
0