Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过连接表(多对多)获取具有多个标记的帖子_Php_Mysql_Tags_Many To Many_Posts - Fatal编程技术网

Php 通过连接表(多对多)获取具有多个标记的帖子

Php 通过连接表(多对多)获取具有多个标记的帖子,php,mysql,tags,many-to-many,posts,Php,Mysql,Tags,Many To Many,Posts,此时,函数“getPostTag”只返回一个标记我创建了一个连接表,该表的“post\u id”外键指向一个名为“posts”的表,而“tag\u id”外键指向一个名为“tags”的表,这些条目将相应地存储在该表中。 使用此表,我希望它能够将多个标签附加到多个帖子。 然后,它还应该能够返回每个帖子及其标记集 我怎样才能做到这一点?(如果这些功能需要完全返工,我不会感到失望。) 您可以将函数getPostTag()更改为getPostTags(),该函数将返回一个标记数组。使用与其他函数相同的m

此时,函数“getPostTag”只返回一个标记
我创建了一个连接表,该表的“post\u id”外键指向一个名为“posts”的表,而“tag\u id”外键指向一个名为“tags”的表,这些条目将相应地存储在该表中。
使用此表,我希望它能够将多个标签附加到多个帖子。
然后,它还应该能够返回每个帖子及其标记集

我怎样才能做到这一点?(如果这些功能需要完全返工,我不会感到失望。)


您可以将函数
getPostTag()
更改为
getPostTags()
,该函数将返回一个标记数组。使用与其他函数相同的
mysqli\u fetch\u all()。在我看来,SQL应该使用连接而不是子查询

你应该远离地球人。将参数传递给函数

我建议以这种方式改变你们的职能:

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;
}

我不建议使用
SELECT*
。您应该列出需要获取的所有列。不要获取所有内容,因为这可能会导致混乱和错误的代码。

您想在哪里返回这些标记?是否希望
$post['tag']
成为标记数组?好的,谢谢。事实上,我真的不知道。我只是觉得这样会更有效率。正如你所看到的,我是一个彻头彻尾的SQLNoob。我感谢你的帮助。
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;
}
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);
}