1

我有一个带有一个字段“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 次。

为什么是这样?

4

5 回答 5

4

这是fetch()没有任何属性的正常情况(FETCH_BOTH默认设置)。它像旧的一样工作mysql_fetch_array()0是数字索引。

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

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

PDOStatement::fetch - 适用于所有样式。

于 2012-10-02T13:52:54.933 回答
1

您正在获取数字和关联。

检查 PDO 文档:

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

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

于 2012-10-02T13:52:05.737 回答
1
  while($r = $q->fetch(PDO::FETCH_ASSOC)){ print_r($r); }

PDO::FETCH_ASSOC只会获取带有关联键的值,没有数字索引。

于 2012-10-02T13:53:55.097 回答
1

fetch给出数值和关联数组

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

您只能FETCH_ASSOC用于获取关联数组

于 2012-10-02T13:56:10.277 回答
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();
}
于 2012-10-02T13:56:15.927 回答