【问题标题】:PDO equivalent of mysql_fetch_arrayPDO 等效于 mysql_fetch_array
【发布时间】:2014-10-01 13:22:22
【问题描述】:

我正在努力处理与以下查询等效的 PDO,它计算了队列中有多少新项目并计算出完成它们的周数,从而给了我一个工作堆栈时间表:-

//count new to be made
$new = "SELECT FLOOR(SUM(TotalNew) / 7) AS Weeks FROM 
(
SELECT YEAR( date_ready ) , MONTHNAME( date_ready ) , 
STATUS , COUNT( 
STATUS ) AS TotalNew
FROM new
WHERE 
(STATUS =  'new'
OR STATUS =  'progress') 
GROUP BY YEAR( date_ready ) , MONTHNAME( date_ready ) , 
STATUS ORDER BY YEAR( date_ready ) , MONTH( date_ready ) 
) Total";
$count = mysql_query($new) or die(mysql_error());

while($row = mysql_fetch_array($count)) {
$weeks = $row['Weeks'];
}

我要的是这个......

//count new to be made 
$new = "SELECT FLOOR(SUM(TotalNew) / 7) AS Weeks FROM 
(
SELECT YEAR( date_ready ) , MONTHNAME( date_ready ) , 
STATUS , COUNT( 
STATUS ) AS TotalNew
FROM new
WHERE 
(STATUS =  'new'
OR STATUS =  'progress') 
GROUP BY YEAR( date_ready ) , MONTHNAME( date_ready ) , 
STATUS ORDER BY YEAR( date_ready ) , MONTH( date_ready ) 
) Total";


//get count data fromdb
$stmt = $dbLink->prepare($new);
$stmt->execute();

如果我添加 $count = $stmt->fetchAll();

并转储变量,我得到 数组(1){[0]=>数组(2){[“周”]=>字符串(2)“16”[0]=>字符串(2)“16”}}

如果我替换

$count = $stmt->fetchAll();

while ($row = $stmt->fetchAll())  {
echo "about to print";
echo "<br>";
print_r($row);
echo "<br>";
echo $row['Weeks'];
echo "<br>";
echo "printed";
}

我得到了数组的不同变体 - Array ( [0] => Array ( [Weeks] => 16 [0] => 16 ) ),但不是我想要的输出,即与 Weeks 相关的数字查询。我尝试使用各种 echo / print_r 进行错误检查,以尝试查看输出与预期输出匹配的位置。

查询工作正常,原始 mysql_query 版本也工作,所以我显然误解了 PDO 如何处理数组以及如何从数组中拉出一个项目。

我看过 How to use PDO to fetch results array in PHP?how to properly use while loop in PDO fetchAll 并尝试了各种组合无济于事。老实说,即使某些东西随机起作用,我也更想知道原因,并开始质疑我对数组的理解。

和往常一样,我会很感激一两个指针吗?

非常感谢, 杰森

【问题讨论】:

  • here
  • 我认为你在滥用 fetchall。它以数组数组的形式返回整个结果集(每个内部数组代表集合中的一行),然后关闭结果集,因此对 fetchall 的后续调用将不会返回任何内容。您需要将第一次调用 fetchall 分配给一个变量并使用该变量,直到您完成结果。

标签: php mysql arrays pdo


【解决方案1】:

您可能会想要使用:

while ($row = $stmt->fetch(PDO::FETCH_ASSOC))  {
    echo "about to print";
    echo "<br>";
    print_r($row);
    echo "<br>";
    echo $row['Weeks'];
    echo "<br>";
    echo "printed";
}

PDO::FETCH_ASSOC 部分使系统返回一个关联数组

更多参数 - PHP PDO fetch()

【讨论】:

  • fetchall 返回一个集合中的所有行。 while 方法意味着您应该改用 fetch。
【解决方案2】:

我想你正在寻找:

while($row = $stmt->fetch(/* PDO::FETCH_ASSOC */)) {
    // do loop stuff
}

PDO::fetchAll() 返回所有查询结果的关联数组(二维数组)。根据 PHP 文档,不建议将这用于大型结果集。 PDO::fetch() 从结果集中只返回一行并模仿 mysql_fetch_array()。详情请见http://php.net/manual/en/function.mysql-fetch-array.php

【讨论】:

  • 谢谢。真的就这么简单:)也感谢您的解释,现在说得通了。
  • 为了澄清,PDO::FETCH_ASSOC 被注释掉了,因为默认是PDO::FETCH_BOTH “返回一个由列名和 0 索引的列号索引的数组” (@ 987654322@)
【解决方案3】:

fetchAll 返回一个包含所有结果的数组。所以试试:

foreach($stmt->fetchAll() as $row) {
    // ...
}

【讨论】:

  • 感谢您的快速回复-出于好奇,我会尝试这样做以加深理解。我只使用标记的解决方案,因为它更容易编辑我现有的代码以方便。不过谢谢。
【解决方案4】:

您只需要一个结果,所以只需使用fetchColumn

$stmt = $dbLink->prepare($new);
$stmt->execute();
$weeks = $stmt->fetchColumn();

http://php.net/manual/en/pdostatement.fetchcolumn.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2014-01-20
    • 2015-10-12
    • 1970-01-01
    • 2018-08-18
    • 2012-08-22
    相关资源
    最近更新 更多