pdo::fetchall的输出问题


output issue with pdo::fetchall

源代码:

<?php
$dsn = 'mysql:dbname=oop;host=localhost;';
$user = 'admin';
$password = 'password';
try {
$pdo = new PDO($dsn, $user, $password);
} catch (PDOException $e)
{
echo 'Connection failed: ' . $e->getMessage();
}
$stmt = $pdo->prepare("select * from be_users");
$stmt->execute();
echo "<pre>";
print_r($stmt->fetchAll());
echo "</pre>";
?>

结果:

Array
(
    [0] => Array
        (
            [username] => tom
            [0] => tom
            [email] => dsfde@gmail.com
            [1] => dsfde@gmail.com
        )
    [1] => Array
        (
            [username] => tom3
            [0] => tom3
            [email] => sdfsdfs@gmail.com
            [1] => sdfsdfs@gmail.com
        )
     ...

问题:

为什么结果不是这样的:

Array
(
    [0] => Array
        (
            [username] => tom
            [email] => dsfde@gmail.com
        )
    [1] => Array
        (
            [username] => tom3
            [email] => sdfsdfs@gmail.com
              )
$dsn = "mysql:host=localhost;dbname=oop;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $user, $password, $opt);

注意提取模式

您使用的是默认的提取样式PDO::FETCH_BOTH,这意味着您将获得一个索引为数字和关联的数组。改为使用PDO::FETCH_ASSOC

print_r($stmt->fetchAll(PDO::FETCH_ASSOC));

您可以在PDOStatement::fetchAll() 的手册页面中找到有关提取样式的更多信息

请注意,您可以为每条语句指定提取模式,也可以为每个PDO实例全局指定提取模式:

$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

您必须手动指定提取样式:

$stmt->fetchAll(PDO::FETCH_ASSOC);