Autor | Zpráva | ||
---|---|---|---|
Hans225 Profil * |
#1 · Zasláno: 11. 6. 2012, 23:25:29
Zdravím, prosil bych o kontrolu útržku kódu níže. Cíle má být vkládání tagů a to takový počet, kolik uživatel zadá, ty by se pak měly každý zvlášť uložit do tabulky, ale nestane se tak.
Jinak echo v pořádku všechny zadané tagy vypíše. Děkuji za pomoc. if (isset($_POST['tags'])){ $tags = explode(",", $_POST['tags']); for ($x = 0; $x < count($tags); $x++){ mysql_query("INSERT INTO tags (tag) VALUES({$tags[x]})"); echo $tags[$x] . "<br>"; } } |
||
Tori Profil |
0. Escapujte vkládaná data (mysql_real_escape_string).
1. Kdybyste použil mysql_error(), dozvěděl byste se, že sloupec toho jména v tabulce neexistuje - okolo každé hodnoty mají být uvozovky. 2. Dá se vkládat více řádků naráz (koukněte se na syntax do manuálu), takže v tom cyklu si jen poskládejte dotaz a proveďte ho až za cyklem. Šlo by to ostatně i bez cyklu, jen pomocí implode nebo preg_replace. |
||
Someone Profil |
#3 · Zasláno: 11. 6. 2012, 23:40:16
Místo cyklu for bych použil foreach a upravil bych dotaz
foreach ($tags as $tag) { mysql_query("INSERT INTO tags (tag) VALUES('".$tag."')"); } |
||
Majkl578 Profil |
#4 · Zasláno: 12. 6. 2012, 02:18:05 · Upravil/a: Moderátor (editace znemožněna) 12. 6. 2012, 10:46:22
Hmm, tohle patří spíš do kategorie PHP.
[#3] Someone: I přes upozornění od Tori v [#2] neescapuješ data od uživatele vkládaná do SQL dotazu. Zde by se dost možná hodil spíše multi insert (1 dotaz místo N). Ono ale celé řešení mírně zavání, otázka je, jak se na klientské straně plní $_POST['tags'] . Pokud to uživatel zadává ručně, určitě bych ošetřil možné mezery za čárkou (ať už trim na jednotlivé hodnoty nebo preg_split). V databázi by se pak přidal unikátní index na sloupec tag.
|
||
Someone Profil |
#5 · Zasláno: 12. 6. 2012, 11:12:05
Majkl578:Všimni si, že jsem svůj příspěvek odeslal sekundu po tom příspěvku od Tori. Pak už jsem to neřešil, protože to Tori uvedla na pravou míru.
|
||
Hans225 Profil * |
#6 · Zasláno: 13. 6. 2012, 21:17:43
Díky všem za odpovědi, již to funguje.
Zatím jsem to tedy udělal takhle: foreach ($tags as $tag) { $tag = mysql_real_escape_string($tag); mysql_query("INSERT INTO tags (tag, q_id) VALUES('".$tag."','$aktualne')") or die("Nelze:" . mysql_error()); } Jinak uživatel bude zadávat tagy klasicky do textového pole a bude oddělovat čárkami (později bych chtěl enterem jako ve Wordpressu). Čerpal jsem hlavně z http://stackoverflow.com/questions/1854886/php-mysql-how-to-add-multiple-tags Nyní mám ovšem problém, když to chci vypsat: v tabulce "obrazek" mam uložene informace o nahraném obrázku a v tabulce "tags" mám právě ty jednotlivé tagy. Snažím se to vydolovat pomocí tohoto kódu (sloupec "pridano" obsahuje timestamp a každý tag má rovněž přidán timestamp obrázku, ke kterému se vztahuje, ten je uložený ve sloupci "q_id"): <?php $tagy_img = mysql_query("SELECT tags.tag,tags.q_id FROM tags,obrazek WHERE tags.q_id = obrazek.pridano") or die("Nelze:" . mysql_error()); while ($zaznam1 = MySQL_Fetch_Array($tagy_img)): echo $zaznam1["tag"]; endwhile; ?> Nicméně takto se mi vypíší veškeré tagy. Chtěl bych ale logicky jen vypsat tagy patřící k danému obrázku. Hodnoty v databázi souhlasí. Nějaké nápady? Opět děkuji. |
||
Tori Profil |
#7 · Zasláno: 14. 6. 2012, 21:54:52
Hans225:
„Chtěl bych ale logicky jen vypsat tagy patřící k danému obrázku“ Tak to přidejte do podmínky v dotazu: ...WHERE tags.q_id = obrazek.pridano AND tags.q_id = $id_obrazku |
||
Časová prodleva: 12 let
|
0