猿问

我们应该在哪里使用 fetch_assoc 方法?

我开始了这个小博客项目,我认为我犯了一个错误,因为没有包含fetch_assoc方法。这是代码:


$data = new database();

$sql = "SELECT * FROM post ";

 $article = $data->select($sql);

 foreach ($article as  $value) : ?>

 <div class="blog-post">

<h2 class="blog-post-title"><?= $value["blog_title"]; ?></h2>

这就是 select 方法的样子:


public function select($sql){

     $result = $this->con->query($sql) or die($this->con->error.__LINE__);

     if ($result->num_rows > 0) {

        return $result;

     }else {

       return false;

     }

}

我想知道为什么它对我有用(博客的标题显示正确),尽管我忘记了方法fetch_assoc?


手掌心
浏览 398回答 1
1回答

守着星空守着你

fetch_assoc()大部分时间你不需要使用。如果您正在围绕 mysqli 编写某种抽象类,那么您永远不需要直接使用任何 mysqli 函数。mysqli:query()返回一个mysqli_result可迭代类型的对象。这意味着您可以使用foreach循环来迭代它。我需要指出的是,您仍然遵循一些不良的编程实践。你永远不应该使用or die($this->con->error.__LINE__). 这是一种糟糕的编码实践,而且完全没有必要。相反,您应该启用正确的错误报告。您的select()方法应该只返回一个数组。这将使您的代码更加简单并且不易出错。因此,将您的select()函数重写为:public function select($sql){     return $this->con->query($sql)->fetch_all(MYSQLI_ASSOC); }正如您所看到的,整个功能是一行代码,这意味着您的select()方法不是很有用。您可以用更通用的东西替换它。这样你就可以避免大量的代码重复。public function executeQuery(string $sql, array $params = []): ?array {    // Prepare/bind/execute    $stmt = $this->con->prepare($sql);    if ($params) {        $stmt->bind_param(str_repeat("s", count($params)), ...$params);    }    $stmt->execute();    // If it was a select query which gives result then return results in an array    if ($result = $stmt->get_result()) {        return $result->fetch_all(MYSQLI_BOTH);    }    // If it is INSERT/UPDATE then return null instead of array    return null;}当然,这个方法不应该是你的模型的一部分。它应该是数据库通信专用类的一部分。然后,您可以在应用程序中创建它的单个实例并将其传递给您的模型。
随时随地看视频慕课网APP
我要回答