Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

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

Aktivity (1)
Avatar
enes.vint
Člen
Avatar
enes.vint:3.6.2015 20:07

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:3.6.2015 20:23

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):3.6.2015 20:23

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
enes.vint
Člen
Avatar
Odpovídá na Fredep
enes.vint:3.6.2015 20:38

@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:3.6.2015 20:50

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:3.6.2015 21:09

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:3.6.2015 21:22

Kde volá funkce "searchTags" ?

 
Nahoru Odpovědět 3.6.2015 21:22
Avatar
enes.vint
Člen
Avatar
enes.vint:3.6.2015 21:23
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):3.6.2015 21:32

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na enes.vint
Michal Šmahel (ceskyDJ):3.6.2015 21:32

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.