用户评论未使用 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 表示使用带有参数绑定的准备好的语句!如果我正确地解释了代码,那么您想要此代码执行的操作如下:
- 检查名为
$username
的用户是否存在
- 当用户不存在时,将
$error
变量设置为值 "user does not exist"
,否则保持 $error
未定义。
您的代码实际的作用如下:
- 如果之前没有发生错误 (
if(!isset($error))
) select 用户名为 $username
并丢弃结果
- 如果之前的错误确实发生(
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'
我正在尝试创建一个页面以允许用户对图书发表评论。我正在检查字段不为空,用户名存在于用户 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 表示使用带有参数绑定的准备好的语句!如果我正确地解释了代码,那么您想要此代码执行的操作如下:
- 检查名为
$username
的用户是否存在 - 当用户不存在时,将
$error
变量设置为值"user does not exist"
,否则保持$error
未定义。
您的代码实际的作用如下:
- 如果之前没有发生错误 (
if(!isset($error))
) select 用户名为$username
并丢弃结果 - 如果之前的错误确实发生(
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'