【问题标题】:perform two different fetch on the same query result对同一个查询结果执行两次不同的 fetch
【发布时间】:2016-11-29 15:32:59
【问题描述】:

我有这个问题:

$all = $dbh->query("SELECT DISTINCT movimenti.nome, SUM(movimenti_carta.importo)
FROM movimenti_carta JOIN movimenti ON movimenti_carta.movimento=movimenti.id
WHERE month(data)='$mese' AND year(data)='$anno' GROUP BY movimenti.nome");

它从我的数据库中检索两列。我想要做的是将每一列放在一个单独的数组中。 如果我这样做:

$labels=$all->fetchAll(PDO::FETCH_COLUMN,0);

我以我正在寻找的格式获取第一列的值。 我试着做:

$values=$all->fetchAll(PDO::FETCH_COLUMN,1);

在第一次获取之后,但 $all 未被第一次获取设置,结果是 $values 是一个空数组(我很确定这一点,但确实试了一下)。 在获取包含两列的数组后,我可以在 php 中构建数组,但我想知道如何使用 PDO api 实现我的目标。

【问题讨论】:

  • 也许使用第二个变量 $second = $all;或 $second = clone($all) ?
  • 也许您可以使用while + fetch 并将所有元素放入适当的数组中?
  • @fky 这不起作用
  • @u_mulder 你的意思是一个获取然后创建两个数组吗?是的,我可以做到,但我希望从一开始就创建两个数组。也许这是不可行的,我必须在 php 中操作数组
  • 我想这是不可行的。

标签: php arrays pdo


【解决方案1】:

当然它永远不会以这种方式工作,因为 fetchAll() 只返回一次数据。

我能想到的唯一想法是PDO::FETCH_KEY_PAIR常量:

$data = $all->fetchAll(PDO::FETCH_KEY_PAIR);
$labels = array_keys($data);
$values = array_values($data);

【讨论】:

  • 这是个好主意。也感谢您的链接。我搜索了 PDO 获取模式,但没有注意到这个
【解决方案2】:

感觉你把这件事复杂化了。在 PHP 中很容易完成,如果你只使用PDOStatement::fetch,你不需要担心数组操作;如果你有很多数据,它也会对你的内存使用更友好。

$labels = [];
$values = [];

while ($row = $all->fetch(PDO::FETCH_NUM)) {
    $labels[] = $row[0];
    $values[] = $row[1];
}

【讨论】:

  • 谢谢!我同意你的看法,这很容易通过这种方式完成(实际上这是我设置的代码)。但是正在更深入地研究 PDO 获取模式,并且确实尝试使用该代码的替代方法
  • @LelioFaieta 老实说,这可能是最好的方法,尽管它不是很奇特,因为几乎可以肯定它是内存使用率最低的方法。接受的答案使用两倍。
  • 是的。我知道内存。接受的答案是回答问题的答案,但我同意你的方法是遵循(也因为我必须管理大量行)
【解决方案3】:

也许你可以使用array_column

$all = $dbh->query("
    SELECT DISTINCT movimenti.nome, SUM(movimenti_carta.importo) AS importo
    FROM movimenti_carta 
    JOIN movimenti ON movimenti_carta.movimento=movimenti.id
    WHERE month(data)='$mese' 
    AND year(data)='$anno' 
    GROUP BY movimenti.nome
");
// set of results indexed by column name
$results = $all->fetchAll(PDO::FETCH_ASSOC);
// set of values from the column 'nome'
$nomes = array_column($results, 'nome');
// set of values from the column 'importo'
$importos = array_column($results, 'importo');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多