Php 如何从准备好的pdo输出数组

Php 如何从准备好的pdo输出数组,php,html,mysql,pdo,prepared-statement,Php,Html,Mysql,Pdo,Prepared Statement,我试图编写一个准备好的语句,它从一组绑定字段中收集数据,并将它们输出到名为$data的数组变量 global $db; $user_id = (int)$user_id; $fields = 'field1, field2, field3'; $stmt = $db->prepare("SELECT :fields FROM users WHERE user_id = :user_id"); $stmt->bindValue(':user_id', $user_id); $stmt-

我试图编写一个准备好的语句,它从一组绑定字段中收集数据,并将它们输出到名为
$data
的数组变量

global $db;
$user_id = (int)$user_id;
$fields = 'field1, field2, field3';
$stmt = $db->prepare("SELECT :fields FROM users WHERE user_id = :user_id");
$stmt->bindValue(':user_id', $user_id);
$stmt->bindValue(':fields', $fields);
$stmt->execute();
$result = $stmt->fetchall();

foreach ($result as $row) {
    $data[] = array(
        'field1' => $row['field1'], 
        'field2' => $row['field2'], 
        'field3' => $row['field3']
    );
}

print_r($data);
然而我得到的只是

Notice: Undefined index: field1 in C:\\\\\\.php on line #
Notice: Undefined index: field2 in C:\\\\\\.php on line #
Notice: Undefined index: field3 in C:\\\\\\.php on line #
Array ( [field1] => [field2] => [field3] => )
这里是vardump(注意,这里的代码是我的代码的副本..dump是一个复制和发布,删除了字段名。)

这可能很简单。。但我正处于从错误中吸取教训的阶段


另外,我想将
$field
变量从字符串更改为数组。我如何绑定一个数组来处理每一段数据,然后将其输出到
$data
数组中?

假设user\u id是主键,您不需要foreach循环

$fields = 'field1, field2, field3';
$stmt = $db->prepare("SELECT $fields FROM users WHERE user_id = ?");
$stmt->execute(array(1));
$result = $stmt->fetch(PDO::FETCH_ASSOC); 

$data = array(
    'field1' => $result['field1'], 
    'field2' => $result['field2'], 
    'field3' => $result['field3']
);

print_r($data);
我的意思是,如果两个用户可以拥有相同的id,为什么您会拥有一个用户id呢

$result = $stmt->fetch(PDO::FETCH_ASSOC);
如果要使用字段名作为键,则需要使用
PDO::FETCH_ASSOC

我不知道您试图输出的确切格式,但每次foreach循环时,您都会覆盖$data数组

如果只提取一条记录(看起来就是这样),则不需要循环,只需输出数组即可

$result = $stmt->fetch(PDO::FETCH_ASSOC);

    $data = array(
        'field1' => $result['field1'], 
        'field2' => $result['field2'], 
        'field3' => $result['field3']
    );

print_r($data);

首先,该方法名为
fetchAll
,在本例中与此无关,因为您使用的ID可能导致返回一行而不是更多行。在这种情况下,您应该使用
fetch
检索结果。此外,还必须说明希望以何种形式获取数组。是否需要一个关联数组(在本例中为数字数组)?然后在
fetch
方法中,您需要指定一个PDO常量来指定数组类型(
PDO::fetch_ASSOC

也不需要像以前那样绑定字符串,直接将字段名放在查询中是安全的

$stmt = $db->prepare("SELECT field1, field2, field3 FROM users WHERE user_id = 1");
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

$data = array(
    'field1' => $row['field1'], 
    'field2' => $row['field2'], 
    'field3' => $row['field3']
);

print_r($data);

可以
var\u dump($result)?字段是空的吗?@ShankarDamodaran很有趣,我将来一定会用它来调试!更新了帖子!您需要以
数组()的形式执行。
而不是现在的方式。@Jack Oops,是的,他们会的。这段代码是删除了所有关键信息的副本。我已经更新了它,以反映我的代码,它确实有一个数据库!我已经更新了原始帖子,以反映我的帖子和这个复制品之间的一些不一致之处。变量$user\u id是主键。关于代码的一个小问题。这段代码不受sql注入的影响吗?我认为,如果查询通过bindValue(),那么插入查询的代码会更安全。也许pdo语句prepare()起作用?谢天谢地,我的语句和你的语句一样,但如果你想指定这么多类型,我建议你使用
$stmt->bindParam(':user\u id',$user\u id,PDO::PARAM\u INT)
或者,由于user_id是一个整数,您可以像上面一样准备语句,并以
$stmt->execute(array(intval($user_id)))的形式执行。
但是,您得到了ideaOops,这里发布的代码是一个副本。我忘记发布$data[],而不是$data。无论如何,目前正在处理这些回复,感谢您的输入:-)
$stmt = $db->prepare("SELECT field1, field2, field3 FROM users WHERE user_id = 1");
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

$data = array(
    'field1' => $row['field1'], 
    'field2' => $row['field2'], 
    'field3' => $row['field3']
);

print_r($data);