【发布时间】:2021-11-19 09:53:23
【问题描述】:
在我的网站中,我使用了标记系统。它可以工作,但是我注意到它的效率极低,如果我想显示标签列表,则需要为每个标签执行单独的 SQL 查询。
This is my tag table within the database
这是获取和显示标签的方式:
$tags = json_decode(json_encode(explode(',', $row["tags"])));
foreach($tags as $tag) {
$fetchTags = $conn->prepare("SELECT id, name FROM tags WHERE id = ? AND type = 1");
$fetchTags->bind_param("i", $tag);
$fetchTags->execute();
$fetchResult = $fetchTags->get_result();
if($fetchResult->num_rows === 0) print('No rows');
while($resultrow = $fetchResult->fetch_assoc()) {
?><span class="badge bg-primary me-2"><?php echo $resultrow["name"]; ?></span><?php
}
$fetchTags->close();
}
请注意,$tags 将等同于它们的标签 ID,例如1,2,3。最多搜索 1 个标签可能没问题,但是当您有 5-10 个需要搜索的标签时,您就会发现问题。
我想在 1 个 SQL 查询中搜索标签,但 MySQLi 的工作方式和绑定参数很奇怪。我在这里看到一些人建议使用 PDO,但我不确定实现将如何工作。如果需要,我可以改用 PDO,但理想情况下我想继续使用 MySQLi。
【问题讨论】:
-
使用 PDO 会容易得多。如果您在 PHP 8.1 上已经使用 mysqli 执行此操作也变得容易一些。如果可以,我强烈建议您使用 PDO。它会让你的生活更轻松。您需要做的是获取循环外的所有 ID。在 PDO 中我会使用 FETCH_KEY_PAIR,但在 mysqli 中你没有。您还可以使用 WHERE IN() 将 ID 限制为您想要的。
-
如果您继续使用mysqli,请尝试使用
foreach而不是while。这将使代码更易于阅读。 -
json_decode(json_encode怎么了? -
@Dharman 我目前使用的是 PHP 8.0,所以考虑到最高的共享托管支持是 8.0,我认为我无法利用这一点。另外,我不确定为什么我有 json_decode/encode,我现在已经删除了它,因为它没有任何区别。
-
对不起。我不明白。你不能利用什么?