Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO while循环没有返回任何内容_Php_Mysql_Loops_Pdo - Fatal编程技术网

PHP PDO while循环没有返回任何内容

PHP PDO while循环没有返回任何内容,php,mysql,loops,pdo,Php,Mysql,Loops,Pdo,我真的不知道我做错了什么。我正在执行一个查询,以检查名为“newCards”的DB表中是否有记录 使用$count,我检查它返回了多少结果:它显示“1”。但是while循环没有返回任何东西。我看到的只是表顶部的's,但是没有表记录,而$count的结果是'1'。这是正确的,因为在数据库中实际上有1条记录 我怎样才能解决这个问题 <?php $query = $db->prepare("SELECT * FROM `newCards` WHERE `company` = :co

我真的不知道我做错了什么。我正在执行一个查询,以检查名为“newCards”的DB表中是否有记录

使用$count,我检查它返回了多少结果:它显示“1”。但是while循环没有返回任何东西。我看到的只是表顶部的's,但是没有表记录,而$count的结果是'1'。这是正确的,因为在数据库中实际上有1条记录

我怎样才能解决这个问题

<?php
    $query = $db->prepare("SELECT * FROM `newCards` WHERE `company` = :companyID");
    $query->bindParam(":companyID", $enterprise['id'], PDO::PARAM_INT);
    $query->execute();
    $count = $query->rowCount();
    echo $count;

    if(empty($query->fetch())){
        echo "Geen gevonden";
    } else {
?>
                    <table>
                        <tr>
                            <th>Ontvanger</th>
                            <th>Saldo</th>
                            <th></th>
                        </tr>
<?php
        while($result = $query->fetch()){
?>
                        <tr>
                            <td><?php echo $result['id']; ?></td>
                            <td>2</td>
                            <td>3</td>
                        </tr>
<?php
        }
?>
                    </table>
<?php
    }
?>

我认为如果执行fetch in first,那么这就是为什么第二个返回空的原因, 尝试在条件之前将其分配给var,或选中$cont var

$query->fetch已获取记录。所以,下一个fetch调用将获取下一条记录,如果没有记录,则不会获取任何内容。在一条记录的情况下,第二次获取什么也得不到,所以while永远不会启动

您可以将代码更改为:

if($count){?>
<table>
    <tr>
        <th>Ontvanger</th>
        <th>Saldo</th>
        <th></th>
    </tr>
<?php
    while($result = $query->fetch()){
        // show row
    }?>
</table>
} else {
    // echo that no rows found
}

我相信您希望返回一个按列名称索引的数组

->fetch(PDO::FETCH_ASSOC)
更多信息可以在这里找到

因为fetch会获取第一行,即使签入为空,当您使用$result=$query->fetch{时,它也会尝试获取下一行。您可以从$count中检查值,如u_mulder所示,但您应该注意手册中的注释

如果关联PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都能保证此行为,便携式应用程序不应依赖此行为

您可以使用do..while结构并检查取回是否成功。如果将ifempty$query->fetch{with if!$row=$query->fetch{更改为if!$row=$query->fetch,则检查是否有取回的行,因为取回在空结果上返回null。然后,$row就可以使用了,您可以在第一个循环发生之前使用它

<?php 
$query = $db->prepare("SELECT * FROM `newCards` WHERE `company` = :companyID");
$query->bindParam(":companyID", $enterprise['id'], PDO::PARAM_INT);
$query->execute();
$count = $query->rowCount();
echo $count;

if (!$row = $query->fetch()) {
    echo "Geen gevonden";
} else {
    ?>
    <table>
        <tr>
           <th>Ontvanger</th>
           <th>Saldo</th>
           <th></th>
       </tr>
    <?php
    do {
        ?>
        <tr>
           <td><?php echo $result['id']; ?></td>
           <td>2</td>
           <td>3</td>
       </tr>
       <?php
    } while ($result = $query->fetch());
    ?>
    </table>
    <?php
}

请注意,fetch不仅在找不到记录时返回FALSE,而且在查询数据库失败时也返回FALSE,原因不同。而且您无法区分这两种情况。这是PDO中的一个错误。因此,我建议您改用fetchAll。在找不到记录时,fetch返回空数组,或者在查询失败时返回FALSE。两者都存在可以相应地处理赋值。另外,不要在HTML中混合数据访问函数。在上面的php代码中,以数组形式获取所有数据。在构建HTML部件时使用这些数组。@aendeerei如果我记得正确的话,它在空结果集上返回null,而不是false。这不是一个真正的错误,我不相信它是。你就是这样可以循环它,因此当没有更多的结果可获取时,循环将中断。它不符合SQL-92 SQLSTATE标准,但确实如此work@Qirel谢谢你提醒我。我重新检查了我的文档:它肯定返回了一个错误。一个月前我做了很多研究和测试。我注意到了结果。在这是我之前的评论。第二句话是:如果失败,可能会抛出异常:-这意味着,我当时无法测试它。我把它称为一个bug,因为在这种情况下,它不是自然的、令人满意的行为,就像fetchAll一样。我绝对同意使用fetchAll是一个好方法-b但它返回false的结果集为空,这似乎不是一个bug。很久以前有人报告它是一个bug,并按照预期的方式解决了问题…@Qirel我记得,我没有查看任何官方bug帖子,但我不仅检查了我自己,而且检查了许多互联网用户所描述的行为。不,不,重新发布是错误的找不到记录和失败时urn false。为什么?因为,在使用fetch时不会引发异常。因此,如果无法区分无记录和获取失败,您如何处理此问题?只是为了好玩,请测试它并给我反馈,如果您愿意的话。