| Autor | Zpráva | ||
|---|---|---|---|
| Mysqlnovacek Profil * |
#1 · Zasláno: 9. 10. 2011, 15:37:06
Ahoj,
byl bych moc rád, kdybyste mne navedli nebo pomohli se složením mysql dotazu, jelikož se teprve učím a rád bych viděl, jak se daná situace řeší. Ukážu to na příkladu: Mám tabulku PRODUCT a tabulku CATEGORY. Každý produkt je zařazen v nějaké kategorii struktura vypadá následovně: PRODUCT: id | name | slug| category_id a nejaka data v teto tabulce: 1 | Kolotoč | kolotoc | 1 2 | Koloběžka | kolobezka | 2 CATEGORY: id | name | slug a nejaka data v teto tabulce: 1 | Atrakce | atrakce 2 | Zábava | zabava Problém je následující. Mám stránku, kde znám jen CATEGORY.slug a na základě toho potřebuji vybrat veškeré produkty, které se v této kategorii nalézají. Řešení, které jsem napsal asi není to pravé ořechové předpokládám: <?php
// osetreni dotazu zatim neresme
$slug = $_GET['slug'];
$categories = mysql_query('SELECT id FROM category WHERE slug = "'.$slug.'"');
while ($category= mysql_fetch_object($categories)) {
$products = mysql_query('SELECT * FROM products WHERE category_id = '.$category->id.'');
}
while ($product = mysql_fetch_object($product)) {
echo $product->name;
}
?>Lze to zapsat nějak rozuměji než takto nehezkým "vnořeným" mysql dotazem ve while? Děkuji za každou radu. |
||
| o_O Profil |
#2 · Zasláno: 9. 10. 2011, 15:40:57 · Upravil/a: o_O
Mysqlnovacek:
if(!isset($_GET['slug']))
die("Chyba");
$products=mysql_query("SELECT p.* FROM products p LEFT JOIN category c ON (c.id=p.category_id) WHERE c.slug='".mysql_real_escape_string($_GET['slug'])."'");mysql_real_escape_string -> Ošetření proti SQL injection. Mimochodem ve Vašem případě si proměnnou $products neustále přepisujete. Šlo by to udělat i jednodušeji: // osetreni dotazu zatim neresme
$slug = $_GET['slug'];
$id_kategorii=array();
$categories = mysql_query('SELECT id FROM category WHERE slug = "'.$slug.'"');
while ($category= mysql_fetch_object($categories)) {
$id_kategorii[]=$category->id;
}
$product=mysql_query('SELECT * FROM products WHERE category_id IN ('.implode(",",$id_kategorii).')');
while ($product = mysql_fetch_object($product)) {
echo $product->name;
} |
||
| Mysqlnovacek Profil * |
#3 · Zasláno: 9. 10. 2011, 16:25:00
Ahoj,
děkuji Vám za příklad s left join, funguje to hezky, už tomu rozumím. Jinak ve zmíněném příkladě si $products nepřepisuji, jelikož slug je v databázi jedinečný a tak je cyklus proveden vždy jen jednou. To, že by byly v databázi uložené 2 totožné hodnoty ve sloupci slug se nikdy nestane. Děkuji tedy ještě jednou za příklad a ochotu. |
||
|
Časová prodleva: 14 let
|
|||
0