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

Where should we use fetch_assoc method?

提问人:Fares Ars 提问时间:7/5/2020 最后编辑:DharmanFares Ars 更新时间:7/5/2020 访问量:138

问:

我开始了这个小博客项目,我认为我只是犯了一个错误,没有包括方法。 这是代码: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>

这就是选择方法的样子:

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

php oop 对象 mysqli foreach

评论


答:

0赞 Dharman 7/5/2020 #1

您大部分时间都不需要使用。如果你正在围绕mysqli编写某种抽象类,那么你永远不需要直接使用任何mysqli函数。fetch_assoc()

mysqli:query()返回一个可迭代类型的对象。这意味着您可以使用循环来迭代它。mysqli_resultforeach

我需要指出的是,你仍然遵循一些糟糕的编程实践。切勿使用 .这是一种糟糕的编码实践,完全没有必要。相反,您应该启用正确的错误报告。请参阅如何在MySQLi中获取错误消息?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;
}

当然,此方法不应成为模型的一部分。它应该是数据库通信专用类的一部分。然后,您可以在应用程序中创建它的单个实例,并将其传递给模型。

评论

0赞 Fares Ars 7/5/2020
感谢您@Dharman回复,但是,我们可以有其他东西,例如整数,因此我们需要 d 而不是 s,因为我认为我们需要一个循环来将所有参数作为数组放入bind_param(str_repeat("s",count($params)), ...$params) $paramsexecuteQuery methode
0赞 Dharman 7/5/2020
@FaresArs 99.99% 的情况下,除了字符串之外,您不需要任何东西。但是,如果您确实需要手动指定类型,那么我建议您阅读这篇简短的文章: phpdelusions.net/mysqli/simple