Diskuze: Hledání v databázi pomocí tagů

PHP PHP Hledání v databázi pomocí tagů American English version English version

Avatar
enes.vint
Člen
Avatar
enes.vint:

Dobry den,

co presne chci udelat -> uzivatel napise prispevek, ktery otaguje (tagy oddeleny carkou, tudiz v mysql databazi neco jako 'tag1, tag2, tag3...'. Pote chci, aby byl schopny uzivatel prispevek podle tagu najit. Absolutne netusim, jak na to a zatim jsem prisel pouze na toto reseni:

function searchTags()
                        {

                        $prikaz = "SELECT tags FROM rocidea";
                        $res = mysqli_query($db,$prikaz);
                        while($row = mysqli_fetch_array($res))
                        {
                                $tG = explode(',',$row['tags']);
                                if ($tG != null)
                                {
                                        for($i = 0; $i <= count($tG); $i++)
                                        {
                                                $prikaz1 = "SELECT name, surname, header, idea, anon, datum, rating FROM rocidea WHERE tags = '$tG[$i]'";
                                                $res1 = mysqli_query($db,$prikaz1);
                                                while($row1 = mysqli_fetch_array($res1))
                                                {
                                                        $datum = $row1['datum'];
                                                        if($row['anon'] == "no")
                                                        {
                                                                echo "<div class='obal'><div class='hhEE'>" . $row1['header'] . "</div><div class='idea'>" . $row1['idea'] . "</div><div class='info'>Autor: ".$row1['name'] . " " . $row1['surname'] . "<br>Datum: " . $datum . "<div class'rat'>- ".$row1['rating']." +</div></div></div>";
                                                        }
                                                        else
                                                        {
                                                                echo "<div class='obal'><div class='hhEE'>" . $row1['header'] . "</div><div class='idea'>" . $row1['idea'] . "</div><div class='info'>Anonymní autor<br>Datum: " . $datum . "<div class'rat'>- ".$row1['rating']." +</div></div></div>";
                                                        }
                                                }
                                        }
                                }
                        }
                        }

Bohuzel, nefunguje. Nezobrazi nic... Zacinam byt zoufaly. Ma nekdo nejaky napad?

 
Odpovědět 3.6.2015 20:07
Avatar
Fredep
Redaktor
Avatar
Odpovídá na enes.vint
Fredep:

Mohl bys zkusit spustit dotaz typu

SELECT * FROM rocidea WHERE tags LIKE '%, foo,%' OR tags LIKE 'foo,%' OR tags LIKE '%, foo' OR tags LIKE 'foo'

Pokud jsem ho napsal správně, tak ti vrátí všechny položky s tagem foo, ale je zde problém, že seznam tagů musí být přesně oddělený čárkami a mezerami, tedy

tag1, tag2, tag3, posledniTag

Ten dotaz je trochu krkolomný, neboť se hledaný tag může nacházet i na krajích, nebo může být samostatný (možná na to bude lepší dotaz, ale prozatím stačí a je to jen SQL).

Editováno 3.6.2015 20:24
Nahoru Odpovědět 3.6.2015 20:23
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
Odpovídá na enes.vint
Martin Konečný (pavelco1998):

Ahoj,

abys nemusel vymýšlet taková podivná řešení, neukládej ty tagy jako jeden string do jednoho záznamu, ale 1 tag = 1 záznam v databázi.
Pak to můžeš i naJOINovat apod :)

 
Nahoru Odpovědět 3.6.2015 20:23
Avatar
enes.vint
Člen
Avatar
Odpovídá na Fredep
enes.vint:

@Fredep: Diky moc, problem je v tom, ze 'foo' by mela byt promenna - vstup od uzivatele. Mohl bych to vyresit takto?

SELECT * FROM rocidea WHERE tags LIKE '%, $foo[$i],%'

?

Uprimne tomu vubec nerozumim. Zbytek prace s databazi funguje, jen tohle proste ne a ne...

@pavelco1998
tzn pri kazdem vkladani do databaze vlozit tolik radku, kolik je tagu? Joinovat neumim...

 
Nahoru Odpovědět 3.6.2015 20:38
Avatar
Fredep
Redaktor
Avatar
Odpovídá na enes.vint
Fredep:

Ano, prostě všechny čtyři foo nahradíš proměnnou, tak jak jsi to dělal předtím (nezapomeň ji ošetřit proti SQL injection!).

EDIT: To foo je jen ukázka, takže místo něj dej proměnnou..

