【问题标题】:PHP error with prepared statements using OOP使用 OOP 准备好的语句的 PHP 错误
【发布时间】:2020-06-12 08:59:09
【问题描述】:

我最近在 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 给出了消息“无法删除文章”。即使文章已被删除。

【问题讨论】:

标签: php sql oop mysqli


【解决方案1】:

这段代码在很多层面上都是错误的(正如您对 youtube 教程所期望的那样),但主要问题是方法 showDeleteArticle() 是错误的且具有误导性。

没有理由使用这种方法。另一个答案被接受的事实证明了这一点。提供的代码 always 返回类似 true 的值,因此 showDeleteArticle() 中的条件变得无用。可以将其重写为

public function showDeleteArticle($id) {
    echo "Article has successfully been deleted.";
} 

因为它永远不会进入 else 部分。

更不用说任何控制器都不应该直接脱口而出任何数据,而不是通过视图。至少在 POST 请求之后必须进行重定向,而不是输出。

【讨论】:

【解决方案2】:

错误是你返回一个 $result, 这仅在使用 select 语句时有效。但是在插入、更新、删除 不需要 $result,$result 不是布尔值,这就是为什么它在 if 语句中不起作用的原因。 您应该返回 $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.

【讨论】:

  • 这段代码基本上没用。就像另一个总是返回 false 的变体一样,这个总是返回 true,这不是任何改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多