代码之家  ›  专栏  ›  技术社区  ›  user2191259

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

  •  1
  • user2191259  · 技术社区  · 8 年前

    我试图创建一个用于绘图的聚合数据集(每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 回复  |  直到 8 年前
        1
  •  1
  •   AbraCadaver    8 年前

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

    你可能需要使用 PDOStatement::bindParam() 具有 PDO::PARAM\u 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;
    }