$tag = "odUzivatele";
$prikaz = "SELECT * FROM rocidea WHERE tags LIKE '%, $tag,%' OR tags LIKE '$tag,%' OR tags LIKE '%, $tag' OR tags LIKE '$tag'";
Editováno 3.6.2015 20:53
Nahoru Odpovědět 3.6.2015 20:50
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
enes.vint
Člen
Avatar
Odpovídá na Fredep
enes.vint:

Omlouvam se, ale bohuzel jsem to nedokazal zprovoznit ani takhle. Hodim sem cely php skript... zadny error ani notice to nehazi, proto je to zvlastni.

<?php
        $tags = "";
        $sent = false;
        include('prihlaseni.php');
        $db = mysqli_connect($server,$login,$password,$database);
        if(!$db)
        {
                die("Selhalo, chyba");
        }
        mysqli_query($db, "SET CHARACTER SET utf8");
        if(isSet($_POST["find"]))
        {
                if(isSet($_POST["tag"]) && $_POST["tag"]!="")
                {
                        $sent = true;
                }
        }
        if($sent)
        {
                $tags = $_POST["tag"];
        }
        function searchTags()
       {

                        $prikaz = "SELECT tags FROM rocidea";
                        $res = mysqli_query($db,$prikaz);
                        while($row = mysqli_fetch_array($res))
                        {
                                $tG = trim(explode(',',$row['tags']));
                                if ($tG != null)
                                {
                                        for($i = 0; $i <= count($tG); $i++)
                                        {
                                                $prikaz1 = "SELECT name, surname, header, idea, anon, datum, rating FROM rocidea WHERE tags LIKE '%, $tag[$i],%' OR tags LIKE '$tag[$i],%' OR tags LIKE '%, $tag[$i]' OR tags LIKE '$tag[$i]'";
                                                $res1 = mysqli_query($db,$prikaz1);
                                                while($row1 = mysqli_fetch_array($res1))
                                                {
                                                        $datum = $row1['datum'];
                                                        if($row['anon'] == "no")
                                                        {
                                                                echo "<div class='obal'><div class='hhEE'>" . $row1['header'] . "</div><div class='idea'>" . $row1['idea'] . "</div><div class='info'>Autor: ".$row1['name'] . " " . $row1['surname'] . "<br>Datum: " . $datum . "<div class'rat'>- ".$row1['rating']." +</div></div></div>";
                                                        }
                                                        else
                                                        {
                                                                echo "<div class='obal'><div class='hhEE'>" . $row1['header'] . "</div><div class='idea'>" . $row1['idea'] . "</div><div class='info'>Anonymní autor<br>Datum: " . $datum . "<div class'rat'>- ".$row1['rating']." +</div></div></div>";
                                                        }
                                                }
                                        }
                                }
                        }
       }

?>
 
Nahoru Odpovědět 3.6.2015 21:09
Avatar
misaj
Člen
Avatar
Odpovídá na enes.vint
misaj:

Kde volá funkce "searchTags" ?

 
Nahoru Odpovědět 3.6.2015 21:22
Avatar
enes.vint
Člen
Avatar
enes.vint:
if(isSet($_POST["tag"]) && $_POST["tag"]!="")
               {
                       $sent = true;
                       searchTags();
               }

Tady. Trochu jsem to upravoval a to z toho vypadlo, pardon

 
Nahoru Odpovědět 3.6.2015 21:23
Avatar
Odpovídá na enes.vint
Martin Konečný (pavelco1998):

Myslím, že by bylo lepší, kdyby jeden tag byl jeden záznam. Mimo jiné by to mělo i dodržovat normální formu.

Pokud chápu správně to, co chceš udělat, pak s použitím JOIN by to bylo celkově jednodušší, např.:

SELECT `rocidea`.`name`, `rocidea`.`surname`, `rocidea`.`header`, ...
FROM `rocidea`
INNER JOIN `rocidea_tag`
ON `rocidea_tag`.`rocidea_id` = `rocidea`.`id`
WHERE `rocidea_tag`.`tag` IN ('tag1', 'tag2', tag3')

// tento dotaz vyžaduje následující tabulky

[rocidea] (
  id,
  name,
  surname,
  header,
  ...
)

[rocidea_tag] (
  id,
  rocidea_id   -- relace na daný příspěvek,
  tag
)

Pokud neznáš spojování tabulek, pak doporučuji se na to podívat.

Editováno 3.6.2015 21:33
 
Nahoru Odpovědět 3.6.2015 21:32
Avatar
Odpovídá na enes.vint
Michal Šmahel (ceskyDJ):

Kde máš založenou proměnnou $tag??

Nahoru Odpovědět 3.6.2015 21:32
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.