2016-11-29 118 views
1

取我有这个疑问:执行两个不同的同一查询结果

$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来实现我的目标。

+0

也许使用第二个变量$ second = $ all;或者$ second = clone($ all)? – Fky

+0

也许你可以使用'while' +'fetch'并将所有元素放在适当的数组中? –

+0

@fky这不起作用 –

回答

3

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

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

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

这是一个非常好的主意。也感谢链接。我搜索PDO获取模式,但没有注意到这一个 –

3

感觉就像你这个过于复杂。这很容易在PHP中完成,如果您只使用PDOStatement::fetch,则不需要担心数组操作;如果你有很多数据,它也会对你的内存使用更友好。

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

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

谢谢!我同意你的看法,这很容易以这种方式完成(实际上这是我设置的代码)。但是深入挖掘了PDO获取模式,并尝试在这个代码中找到替代方案 –

+0

@LelioFaieta诚实地说,这可能是最好的方法,尽管它不是很奇特,因为它几乎肯定是最低内存的方式用法。接受的答案使用了两倍。 – lonesomeday

+0

是的。我知道记忆。被接受的答案是回答这个问题的答案,但我同意你的方式(也是因为我必须管理大量的行) –

2

也许你可以用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'); 
相关问题