【问题标题】:How to output array from prepared pdo如何从准备好的 pdo 输出数组
【发布时间】:2014-02-01 02:51:52
【问题描述】:

我正在尝试编写一个准备好的语句,该语句从一组绑定字段中收集数据并将它们输出到一个名为 $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(注意,这里的代码是我的代码的副本。转储是一个副本和删除了字段名称的帖子。)

array(1) { [0]=> array(2) { ["field1, field2, field3"]=> string(22) "field1, field2, field3" [0]=> string(22) "field1, field2, field3" } } Array ( [field1] => [field2] => [field3] => )

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

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

【问题讨论】:

  • 你能var_dump($result); 吗?
  • 字段是否为空?
  • @ShankarDamodaran 很有趣,我以后肯定会用它来调试!更新了帖子!
  • 您需要以array() 的身份执行,而不是您现在的方式。
  • @Jack 哎呀,是的,他们会的。这段代码是删除了所有关键信息的副本。我已经更新了它以反映我的代码,它确实有一个数据库!

标签: php html mysql pdo prepared-statement


【解决方案1】:

假设 user_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,你为什么会有一个 user_id

【讨论】:

  • 我已经更新了原始帖子,以反映我的和这个副本之间的一些不一致之处。变量 $user_id 是主键。关于您的代码的一个小问题。这段代码对 sql 注入安全吗?我认为插入到查询中的代码如果通过 bindValue() 会更安全。也许 pdo 语句 prepare() 可以完成这项工作?谢谢
  • 这很安全,我的语句和你的一样,但是如果你想指定类型这么多我推荐$stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); 或者因为 user_id 是一个整数你可以像上面一样准备语句并执行为@ 987654323@ 但是好吧,你明白了
【解决方案2】:

首先,方法名为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);

【讨论】:

    【解决方案3】:

    尝试这样做:

    $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);
    

    【讨论】:

    • 糟糕,这里发布的代码是复制品。我忘了发布 $data[],而不是 $data。无论如何,目前正在处理这些回复,感谢您的输入:-)
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2012-08-05
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多