PDO显示的结果超出预期

时间:2012-10-02 13:48:47

标签: php pdo

我有一个简单的表,其中包含一个字段“id”,当我执行此代码时......

$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass);

$sql = 'SELECT * FROM logolist';
$q = $dbh->query($sql);
while($r = $q->fetch()){ print_r($r); }

...我得到了这个输出:

Array
(
    [ID] => 2
    [0] => 2
)
Array
(
    [ID] => 4
    [0] => 4
)

如您所见,字段“ID”下有[0]。如果我添加更多字段,我会在数组中获得更多额外元素。这就像每个字段输出它的值2次。

为什么会这样?

5 个答案:

答案 0 :(得分:4)

对于没有任何属性的fetch(),这是正常的(默认设置为FETCH_BOTH)。它的作用类似于旧mysql_fetch_array()0是数字索引。

如果您切换到关联,您将只获得字段:

while($r = $q->fetch(PDO::FETCH_ASSOC)){
    print_r($r);
}

PDOStatement::fetch - 适用于所有风格。

答案 1 :(得分:1)

您正在获取数字和关联。

检查PDO文档:

http://php.net/manual/en/pdostatement.fetch.php

(您正在使用PDO :: FETCH_BOTH(默认))

答案 2 :(得分:1)

  while($r = $q->fetch(PDO::FETCH_ASSOC)){ print_r($r); }

PDO::FETCH_ASSOC只能使用关联键获取值,而不使用数字索引。

答案 3 :(得分:1)

fetch给出数值和关联数组

http://www.php.net/manual/en/pdostatement.fetch.php

您可以使用FETCH_ASSOC仅获取关联数组

答案 4 :(得分:1)

我遇到了一个获取MySQL结果循环的做法,我想知道为什么人们会这样做,所以我会写下这个答案并试着澄清一些事情。

1)您不需要循环来获取结果 2)您得到结果重复的原因是因为您正在接收关联数组和基于索引的数组。这是默认行为。

你可以做的是:

$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass);

// Tell PDO to throw exceptions in case of a query error
$dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try
{
    $result = $dbh->query("SELECT * FROM logolist")->fetchAll(PDO::FETCH_ASSOC); 

    // Your result is now in $result array which is associative. 
    // If it's empty - no results were found. 
    // In case of an error, you'd go to catch block of the code and you'd echo out an error. 
}
catch(PDOException $e)
{
    echo "Error reported: ". $e->getMessage();
}