【问题标题】:Is there a better way to display tags using PHP/MySQLi?有没有更好的方法来使用 PHP/MySQLi 显示标签?
【发布时间】: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,我现在已经删除了它,因为它没有任何区别。
  • 对不起。我不明白。你不能利用什么?

标签: php mysqli


【解决方案1】:

我认为最简单的方法是使用WHERE IN 运行单个查询以仅匹配您需要的标签。

$tags = explode(',', $row["tags"]);
$placeholders = implode(',', array_fill(0, count($tags), '?'));
$fetchTags = $conn->prepare('SELECT id, name FROM tags WHERE id IN ('.$placeholders.') AND type = 1 ORDER BY id');
$fetchTags->bind_param(str_repeat('s', count($tags)), ...$tags);
$fetchTags->execute();
$fetchResult = $fetchTags->get_result();
if($fetchResult->num_rows === 0) {
    print('No rows');
}
foreach($fetchResult as $row) {
    echo $row['name'];
}

在 PHP 8.1 上,您可以避免使用 bind_param() 行,而只需将数组传递到 execute()

$fetchTags->execute($tags);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2012-12-05
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多