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