PHP 使用 OOP 的准备语句错误
PHP error with prepared statements using OOP
我最近在 youtube 上关注了 mmtuts 关于 PHP OOP 的教程播放列表,但他使用了 PDO 而我没有,当我尝试在我的项目中实现代码时出现错误。
我的代码:
//In file with class 'Article'.
public function deleteArticle($id) {
$conn = $this->connect();
$sql = "UPDATE article SET deleted=1 WHERE row_id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
return $result;
}
//In file with class 'DBConn'.
public function connect() {
$conn = new mysqli('localhost', 'root', '','nicms');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
return $conn;
}
//In file with class 'articleContr'.
public function showDeleteArticle($id) {
if ($this->deleteArticle($id)
echo "Article has successfully been deleted.";
else
echo "Failed to delete article.";
}
错误是文章确实被删除了,但是 showDeleteArticle 方法给出了消息 'Failed to delete article'。尽管文章已被删除
错误是你return $result,
这仅在使用 select 语句时有效。但是在插入、更新、删除时
不需要 $result,$result 不是布尔值,这就是它在 if 语句中不起作用的原因。
你应该 return $stmt 因为并在 if 语句中检查它
将您的代码更改为此,它应该可以工作:
protected function unSetArticle($id) {
$conn = $this->connect();
$sql = "UPDATE article SET deleted=1 WHERE row_id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
return $stmt;
}//Method unSetArticle.
此代码在很多层面上都是错误的(正如您对 youtube 教程所期望的那样),但主要问题是方法 showDeleteArticle() 是错误的且具有误导性。
根本没有理由使用此方法。另一个答案被接受的事实证明了这一点。提供的代码 always returns 类似 true 的值,因此 showDeleteArticle() 中的条件变得无用。可以将其重写为
public function showDeleteArticle($id) {
echo "Article has successfully been deleted.";
}
因为它永远不会进入 else 部分。
更何况任何Controller 都不应该直接脱口而出任何数据,而不是通过View。至少在 POST 请求之后 必须 是重定向,而不是输出。
我最近在 youtube 上关注了 mmtuts 关于 PHP OOP 的教程播放列表,但他使用了 PDO 而我没有,当我尝试在我的项目中实现代码时出现错误。
我的代码:
//In file with class 'Article'.
public function deleteArticle($id) {
$conn = $this->connect();
$sql = "UPDATE article SET deleted=1 WHERE row_id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
return $result;
}
//In file with class 'DBConn'.
public function connect() {
$conn = new mysqli('localhost', 'root', '','nicms');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
return $conn;
}
//In file with class 'articleContr'.
public function showDeleteArticle($id) {
if ($this->deleteArticle($id)
echo "Article has successfully been deleted.";
else
echo "Failed to delete article.";
}
错误是文章确实被删除了,但是 showDeleteArticle 方法给出了消息 'Failed to delete article'。尽管文章已被删除
错误是你return $result, 这仅在使用 select 语句时有效。但是在插入、更新、删除时 不需要 $result,$result 不是布尔值,这就是它在 if 语句中不起作用的原因。 你应该 return $stmt 因为并在 if 语句中检查它
将您的代码更改为此,它应该可以工作:
protected function unSetArticle($id) {
$conn = $this->connect();
$sql = "UPDATE article SET deleted=1 WHERE row_id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
return $stmt;
}//Method unSetArticle.
此代码在很多层面上都是错误的(正如您对 youtube 教程所期望的那样),但主要问题是方法 showDeleteArticle() 是错误的且具有误导性。
根本没有理由使用此方法。另一个答案被接受的事实证明了这一点。提供的代码 always returns 类似 true 的值,因此 showDeleteArticle() 中的条件变得无用。可以将其重写为
public function showDeleteArticle($id) {
echo "Article has successfully been deleted.";
}
因为它永远不会进入 else 部分。
更何况任何Controller 都不应该直接脱口而出任何数据,而不是通过View。至少在 POST 请求之后 必须 是重定向,而不是输出。