【发布时间】:2016-11-15 15:19:03
【问题描述】:
我有一个充满文章的网站,我希望能够按标签订购它们。每篇文章都有一些相关的标签。
我用了 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
【问题讨论】:
-
您确定您的绑定有效吗?奇怪的是,您在第一个选择中直接使用变量,而在第二个和第三个中您使用参数绑定。 $bbd 是什么?您是直接使用 PDO、库抽象层还是自己的抽象层?
-
为什么不将您的两个查询合并到
SELECT * FROM tags WHERE id IN (SELECT tag_id FROM medias_tags WHERE media_id = ?)中?这样,您就不需要经常调用数据库。我同意有些事情似乎不对;您可以使用errorInfo方法查看 PDO 错误。 -
@R.Chappell 我用 $bdd (db) 编辑了我的问题。我在第一次选择中使用变量并在第二次选择中使用变量的原因是我几乎复制/粘贴了我的分页脚本。但是我不认为这可能是一个问题,对吧?
-
好吧,我看不出任何明显的东西......你可以做的是检查来自
$req_mda_tags->execute();的回复,如果它是假的,那么就有一个错误。正如@ChrisForrence 所说,使用 erroInfo 检查错误是什么。如果我们无法假设问题出在您的 PHP 上。 -
@R.Chappell 我一直在尝试检测任何错误,但它什么也没返回。