PDO类型的数组及其工作原理

时间:2015-07-25 14:03:24

标签: php arrays pdo

我尝试学习php pdo。我正在读教程。

$smt = $db->prepare("SELECT * FROM table1 WHERE id = :id");
$smt->bindValue(':id', 1);
$smt->execute();
$row = $smt->fetch();

他们说$ row给出了一个关联数组。我搜索关联数组,我希望如果我print_r($ row);我会有这个:

Array (0 => 1, 1 => Column1Row1, 2 => Column2Row1);

但我有这个:

Array ( [id] => 1 [0] => 1 [Column1] => Column1Row1 [1] => Column1Row1 [Column2] => Column2Row1 [2] => Column2Row1 )
这是什么?我应该搜索什么来学习和理解它是如何工作的?我会很感激任何简单的解释。谢谢。

2 个答案:

答案 0 :(得分:2)

这取决于您返回PDO对象的方式。它被称为fetch样式,是fetch方法的输入。您可以通过多种方式返回

如果你这样做,你可以获得第一个对象

$stmt->fetch(PDO::FETCH_NUM);

它会将列作为数字返回

如果你获取关联数组

,你得到第二个
$stmt->fetch(PDO::FETCH_ASSOC);

这也恰好是默认

答案 1 :(得分:2)

您似乎同时获得了关联值和索引值。此行为由PDO::FETCH_*常量控制。这是默认行为。

PDOStatement::fetch() documentation

  

PDO::FETCH_ASSOC:返回按结果集

中返回的列名索引的数组      

PDO::FETCH_BOTH(默认值):返回由结果集中返回的列名和0索引列号索引的数组

     

PDO::FETCH_BOUND:返回TRUE并将结果集中列的值分配给它们与PDOStatement::bindColumn()方法绑定到的PHP变量

     

PDO::FETCH_CLASS:返回所请求类的新实例,将结果集的列映射到类中的命名属性。如果fetch_style包含PDO::FETCH_CLASSTYPE(例如PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),则会根据第一列的值确定类的名称。

     

PDO::FETCH_INTO:更新所请求类的现有实例,将结果集的列映射到类中的命名属性

     

PDO::FETCH_LAZY:合并PDO::FETCH_BOTHPDO::FETCH_OBJ,在访问时创建对象变量名称

     

PDO::FETCH_NAMED:返回一个与PDO::FETCH_ASSOC格式相同的数组,但如果有多个具有相同名称的列,则该键引用的值将是所有值的数组在具有该列名称

的行中      

PDO::FETCH_NUM:返回一个数组索引的数组,该数组在结果集中返回,从第0列开始

     

PDO::FETCH_OBJ:返回一个匿名对象,其属性名对应于结果集中返回的列名

所以你想要做的就是使用这些常量之一:

$smt = $db->prepare("SELECT * FROM table1 WHERE id = :id");
$smt->bindValue(':id', 1);
$smt->execute();
$row = $smt->fetch(PDO::FETCH_ASSOC);

您也可以像这样设置默认提取模式:

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$smt = $db->prepare("SELECT * FROM table1 WHERE id = :id");
$smt->bindValue(':id', 1);
$smt->execute();
$row = $smt->fetch();