PHP PDO while循环没有返回任何东西

时间:2017-09-20 21:00:21

标签: php mysql loops pdo

我真的无法弄清楚我在这里做错了什么。我正在进行查询以检查数据库表中是否有名为“newCards”的记录。

使用$count我检查它返回了多少结果:它显示我'1'。但是while循环并没有返回任何东西。我看到的唯一的事情是表格顶部的<th>,但没有表格记录,而$count正在给出“1”。这是真的,因为DB中实际存在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
    }
?>

4 个答案:

答案 0 :(得分:1)

$query->fetch()已经抓取记录。因此,如果没有记录,则下次拨打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
}

答案 1 :(得分:0)

我认为首先执行fetch if,这就是为什么second返回为空, 尝试在条件之前将其分配给var或检查$ cont var

答案 2 :(得分:0)

我相信你想要使用

返回一个由列名索引的数组
public class ContractsViewModel : ViewModel, ISelectedObjectDependent
{
    // only Interface members shown here

    public int ExecutionOrder { get { return 4; } }

    public bool NeedsRefresh()
    {
        return _isVisible;
    }
    public int QueueCount { get; set; }

    public void SelectedObjectsChanged()
    {
        ContractsItemsSource.Refresh();
        RaisePropertyChanged("ContractCount");
        RaisePropertyChanged("InfoText");
        QueueCount--;
    }
}

可在此处找到更多信息http://php.net/manual/en/pdostatement.fetch.php

答案 3 :(得分:0)

由于fetch()获取第一行,即使在检入empty()时,它也会在您使用while($result = $query->fetch()){时尝试获取下一行。您可以检查$count的值(如u_mulder所示),但是您应该注意rowCount()手册中的注释(强调我的)

  

如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。 但是,并不保证所有数据库都会出现这种情况,不应依赖于便携式应用程序。

您可以使用do..while结构并检查提取是否成功。如果您使用if(empty($query->fetch())){更改if (!$row = $query->fetch()) {,则检查是否有提取的行(因为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
}