更新两个表之间的链接以获取用户名 - MySQL / PHP。

3
我想做什么? 我有一个学校项目,我们必须制作一个完全功能的网站,人们可以查看歌曲歌词、创建帐户、登录帐户、评论每个歌词并编辑歌词。
所以我创建了一个名为klyrics的数据库,在其中我有以下表格。
表格users
CREATE TABLE users (
userId int(8) PRIMARY KEY AUTO_INCREMENT,
username varchar(100),
email varchar(100),
password varchar(100));

表格 歌词

CREATE TABLE lyrics (
lyricsId int(8) PRIMARY KEY AUTO_INCREMENT,
artist varchar(100),
song varchar(100),
cover varchar(100),
lyrics varchar(9999),
chartId int(8),
commentId int(8),
FOREIGN KEY (chartId) REFERENCES charts(chartId));

表格 图表

CREATE TABLE charts (
chartId int(8) PRIMARY KEY AUTO_INCREMENT,
cover varchar(100),
artist varchar(100),
song varchar(100));

以及表格 评论

CREATE TABLE comments (
commentId int(8) PRIMARY KEY AUTO_INCREMENT,
userId int(8),
username varchar(100),
comment varchar(9999),
commentedon DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (userId) REFERENCES users(userId));


我现在想要创建一个评论系统,这样当我打开例如Drake歌曲的歌词时,我只能评论该歌曲,并且当我发布评论时,我希望显示发表评论的用户名和评论。

我按照这个教程创建了登录/注册系统:

complete-user-registration-system-using-php-and-mysql-database

那么到目前为止我都做了什么? 在我的addcomment.php中,我有以下代码:

<?php
include("connectdb.php");

if(isset($_POST) & !empty($_POST)){
    $comment = mysqli_real_escape_string($conn, $_POST['comment']);
    $username = mysqli_real_escape_string($conn, $_SESSION['username']);

    $isql = "INSERT INTO comments (comment, username) VALUES ('$comment', '$username')";
    $ires = mysqli_query($conn, $isql) or die(mysqli_error($conn));
    if($ires){
        $smsg = "Your Comment Submitted Successfully";
        header('location: index.php');
    }else{
        $fmsg = "Failed to Submit Your Comment";
    }

} ?>

问题1: 当我提交评论时,评论进入数据库并且看起来像这样:enter image description here 用户名 下面出现了一个空白。

问题2: 评论没有显示,以下是我的评论展示代码。

    <?php

$sql = "SELECT * FROM comments WHERE commentiD = $id";
$res = mysqli_query($conn, $sql);

while ( $r = mysqli_fetch_assoc($res)) {

?>
        <h1>By: <?php echo $r['username']; ?></h1>
        <h1>Comment: <?php echo $r['comment']; ?></h1>

<?php } ?>


<?php
}
?>

有关问题2的小更新 就像我之前说的那样,我有几个带有ID的页面,因此当你点击“查看歌词”时,你会跳转到例如http://localhost/klyrics/lyrics.php?id=2,而我只想看到与这首歌相关的评论。


这是一个非常好的问题,涵盖了很多关于主题的细节以及你已经尝试过的内容,点赞。 - Noah Boegli
1
您的评论中未存储任何页面ID引用。您不能使用commentID列,因为它是您表的主键,因此每一行都有一个不同的键值。您需要添加一个类似于lyricsID的列,以存储歌词页面ID,并添加一个WHERE子句来基于该列中的数据进行选择。 - Noah Boegli
如果 $_post['username'] 为空,可能是您的表单存在问题,未能正确传递变量。 - Alberto Moro
由于您正在关注 awa 教程 https://codewithawa.com/posts/creating-a-comment-and-reply-system-php-and-mysql ,同一位作者也有评论系统。 - user1805543
2
问题2:$sql = "SELECT * FROM comments WHERE commentiD = $id";你把commentiD作为列,即使在截图中该列被称为commentId。有很多拼写错误,我认为你应该学习调试的基础知识。虽然这不是问题,但你向我们展示了一个带有变量的查询,但从未显示变量id的设置位置。你告诉我们你的会话为空。请向我们展示设置会话的代码。 - Loko
显示剩余11条评论
1个回答

1

创建一个类似于您的评论系统!您需要在login.php上设置用户名和用户ID到会话中。

并且在您的表中添加一个名为postid的额外列。

然后像这样插入到数据库中:

$stmt = $pdo->prepare("INSERT INTO comments(postid, userid, username, comment)
                VALUES(:postid, :userid, :username, :comment)");
$stmt->bindParam(':postid', $post_id, PDO::PARAM_INT);
$stmt->bindParam(':userid', $_SESSION['userid'], PDO::PARAM_INT);
$stmt->bindParam(':username', $_SESSION['username'], PDO::PARAM_STR);
$stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
$stmt->execute();

注意 commentid 是自增的,TIMESTAMP 0 ON UPDATE CURRENT_TIMESTAMP 不需要添加日期。

您可以使用左连接或连接从另一个表中获取有关帖子和用户的信息等,如下所示:

SELECT * FROM comments
        JOIN users ON comments.userid = users.userid
        AND postid = :postid 
        ORDER BY commentid DESC";

我做简单。

$post_id = '1';
$sql = "SELECT * FROM comments WHERE postid = :postid";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":postid", $post_id);
$stmt->execute();
$comment = $stmt->rowCount();
if($comment == 0){
    echo "be the first commenter";
}else{
    while($row = $stmt->fetch()){
        //display your codes here
    }
}

注意:我正在使用PDO预处理语句,你需要在mysqli中进行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接