Отображение комментариев под определенными постами - PullRequest
0 голосов
/ 11 мая 2018

я пытаюсь назначить список сообщений с разделом комментариев, который является уникальным для этого сообщения.Моя проблема в том, что вместо того, чтобы отображать конкретные комментарии под определенными постами, все комментарии отображаются для каждого отдельного поста.

Я использую 2 таблицы базы данных: "posts: id, title, subtitle, content" и "comments:comment_id, post_fk (внешний ключ, прикрепленный к идентификатору сообщения), uid, дата, сообщение.

blog.php, где сообщения отображаются и комментарии отправляются, а затем публикуются через getComments

// fetch data from posts and echo them into a post

$sql = "SELECT * FROM posts ORDER BY id DESC";
$result = mysqli_query($conn,$sql);

while ($row = mysqli_fetch_array($result)) {
    $title = $row['title'];
    $subtitle = $row['subtitle'];
    $content = $row['content'];
?>
    <h2><?php echo $title; ?> - <small><?php echo $subtitle; ?></small></h2>
    <p><?php echo $content; ?></p>

// echo the comment field and then get comments from the getComments function echo
echo    "<form method='posts' action='".setComments($conn)."'>
            <input type='hidden' name='uid' value='Anonymous'>
            <input type='hidden' name='date' value='".date('Y-m-d H:i:s')."'>
            <textarea name='message'></textarea><br>
            <button type='submit' name='commentSubmit'>Comment</button>
    </form>";

        getComments($conn);

comments.php, где определены функции setComments и getComments

function setComments($conn) {
if (isset($_POST['commentSubmit'])) {

    $uid = $_POST['uid'];
    $date = $_POST['date'];
    $message = $_POST['message'];


    $sql = "INSERT INTO comments (uid, date, message) VALUES ('$uid', '$date', '$message')";
    $result = mysqli_query($conn, $sql);
    }
}

function getComments($conn) {
    $sql = "SELECT
    c.uid, 
    c.date,
    c.message 
FROM comments AS c  
    LEFT JOIN posts AS p ON
    c.post_fk = p.id
    WHERE c.post_fk = p.id
";
    $result = mysqli_query($conn, $sql);
    while ($row = $result->fetch_assoc()) {
        echo $row['uid'];
        echo $row['date']."<br><br>";
        echo $row['message']."<br><br>";

Я экспериментировал с LEFT JOIN без каких-либо многообещающих результатов. Я очень новыйв PHP, но я подозреваю, что мне нужно добавить некоторые дополнительные значения в форму комментария, которая определяет, к какому сообщению относится комментарий. Надеюсь, эта информация достаточно содержательна, и извините, если мой код запутался!

Спасибо

(редактировать) setcomment.php

function setComments($conn) {
if (isset($_POST['commentSubmit'])) {
    $comment_id = $_POST['comment_id'];
    $uid = $_POST['uid'];
    $date = $_POST['date'];
    $message = $_POST['message'];


    $sql = "INSERT INTO comments (comment_id, uid, date, message) VALUES ($comment_id, $uid, $date, $message)";
    $stmt = mysqli_prepare($sql);
    mysqli_stmt_bind_param($stmt, "iiss", $id, $uid, $date, $message);
    $result = mysqli_stmt_execute($stmt);
    }
}

таблица комментариев таблица сообщений

1 Ответ

0 голосов
/ 11 мая 2018

getComments() нужен параметр, который указывает, к какому сообщению вы хотите получить комментарии, а затем ему нужно предложение WHERE, которое получает комментарии только к этому сообщению.

Нет необходимости присоединяться к posts таблица в getComments, так как она не использует ничего из этой таблицы.

function getComments($conn, $post) {
    $sql = "SELECT
        c.uid, 
        c.date,
        c.message 
    FROM comments AS c
    WHERE c.post_id = $post
    ORDER BY c.date
    ";
    $result = mysqli_query($conn, $sql);
    while ($row = $result->fetch_assoc()) {
        echo $row['uid'];
        echo $row['date']."<br><br>";
        echo $row['message']."<br><br>";
    }
}

Затем вы называете это как:

getComments($conn, $row['id']);

В форме,

action='".setComments($conn)."'>

не имеет смысла.Атрибут action должен содержать URL-адрес скрипта, который обрабатывает все поля формы.Вы вызываете функцию setComments() при создании страницы и помещаете ее возвращаемое значение (которое является пустым, поскольку у него нет оператора return) в атрибут action.Это должно быть что-то вроде:

action='setComments.php'>

Затем вы можете добавить скрытое поле в форму с идентификатором сообщения:

<input name='postid' type='hidden' value='{$row['id']}'>

setComments.php затем можете использовать $_POST['postid'], чтобы получитьправильный post_id комментария, который вводится.Функция setComments должна выглядеть следующим образом (используя подготовленный оператор для защиты от SQL-инъекций):

function setComments($conn) {
    if (isset($_POST['commentSubmit'])) {
        $id = $_POST['postid'];
        $uid = $_POST['uid'];
        $date = $_POST['date'];
        $message = $_POST['message'];


        $sql = "INSERT INTO comments (post_id, uid, date, message) VALUES (?, ?, ?, ?)";
        $stmt = mysqli_prepare($sql);
        mysqli_stmt_bind_param($stmt, "iiss", $id, $uid, $date, $message);
        $result = mysqli_stmt_execute($stmt);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...