Autor Zpráva
Hans225
Profil *
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
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
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
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 *
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
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
Jinak pokud nepotřebujete data z tabulky obrazek, nemusíte ji připojovat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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