我试图查看查询返回的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>";

但是我对物体的内部结构很好奇,所以我对它进行了分析,得到了如下结论:
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;"
}

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

最佳答案

PDOStatement的手册页显示了这里的情况。PDOStatement对象只有一个属性,queryString。当var_dump.上的所有其他内容都是一个方法时,您看到的就是这个方法,它被排除在PDOStatement之外。
var_dump(用于PDOStatement implements Traversable的文档)这是您在Traversable时查看行的方式。在内部,foreach实现在对象上PDOStatement时调用的方法。这些方法调用foreach并获取行数据。这就是当您fetch()时看到行的方式,但为什么在foreach中看不到它们。

08-27 16:08