2016-11-15 68 views
2

我有一個網站充滿了文章,我希望能夠通過標籤來訂購它們。每篇文章都有一些關聯的標籤。MySQL不顯示數據

我用3個表:

媒體(展位的文章)

+----+--------+-----+ 
| id | title | ... | 
+----+--------+-----+ 
| 1 | hello | ... | 
| 2 | hi  | ... | 
+----+--------+-----+ 

標籤

+----+------+-----+ 
| id | name | ... | 
+----+------+-----+ 
| 1 | red | ... | 
| 2 |square| ... | 
+----+------+-----+ 

medias_tags(爲了鏈接標籤&媒體一起)

+----+----------+--------+ 
| id | media_id | tag_id | 
+----+----------+--------+ 
| 1 |  1 |  1 | 
| 2 |  1 |  2 | 
| 3 |  2 |  2 | 
+----+----------+--------+ 

到目前爲止,我使用的這個MySQL/PHP代碼命令由標籤的物品,這是工作(我故意刪除更好地瞭解分頁條件):

$ BDD

try{ 
    $bdd = new PDO('mysql:host=localhost;dbname=DB;charset=utf8', 'username', 'pass');}catch(Exception $e) { die('Erreur : '.$e->getMessage()); 
} 



if(isset($_GET['tag'])){ 
    $tag_name_1 = htmlspecialchars($_GET['tag']); 
    $req_tag = $bdd->prepare('SELECT * FROM tags WHERE name = ?'); 
    $req_tag->execute(array($tag_name_1)); 
    $data_tag = $req_tag->fetch(); 
    $ttag_id = $data_tag['id'];  

    $q = 'SELECT * 
      FROM medias 
      JOIN medias_tags 
      ON medias.id=medias_tags.media_id 
      WHERE medias_tags.tag_id ='.$ttag_id.' 
      ORDER BY date DESC 
      LIMIT '.$start.','.$limit;  
    } 

    $req_mda_list = $bdd->query($q); 

問題是當我想顯示與文章相關的所有標籤時。 $ mda_tags_list爲空。

while ($data_mda = $req_mda_list->fetch()){ 

    $mda_id = $data_mda['id']; 
    $mda_title = $data_mda['title']; 

    #Get media tags 
    $req_mda_tags = $bdd->prepare('SELECT * FROM medias_tags WHERE media_id = ?'); 
    $req_mda_tags->execute(array($mda_id));  

    $mda_tags_list = null; 

    while ($data_mda_tags = $req_mda_tags->fetch()){ 
     $tag_id = $data_mda_tags['tag_id']; 

     $req_tag_name = $bdd->prepare('SELECT * FROM tags WHERE id = ?'); 
     $req_tag_name->execute(array($tag_id)); 
     $data_tag_name = $req_tag_name->fetch(); 

     $mda_tags_list .= '<a href="http://www.website.com/tags/'.$data_tag_name['name'].'">'.$data_tag_name['name'].'</a> '; 
} 

    echo $mda_title.' - '.$mda_tags_list; 

} 

我居然得到:

Order by tag -> Square 

Title1 - Tag : 
Title5 - Tag : 
Title6 - Tag : 

我試圖讓:

Order by tag -> Square 

Title1 - Tag : Square, Red, Thank 
Title5 - Tag : Yellow, Square, You 
Title6 - Tag : Square, Blue, Stackoverflow 
+0

你確定你的綁定有效嗎?很奇怪,你直接在第一個選擇中使用變量,而在第二個和第三個中使用參數綁定。什麼是$ bbd?您是直接使用PDO,圖書館抽象層還是您自己的抽象層? –

+1

爲什麼不把你的兩個查詢結合到'SELECT * FROM標籤WHERE id IN(SELECT tag_id FROM medias_tags WHERE media_id =?)'?這樣,你不需要經常調用數據庫。我同意某件事看起來不正確;您可以使用['errorInfo'](http://php.net/manual/en/pdo.errorinfo.php)方法查看PDO錯誤。 –

+0

@ R.Chappell我用$ bdd(db)編輯了我的問題。之所以我在我的第一個選擇和使用變量中使用變量是因爲我幾乎複製/粘貼了我的分頁腳本。不過,我認爲這不是一個問題嗎? – casusbelli

回答

1

我做了什麼,簡化你的代碼,我已經減少你的SQL到一個聲明,我已經添加了一些非常基本的錯誤檢查:

$tagName = htmlspecialchars($_GET['tag']); 

$sql = "SELECT 
     medias.*, 
     GROUP_CONCAT(tags2.name) AS allTags 
    FROM 
     medias 
     -- Get the media tags 
     JOIN medias_tags ON medias.id = medias_tags.media_id 
     -- Join on the tags so we can add a where condition 
     JOIN tags ON medias_tags.tag_id = tags.id 
     -- Rejoin tags again, this won't be used as a condition hence the left 
     LEFT JOIN tags AS tags2 ON medias_tags.tag_id = tags2.id 
    WHERE 
     -- Only get medias where it has a matching tag name 
     tag.name = :name 
    GROUP BY 
     medias.id 
    ORDER BY 
     date DESC 
    LIMIT 
     :offset, :limit"; 

$sth = $bdd->prepare($sql); 

// Did it prepare ok? 
if (!$sth) { 
    echo "\nPDO::errorInfo():\n"; 
    print_r($dbh->errorInfo()); 
    exit; 
} 

$err = $sth->execute(array(':name' => $tagName, ':offset' => $start, ':limit' => $limit)); 

// Did it execute ok? 
if (!$sth) { 
    echo "\nPDO::errorInfo():\n"; 
    print_r($dbh->errorInfo()); 
    exit; 
} 

foreach ($sth->fetchAll() as $row) { 
    $tags = explode(',', $row['allTags']); 

    echo $row['title'] . ' - '; 

    foreach ($tags as $tag) { 
     echo '<a href="http://www.website.com/tags/' . $tag . '">' . $tag . '</a> '; 
    } 
} 

這可能是我的SQL註釋需要刪除,如果您的標籤包含逗號,這也無法正常工作。如果需要避免這種情況,您可以指定一個不同的分隔符。

基本上,這只是爲了減少可能失敗的區域並捕捉可能的區域。我只是試圖根據你的例子輸出結果,看起來你的代碼看起來像什麼,希望這會給你一些能夠實現你的目標的東西。

+0

發現錯誤來自medias_tags ['id'],它與medias ['id']搞砸了。現在正在工作。謝謝 :) – casusbelli

1

對於媒體獲得的所有標籤,你可以使用下面的查詢:

SELECT medias.id,medias.title,GROUP_CONCAT(tags.name) as tag 
FROM medias 
JOIN medias_tags ON medias.id = medias_tags.media_id 
JOIN tags ON medias_tags.tag_id = tags.id 
GROUP BY medias.id 

要獲得所有媒體與標籤,如果avai拉布勒其他空白,可以使用下面的查詢:

SELECT medias.id,medias.title,GROUP_CONCAT(tags.name) as tag 
FROM medias 
LEFT JOIN medias_tags ON medias.id = medias_tags.media_id 
LEFT JOIN tags ON medias_tags.tag_id = tags.id 
GROUP BY medias.id