PHP MySql Fetch生成“false”而不是数据集

时间:2018-02-08 18:09:56

标签: php mysql pdo

我正在尝试为图表创建一个聚合数据集(每X行的最小值和最大值),但我没有得到我期望的结果。我可以从PHPMyAdmin运行查询,它工作得很好,我得到一个有两列的行。但是,当我使用PDO时,它只会产生false而不是我期望的数组。

// Get an min/max aggregated dataset
$aggregatedData = [];
echo (string)$count . "<br>"; // DEBUG

$query = "SELECT MIN(channel1) AS MinVal, MAX(channel1) AS MaxVal FROM "
        . "(SELECT channel1 FROM datacache WHERE fileId = ? ORDER BY time LIMIT ?,?) subset"; 

$sql = $conn->prepare($query);

while ($offset < $count)
{
    $sql->execute([$chart, $offset, $aggregate]);
    echo $chart . ", " . $offset . ", " . $aggregate . "<br>"; // DEBUG

    $data = $sql->fetch(PDO::FETCH_ASSOC);
    echo json_encode($data)."<br>"; // DEBUG

    array_push($aggregatedData, $data["MinVal"], $data["MaxVal"]);
    $offset += $aggregate;
}

echo json_encode($aggregatedData); //AJAX Export

我的调试输出如下(简要摘录)

1000004
37, 0, 50
false
37, 50, 50
false
37, 100, 50
false
37, 150, 50
false
37, 200, 50
false

注意:这不像建议的那样重复。

1 个答案:

答案 0 :(得分:2)

PDOStatement::execute()将所有数组值视为字符串PDO::PARAM_STR,而LIMIT ?,?值不需要为整数PDO::PARAM_INT

您可能需要使用PDOStatement::bindParam()代替PDO::PARAM_INT。  此外,您可以在循环外执行此操作一次,因为变量由引用绑定:

$sql->bindParam(1, $chart, PDO::PARAM_INT);  // or whatever it is
$sql->bindParam(2, $offset, PDO::PARAM_INT);
$sql->bindParam(3, $aggregate, PDO::PARAM_INT);

while ($offset < $count)
{
    $sql->execute();
    $data = $sql->fetch(PDO::FETCH_ASSOC);
    array_push($aggregatedData, $data["MinVal"], $data["MaxVal"]);
    $offset += $aggregate;
}