mysqli_fetch_object vs不使用它

时间:2018-01-16 12:56:47

标签: php mysqli

我最近发现我可以在不使用mysqli_fetch_object功能的情况下打印数据库中的结果。

所以例如: 让我们说我们有简单的sql select statment,可以通过这样的方式执行:

$conn = mysqli_connect('localhost', 'root', '', 'example_db');
$result = mysqli_query($conn, "SELECT * FROM users");

下一步将是这样的:

while($row = mysqli_fetch_object($result)) echo $row->username

其中,用户名是用户表中对应的列名。

然后我发现这也适用于将其打印出来:

foreach($result as $row) echo $row['username'];

经过几次var_dumps和更少的PHP文档阅读。我唯一的猜测是因为这是可能的:

  

5.4.0添加了迭代器支持,因为mysqli_result现在实现了Traversable。

所以,如果我的说法属实。是否需要使用类似的东西 mysqli_fetch_object或类似函数mysqli_fetch_array

1 个答案:

答案 0 :(得分:1)

基本上有3种方法可以通过MySQLi API在PHP中获得结果。

按照优先顺序:

  1. 将所有记录提取到PHP数组中。您可以使用fetch_all()方法将所有记录放入多维数组。您可以决定是否应将记录作为关联数组,数字数组或两者都读取。您无法获取对象数组。例如

    $results = $conn->query("SELECT * FROM users")->fetch_all(MYSQLI_ASSOC);
    
  2. 您还可以直接迭代mysqli_result对象。这将为您提供关联数组的结果,并且您可以根据需要进行多次迭代。

    $result = $conn->query("SELECT * FROM test1");
    
    foreach ($result as $r) {
        var_dump($r['id']);
    }
    echo '------------------------------------------------------------';
    foreach ($result as $r) {
        var_dump($r['id']);
    }
    
  3. 如果其他两个选项不够灵活,或者您希望将结果作为对象,则需要依靠其他方法,例如fetch_object()fetch_array()

    $result = $conn->query("SELECT * FROM test1");
    
    $objects = []; // collect objects into an array
    while ($obj = $result->fetch_object()) {
        $objects[] = $obj;
    }
    

    这里的问题是,您需要分别获取每一行,并且一旦到达末尾就无法再次进行迭代,除非倒回对象的内部指针。如果您需要在收集结果时应用一些转换,则此方法有时会很有用。

当然,我也建议您改用PDO,因为PDO功能更强大,故障少且易于使用。