问题描述
目前,函数“ getPostTag ”仅返回一个标签。
我创建了一个联接表,该联接表的外键为“ posts ”和“ tag_id”表的外键“ post_id ” ”外键到名为“ tags ”的表中,这些条目将相应地存储在该表中。
使用此表,我希望它能够将多个标签附加到多个帖子。
然后,它还应该能够返回带有其标签集的每个帖子。
我该如何实现? (如果需要完全重做这些功能,我不会感到失望。)
function getPosts() {
global $conn;
$sql = "SELECT * FROM posts ORDER BY id DESC";
$result = MysqLi_query($conn,$sql);
$posts = MysqLi_fetch_all($result,MysqLI_ASSOC);
$final_posts = array();
foreach ($posts as $post) {
$post['tag'] = getPostTag($post['id']);
array_push($final_posts,$post);
}
return $final_posts;
}
function getPostTag($post_id){
global $conn;
$sql = "SELECT * FROM tags WHERE id=
(SELECT tag_id FROM post_tags WHERE post_id=$post_id) LIMIT 1";
$result = MysqLi_query($conn,$sql);
$tag = MysqLi_fetch_assoc($result);
return $tag;
}
解决方法
您可以将函数getPostTag()
更改为getPostTags()
,这将返回标签数组。与您的其他功能相同使用mysqli_fetch_all()
。我认为该SQL应该使用JOIN而不是子查询。
您应该远离全局变量。而是将参数传递给函数。
我建议以这种方式更改您的功能:
function getPosts(mysqli $conn): ?array {
$posts = $conn->query("SELECT * FROM posts ORDER BY id DESC")->fetch_all(MYSQLI_ASSOC);
foreach ($posts as $id => $post) {
$posts[$id]['tag'] = getPostTags($conn,$post['id']);
}
return $posts;
}
function getPostTags(mysqli $conn,int $post_id): ?array {
$stmt = $conn->prepare("SELECT *
FROM tags
JOIN post_tags ON tags.id = post_tags.tag_id
WHERE post_id=?");
// binding as an integer since we know the type
$stmt->bind_param('i',$post_id);
$stmt->execute();
return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}
我不建议使用SELECT *
。您应该列出所有需要获取的列。不要获取所有内容,因为这可能会导致代码混乱和错误。