Diskuze: Hledání v databázi pomocí tagů
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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).
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
@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...
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'";
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>";
}
}
}
}
}
}
?>
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.
Zobrazeno 10 zpráv z 10.