【问题标题】:var_dump of PDOStatement Object is not showing returned dataPDOStatement 对象的 var_dump 未显示返回的数据
【发布时间】:2015-03-17 18:57:22
【问题描述】:

我正在尝试查看我的查询返回的 PDOStatement 对象的结构:

$sql="SELECT co.CompanyId, co.Name, co.Address, co.City, co.State, ctry.NameEnglish, co.PostalCode FROM company AS co LEFT JOIN country AS ctry ON ctry.CountryId = co.CountryId ORDER BY Name;";
$result=$conn->query($sql);

查询有效,因为我可以嵌套一些 foreach 语句并通过执行以下操作来显示六行数据。

$firstRow=true;
echo '<table>';
foreach ($result as $rowId => $rowData) {
    if ($firstRow) {
        echo "<thead><tr><th>Row Number</th>";
        foreach ($rowData as $fieldId => $fieldData) {
            echo "<th>$fieldId</th>";
        }
        echo "</tr></thead>";
        $firstRow=false;
    }
    echo "<tr><td>$rowId</td>";
    foreach ($rowData as $fieldId => $fieldData) {
        $fieldData=str_replace("\n","<br>",$fieldData);
        echo "<td>$fieldData</td>";
    }
    echo "</tr>";
}
echo "</table>";

但是我对$result这个对象的内部结构很好奇,所以我var_dump'ed它并得到了这个:

object(PDOStatement)#4 (1) {
    ["queryString"]=>
        string(185) "SELECT co.CompanyId, co.Name, co.Address, co.City, co.State, ctry.NameEnglish, co.PostalCode FROM company AS co LEFT JOIN country AS ctry ON ctry.CountryId = co.CountryId ORDER BY Name;"
}

为什么var_dump 不显示与行和字段关联的数组?

【问题讨论】:

  • 你做到了吗:$result = $result-&gt;fetchAll();?然后var_dump($result);
  • 没有。我在第一个代码段中做了两行,然后是var_dump($result);。我没有在代码中使用任何显式的fetches,甚至显示6行。
  • 根据文档 (php.net/PDOStatement),PDOStatement 对象上的唯一属性是 queryString,如您所见。它也是implements Traversable,这就是让你foreach 超过它的原因。当您这样做时,PHP 会调用对象上的方法。这些方法获取行数据。这些行不是对象的属性,因此它们不出现在var_dump 中。
  • 啊,谢谢,火箭。那么,我想知道如何在不执行任何 fetches 的情况下获取 foreach 语句中的行和字段?我将发布该代码。
  • @JonathanM:是的,基本上。我不知道它是否还在联系数据库,或者它是否在内存中缓冲了完整的结果集。

标签: php mysql pdo var-dump


【解决方案1】:

PDOStatement 的手册页显示了这里发生的情况。 PDOStatement 对象只有一个属性queryString。这就是您在var_dump. 时看到的内容,PDOStatement 上的所有其他内容都是一种方法,它们被排除在 var_dump 之外。

PDOStatement implements TraversableTraversable 的文档。)这就是您在foreach 时能够看到行的方式。在内部,PDOStatement 实现了当您在对象上foreach 时调用的方法。这些方法调用fetch() 并获取行数据。这就是您在 foreach 时看到行的方式,但为什么在 var_dump 中看不到它们。

【讨论】:

  • 很好的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2012-04-17
  • 2016-06-15
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多