【问题标题】:How can I create an Array from mySQL database?如何从 mySQL 数据库创建数组?
【发布时间】:2016-03-30 09:56:53
【问题描述】:
$sql = "SELECT name FROM people WHERE id = '$id'";  
$array = array();       
$q = $pdo->prepare($sql);
$q->execute();
foreach ($pdo->query($sql) as $row) {
$array[] = $row;
}

我的结果是:

array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(4) "fred"
    [0]=>
    string(4) "fred"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(3) "sam"
    [0]=>
    string(3) "sam"
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(4) "alan"
    [0]=>
    string(4) "alan"
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(63) "john"
    [0]=>
    string(63) "john"
  }
}

但我需要:

Array
(
    [fred] => fred
    [sam] => sam
    [alan] => alan
    [john] => john
)

我试过例如:

foreach ($pdo->query($sql) as $key => $row) {..

还有

foreach ($pdo->query($sql) as $row) {
$array[] = $row;
$row = array_combine(array_values($row), array_values($row));
}

但我总是得到相同的结果...

【问题讨论】:

    标签: php arrays pdo


    【解决方案1】:

    使用fetchAll

    $q = $pdo->prepare($sql);
    $q->execute();
    $result = $q->fetchAll();
    print_r($result);
    

    【讨论】:

    • 另外你必须指定获取模式。
    • 谢谢! :) 这种方法对阿什瓦尼斯的建议有一些好处吗,还是看个人喜好选择哪种方法
    • 这在 PDO 的构建功能中,您可以直接获得您的设计结果,而无需使用任何循环
    • @fusion3k 在这种情况下不使用任何模式
    • fetchAll() 本身就使用了循环。
    【解决方案2】:

    使用 fetchAll()

    但不是普通的,而是带有一个名为 PDO::FETCH_COLUMN 的秘密参数

    $sql = "SELECT name FROM people WHERE id = ?";  
    $q = $pdo->prepare($sql);
    $q->execute([$id]);
    $array = $q->fetchAll(PDO::FETCH_COLUMN);
    

    它会给你一个像这样名字的一维数组

    Array
    (
        [0] => fred
        [1] => sam
        [2] => alan
        [3] => john
    ) 
    

    请注意,您正在使用准备好的语句完全错误的方式使您的代码容易受到 SQL 注入的攻击。在上面的代码中是固定的。

    如果你坚持要同时获取 key 和 value,那么修改你的代码如下

    $sql = "SELECT name, name FROM people WHERE id = ?";  
    $q = $pdo->prepare($sql);
    $q->execute([$id]);
    $array = $q->fetchAll(PDO::FETCH_KEY_PAIR);
    

    它会按照你的要求为你提供准确的数组

    【讨论】:

    • 出于好奇,你选择哪一个?顺便说一下,PDO 中还有其他的魔法模式,值得一看。也许我应该做一个备忘单......
    • 我选择了第二种解决方案。你能告诉我为什么我的陈述不安全吗?
    • 因为您将变量直接添加到查询中,这使得它容易受到 SQL 注入。
    【解决方案3】:

    进行以下更改:

    foreach ($pdo->query($sql) as $row) {
        $array[$row['name']] = $row['name'];
    }
    

    【讨论】:

    • 太棒了!工作得很好:o)
    • 我很高兴它有帮助,我会寻求您的批准/接受我的回答:-)
    • @Jarla 请批准答案,以便人们可以依赖它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2014-02-04
    • 2011-09-11
    • 2010-10-17
    • 2012-05-15
    相关资源
    最近更新 更多