fetchall()之后的PDO fetchObject().返回假

 美晶婚纱-璐璐_723 发布于 2023-02-02 19:42

我是PHP的新手.我试图以表格的形式显示员工的详细信息.但是while($row = $result->fetchObject())部分没有执行,因为$result->fetchObject()返回false.它与它有关$rows = $result->fetchAll();吗?这是代码片段.

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

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

    if ($num_rows > 0) {
        echo "\n";
        echo " \n";
        echo " \n";
        echo " \n";
        echo " \n";    
        echo " \n";

        while($row = $result->fetchObject()) {
            echo " \n";
            echo " \n";
            echo " \n";
            echo " \n";
            echo " \n";
        }
        echo "
IDNameDesignation
" . $row->id . "" . $row->name . "" . $row->designation . "
"; } else { echo "No employees in database."; } else { echo "ERROR: Could not execute $sql. " . print_r ($pdo->errorInfo()); }

Michael Berk.. 7

PDO的文档是在这个有点混乱,但PDOStatement::fetch()方法和其表弟fetchAll()false当没有更多的行可返回.文档说它会false 在失败时返回,并且缺少可用行会被视为失败.

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

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

然后,您可以while使用foreach已有$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 "\n";
        echo " \n";
        echo " \n";
        echo " \n";
        echo " \n";    
        echo " \n";

        // $rows now has everything you need, just loop over it
        foreach ($rows as $row {
            echo " \n";
            echo " \n";
            echo " \n";
            echo " \n";
            echo " \n";
        }
        echo "
IDNameDesignation
" . htmlspecialchars($row->id) . "" . htmlspecialchars($row->name) . "" . htmlspecialchars($row->designation) . "
"; } else { echo "No employees in database."; } else { echo "ERROR: Could not execute $sql. " . print_r ($pdo->errorInfo()); }

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

1 个回答
  • PDO的文档是在这个有点混乱,但PDOStatement::fetch()方法和其表弟fetchAll()false当没有更多的行可返回.文档说它会false 在失败时返回,并且缺少可用行会被视为失败.

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

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

    然后,您可以while使用foreach已有$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());
    }
    

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

    2023-02-02 19:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有