用户评论未使用 PDO 输入数据库

user review not entering in database using PDO

我正在尝试创建一个页面以允许用户对图书发表评论。我正在检查字段不为空,用户名存在于用户 table 中,图书 ID 存在于图书 table 中。如果所有这些都通过了那么我想将评论输入评论table。

目前,当我填写表单并提交时,我没有得到任何输出,没有错误,只有一个空白屏幕。

代码如下:

require_once __DIR__.'/config.php';
session_start();
$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD);

$book = $_POST["book_id"];
$username = $_POST["user"];
$review = $_POST["review"];
$rating = $_POST["rating"];

if (empty($book) || empty($username) || empty($review) || empty($rating) ) {
    $error = "Complete all fields";     
}

if ($rating > 5 || $rating < 0) {
    $error =  "Please enter a rating between 1 and 5";
}

if (!isset($error)){
    //no error
    $stmt = $dbh->prepare("SELECT username FROM users WHERE username = :user");
    $stmt->bindParam(':user', $username);
    $stmt->execute();
} else {
    $error = "user does not exsist";
}

if (!isset($error)){
    //no error
    $stmt = $dbh->prepare("SELECT b_id FROM users WHERE b_id = :book_id");
    $stmt->bindParam(':book_id', $book);
    $stmt->execute();
} else {
    $error = "Book does not exsist, please enter another ID";
}       

if (!isset($error)) {
    $sql = 'INSERT INTO reviews (book_id ,username, review, rating) VALUES (:book_id,:user,:review,:rating)';    
    $query = $dbh->prepare($sql);

    $query->execute(array(
        ':book_id' => $book,
        ':user' => $username,
        ':review' => $review,
        ':rating' => $rating    
    ));
} else {
    echo "error occured: ".$error;
    exit();
}

我想进行检查并将信息输入数据库,谁能告诉我如何操作?

尝试将此代码添加到脚本的开头。如果您无法连接到数据库,您将捕获错误并打印到控制台。

try {
    $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD);
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

您的错误处理无法正常工作。让我们看一个例子:

if (!isset($error)){
    //no error
    $stmt = $dbh->prepare("SELECT username FROM users WHERE username = :user");
    $stmt->bindParam(':user', $username);
    $stmt->execute();
} else {
    $error = "user does not exsist";
}

首先,+1 表示使用带有参数绑定的准备好的语句!如果我正确地解释了代码,那么您想要此代码执行的操作如下:

  1. 检查名为 $username 的用户是否存在
  2. 当用户不存在时,将 $error 变量设置为值 "user does not exist",否则保持 $error 未定义。

您的代码实际的作用如下:

  1. 如果之前没有发生错误 (if(!isset($error))) select 用户名为 $username 并丢弃结果
  2. 如果之前的错误确实发生else),检查用户是否存在,但无条件覆盖$error 变量。

需要做的是评估您的查询结果以检查用户是否确实存在(请注意您当前正在执行一个 SQL 查询,但是不以任何方式评估它的结果):

$stmt = $dhb->prepare("SELECT COUNT(1) FROM users WHERE username = :user");
$stmt->bindParam(':user', $username);
$stmt->execute();

$userCount = $stmt->fetchColumn();
if ($userCount == 0) {
    $error = "User does not exist";
}

此外,您不检查最终 INSERT 语句是否成功。这意味着如果最后一个 SQL 查询失败,您将不会得到任何类型的错误输出。

为 PDO 查询添加错误处理的最简单方法(恕我直言)是通过设置 错误模式 :

配置 PDO 以在出现错误时抛出异常
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在那种情况下,每个 PDO 查询都会在 SQL 错误上抛出异常,您可以在应用程序中捕获和处理该错误:

$sql = 'INSERT INTO reviews (book_id ,username, review, rating) VALUES (:book_id,:user,:review,:rating)';    
$query = $dbh->prepare($sql);

try {
    $query->execute(array(
        ':book_id' => $book,
        ':user' => $username,
        ':review' => $review,
        ':rating' => $rating    
    ));
} catch (PDOException $e) {
    // Process exception $e as you see fit.
}

根据上次查询的错误输出,评论 table 似乎没有 username 字段。 这也是合乎逻辑的——我相信它应该像 user_id(作为 PK 关系)。

Query 1 Error output: Array ( [0] => 00000 [1] => [2] => )
Query 2 Error output:  Array ( [0] => 00000 [1] => [2] => )
Query 3 Error output:  Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'username' in 'field list' )

查询:

$sql = 'INSERT INTO reviews (book_id ,username, review, rating) VALUES (:book_id,:user,:review,:rating)';    
    $query = $dbh->prepare($sql);

提到的错误是:

Unknown column 'username' in 'field list'