Php PDO准备的语句未返回结果

Php PDO准备的语句未返回结果,php,mysql,database,pdo,prepared-statement,Php,Mysql,Database,Pdo,Prepared Statement,我整天都在试图用mysqli准备好的语句来证明概念,但由于PDO具有绑定值的能力,我决定使用它来证明概念——我相信我需要它们,因为我的查询是动态的 幕后的形式是这样的:-你也可以在这里得到一个概念的想法。我的查询不返回任何结果或错误,只返回一个警告数组到字符串的转换,这是在绑定值时发生的 我还担心我的值绑定不起作用,我不能将它们放在foreach循环中,因为它不能在$stmt变量被调用之前定位,否则会抛出更多错误 我一直在阅读文档和观看教程,但我找不到任何东西显示如何实现查询是动态的模型 我希望

我整天都在试图用mysqli准备好的语句来证明概念,但由于PDO具有绑定值的能力,我决定使用它来证明概念——我相信我需要它们,因为我的查询是动态的

幕后的形式是这样的:-你也可以在这里得到一个概念的想法。我的查询不返回任何结果或错误,只返回一个警告数组到字符串的转换,这是在绑定值时发生的

我还担心我的值绑定不起作用,我不能将它们放在foreach循环中,因为它不能在$stmt变量被调用之前定位,否则会抛出更多错误

我一直在阅读文档和观看教程,但我找不到任何东西显示如何实现查询是动态的模型

我希望我足够清楚,试图让我的头脑了解PDO并准备好总体声明是一个令人沮丧的努力

非常感谢您的帮助。 谢谢

PHP


恐怕你不能像你想做的那样重复这句话。而是使用以下方法访问查询结果:

while ($row = $stmt->fetch([fetch mode, e.g., PDO::FETCH_ASSOC])) {
    print_r($row);
}

关于您得到的数组到字符串转换错误,我怀疑一个或多个POST变量实际上是一个数组。要验证这一假设,请尝试打印文章。

这里是对代码的重写。我使用数组来构建嵌套的AND和OR条件,使用内爆来组合它们,而不是字符串串联序列。我使用数组索引为每个占位符指定不同的名称。我将所有的BETWEEN子句更改为=因为BETWEEN需要两个参数,即范围的开始和结束

if (isset($_POST['platform'], $_POST['bandwidth'], $_POST['price'])){

    $platform = $_POST['platform'];
    $bandwidth = $_POST['bandwidth'];
    $price = $_POST['price'];
    $query = "SELECT * FROM hosts";

    $ands = array();
    $bind_array = array();

    $ors = array();
    foreach($platform as $i => $platform) {
        $ors[] = "platform LIKE CONCAT('%', :platform{$i}, '%')";
        $bind_array[":platform{$i}"] = $platform;
    }   
    if ($ors) {
        $ands[] = "(" . implode(" OR ", $ors) . ")";
    }

    $ors = array();
    foreach($bandwidth as $i => $bandwidth) {
        $ors[] = "bandwidth = :bandwidth{$i}";
        $bind_array[":bandwidth{$i}"] = $bandwidth;
    }   
    if ($ors) {
        $ands[] = "(" . implode(" OR ", $ors) . ")";
    }

    $ors = array();
    foreach($price as $i => $price) {
        $ors[] = "price = :price{$i}";
        $bind_array[":price{$i}"] = $price;
    }

    if ($ors) {
        $ands[] = "(" . implode(" OR ", $ors) . ")";
    }
    if ($ands) {
        $query .= " WHERE " . implode(" AND ", $ands);
    }

    $conn =  new PDO('mysql:host=127.0.0.1; dbname=test', 'root', '');
    $stmt = $conn->prepare($query);

    $stmt->execute($bind_array);

    foreach ($stmt as $row) {
        print_r($row); 
    }
}
更新:

如果某个范围有两个参数price1[]和price2[],请将价格循环更改为:


另外,我知道它们是数组,如果你看一下select boxed链接中的图像,它们允许多个选项从而返回一个数组。我想你的意思是键入:while$row=$stmt->fetch PDO::fetch_ASSOC-对我来说,它不会返回错误。但目前还没有解决更大的问题--这个答案太离题了。PDO语句实现,因此完全可以像OP最初所做的那样使用foreach对其进行迭代。此外,这个答案完全无法识别OP代码中的任何其他严重问题。@eggyal我不知道PDO语句实现了Traversable,并欣赏这些信息。也就是说,您的评论是粗鲁的,因此不合适。您不能多次使用同一个命名占位符。不能将数组绑定到占位符。如果你有占位符,它们需要被绑定——所以不要有条件地绑定。在……之间没有这样的接线员。。。或您应该在foreach语句中为值赋值使用一个变量名,该变量名与它所迭代的数组名不同。您应该激活PDO错误模式,该模式将导致显示错误信息,或者显式测试错误条件。这应该足够让你开始了。谢谢。当您谈论占位符时,是否考虑以下内容:“带宽”介于:带宽或foreach$price作为$price之间?您在查询中对列名使用了错误类型的引号,它们应该是反勾号,而不是单引号。您还需要关注AND和OR的优先级,您可能需要在所有或组周围加括号。您不能编写LIKE%:platform%,因为LIKE的参数必须是字符串。它应该像CONCAT“%”,:platform“%”。我欠你很多,谢谢你的朋友!我会在早上尝试这个,我来自英国。小问题-解析错误:语法错误,第81行意外的'as'T_'as。但是,记事本中的第81行不包含“as”。知道为什么会这样吗?我得试试,我等不及了。哈哈,问得好!它是:while$stmt作为$row{这应该是foreach。我开始将它改为while,然后不完全地将它解开。
if (isset($_POST['platform'], $_POST['bandwidth'], $_POST['price'])){

    $platform = $_POST['platform'];
    $bandwidth = $_POST['bandwidth'];
    $price = $_POST['price'];
    $query = "SELECT * FROM hosts";

    $ands = array();
    $bind_array = array();

    $ors = array();
    foreach($platform as $i => $platform) {
        $ors[] = "platform LIKE CONCAT('%', :platform{$i}, '%')";
        $bind_array[":platform{$i}"] = $platform;
    }   
    if ($ors) {
        $ands[] = "(" . implode(" OR ", $ors) . ")";
    }

    $ors = array();
    foreach($bandwidth as $i => $bandwidth) {
        $ors[] = "bandwidth = :bandwidth{$i}";
        $bind_array[":bandwidth{$i}"] = $bandwidth;
    }   
    if ($ors) {
        $ands[] = "(" . implode(" OR ", $ors) . ")";
    }

    $ors = array();
    foreach($price as $i => $price) {
        $ors[] = "price = :price{$i}";
        $bind_array[":price{$i}"] = $price;
    }

    if ($ors) {
        $ands[] = "(" . implode(" OR ", $ors) . ")";
    }
    if ($ands) {
        $query .= " WHERE " . implode(" AND ", $ands);
    }

    $conn =  new PDO('mysql:host=127.0.0.1; dbname=test', 'root', '');
    $stmt = $conn->prepare($query);

    $stmt->execute($bind_array);

    foreach ($stmt as $row) {
        print_r($row); 
    }
}
    foreach($price1 as $i => $price) {
        $ors[] = "price BETWEEN :pricelow{$i} AND :pricehigh{$i}";
        $bind_array[":pricelow{$i}"] = $price;
        $bind_array[":pricehigh{$i}"] = $price2[$i];
    }