Невозможно использовать скалярное значение в качестве массива с помощью mysqli_stmt_bind_param - PullRequest
0 голосов
/ 02 августа 2020
• 1000 *
/* * * * * * * * * * * * * * * *
* Returns all posts under a topic
* * * * * * * * * * * * * * * * */
function getPublishedPostsByTopic($topic_id) {
    global $conn;
    $sql = "SELECT * FROM posts ps WHERE ps.id IN (SELECT pt.post_id FROM post_topic pt WHERE pt.topic_id=? GROUP BY pt.post_id HAVING COUNT(1) = 1)";
    $stmt= mysqli_stmt_init($conn);
    mysqli_stmt_prepare($stmt,$sql);
    mysqli_stmt_bind_param($stmt,"i",$topic_id);
    mysqli_stmt_execute($stmt);
    $result=mysqli_stmt_get_result($stmt);
    $posts=mysqli_fetch_assoc($result);

    $final_posts = array();
    foreach ($posts as $post) {
        $post['topic'] = getPostTopic($post['id']); 
        array_push($final_posts, $post);
    }
    return $final_posts;
}

но когда я его запустил, я получил следующие ошибки:

Warning: Cannot use a scalar value as an array
Warning: Illegal string offset 'id' 
Warning: Cannot assign an empty string to a string offset 

точка, которую я использую mysqli_stmt_bind_param, чтобы избежать MySQL инъекции, SQL INJECTION происходит, когда я использовал следующий код вместо упомянутого выше:

function getPublishedPostsByTopic($topic_id) {
    global $conn;
    $sql = "SELECT * FROM posts ps WHERE ps.id IN (SELECT pt.post_id FROM post_topic pt WHERE pt.topic_id=$topic_id GROUP BY pt.post_id     HAVING COUNT(1) = 1)";
    $result = mysqli_query($conn, $sql);
    // fetch all posts as an associative array called $posts
    $posts = mysqli_fetch_all($result, MYSQLI_ASSOC);

    $final_posts = array();
    foreach ($posts as $post) {
        $post['topic'] = getPostTopic($post['id']); 
        array_push($final_posts, $post);
    }
    return $final_posts;
}

Я новичок с PHP и надеюсь, что кто-нибудь объяснит мне, как решить эту проблему

спасибо

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Не нужно так сильно усложнять код. Придерживайтесь использования объектно-ориентированного стиля и l oop непосредственно на результатах get_result().

function getPublishedPostsByTopic($topic_id) {
    global $conn;
    // prepare/bind/execute
    $sql = "SELECT * FROM posts ps WHERE ps.id IN (SELECT pt.post_id FROM post_topic pt WHERE pt.topic_id=? GROUP BY pt.post_id HAVING COUNT(1) = 1)";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('i', $topic_id);
    $stmt->execute();

    $final_posts = array();
    // get result and iterate over it
    foreach ($stmt->get_result() as $post) {
        $post['topic'] = getPostTopic($post['id']);
        $final_posts[] = $post;
    }
    return $final_posts;
}
0 голосов
/ 02 августа 2020

mysqli_fetch_assoc извлекает одиночную запись из набора результатов. Итак, $posts в $posts=mysqli_fetch_assoc($result); - это не массив массивов, а просто одномерный массив. Вы по-прежнему можете использовать mysqli_fetch_all и изменить свой код на:

mysqli_stmt_prepare($stmt,$sql);
mysqli_stmt_bind_param($stmt,"i",$topic_id);
mysqli_stmt_execute($stmt);
$result=mysqli_stmt_get_result($stmt);
$posts=mysqli_fetch_all($result);   // change here

Другой код не требует изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...