【问题标题】:PDO fetchObject() after fetchall(). returning falsefetchall() 之后的 PDO fetchObject()。返回假
【发布时间】:2014-01-15 05:32:41
【问题描述】:

我是 PHP 新手。 我正在尝试以表格的形式显示员工的详细信息。 但是while($row = $result->fetchObject()) 部分没有执行,因为$result->fetchObject() 返回错误。和$rows = $result->fetchAll(); 有关系吗? 这是代码sn-p。

$sql = "SELECT id, name, designation FROM employees";

if ($result = $pdo->query($sql)) {
    $rows = $result->fetchAll();
    $num_rows = count($rows);

    if ($num_rows > 0) {
        echo "<table>\n";
        echo " <tr class=\"heading\">\n";
        echo " <td>ID</td>\n";
        echo " <td>Name</td>\n";
        echo " <td>Designation</td>\n";    
        echo " </tr>\n";

        while($row = $result->fetchObject()) {
            echo " <tr>\n";
            echo " <td>" . $row->id . "</td>\n";
            echo " <td>" . $row->name . "</td>\n";
            echo " <td>" . $row->designation . "</td>\n";
            echo " </tr>\n";
        }
        echo "</table>";
    } else {
        echo "No employees in database.";
    }

else {
    echo "ERROR: Could not execute $sql. " . print_r
    ($pdo->errorInfo());
}

【问题讨论】:

  • 当您致电fetchAll() 时,您已经获取了所有内容!所以,fetchObject() 没有什么可取的了。只需遍历$rows
  • ... 如foreach ($rows as $row) 中的while() 循环。如果您没有设置默认值:$rows = $result-&gt;fetchAll(PDO::FETCH_OBJ),您可能还需要在调用fetchALL() 时设置提取类型。那么你就不需要改变循环体内的任何东西了。
  • @MichaelBerkowski 您应该将其发布为答案。
  • 感谢两位。它有帮助!

标签: php pdo


【解决方案1】:

PDO 的文档对此有点混乱,但 PDOStatement::fetch() 方法及其表亲 fetchAll() 在没有更多行可返回时返回 false。文档说它返回false失败,并且缺少可用行算作失败。

您对fetchAll() 的初始调用从PDOstatement 结果对象中获取所有行,并且fetchObject() 调用不再需要检索,因此它返回false

您只需要对fetchAll() 进行初始调用,但如果您之前没有为连接设置默认提取类型,则可能需要将其提取类型设置为PDO::FETCH_OBJ

然后,您可以用简单的 foreach 循环替换您的 while 循环,覆盖您已有的 $rows 数组。这还有一个额外的好处,就是将显示逻辑与数据库查询业务逻辑分开一点:

if ($result = $pdo->query($sql)) {
    // Fetch them now, as objects
    $rows = $result->fetchAll(PDO::FETCH_OBJ);
    $num_rows = count($rows);

    if ($num_rows > 0) {
        echo "<table>\n";
        echo " <tr class=\"heading\">\n";
        echo " <td>ID</td>\n";
        echo " <td>Name</td>\n";
        echo " <td>Designation</td>\n";    
        echo " </tr>\n";

        // $rows now has everything you need, just loop over it
        foreach ($rows as $row {
            echo " <tr>\n";
            echo " <td>" . htmlspecialchars($row->id) . "</td>\n";
            echo " <td>" . htmlspecialchars($row->name) . "</td>\n";
            echo " <td>" . htmlspecialchars($row->designation) . "</td>\n";
            echo " </tr>\n";
        }
        echo "</table>";
    } else {
        echo "No employees in database.";
    }

else {
    echo "ERROR: Could not execute $sql. " . print_r
    ($pdo->errorInfo());
}

另请注意,我在将输出写入 HTML 时添加了对 htmlspecialchars() 的调用。始终建议这样做,以便正确编码像 &lt; &gt; &amp; 这样在 HTML 中具有特殊含义的字符,并且如果这些值源自用户输入,则可以避免跨站点脚本漏洞。

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 2014-01-23
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2013-04-21
    • 2014-05-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多