PDO Prepared Statement不返回结果

时间:2014-01-31 23:52:25

标签: php mysql database pdo prepared-statement

我一直在尝试使用mysqli准备好的语句整天一起获得概念验证,但由于它具有绑定值的能力,因此决定使用PDO - 我相信我需要它们,因为它的动态性质我的疑问。

幕后形式如下:http://pasteboard.co/k6H0cVq.png - 您也可以在这里了解这个概念。我的查询没有返回任何结果或错误,只是警告Array to string conversion - 在绑定值时发生。

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

我一直在阅读文档和观看教程,但我找不到任何能说明如何实现查询动态模型的内容。

我希望我足够清楚,这是一个令人沮丧的努力,试图让我的头脑围绕PDO并准备好一般性的陈述。

任何帮助 赞赏。 谢谢!

PHP

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

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

    foreach($platform as $platform) {
        $query .= " 'platform' LIKE %:platform% OR";
    }   
    $query = substr($query, 0, -2); 

    foreach($bandwidth as $bandwidth) {
        $query .= " AND 'bandwidth' BETWEEN :bandwidth OR";
    }   
    $query = substr($query, 0, -2); 

    foreach($price as $price) {
        $query .= " AND 'price' BETWEEN :price OR";
    }   
    $query = substr($query, 0, -2); 

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

    if ($_POST['platform']){
        $stmt->bindValue(':platform', $_POST['platform']);  
    }

    if ($_POST['bandwidth']){
        $stmt->bindValue(':bandwidth', $_POST['bandwidth']);    
    }   

    if ($_POST['price']){
        $stmt->bindValue(':price', $_POST['price']);    
    }   

    $stmt->execute();

    foreach($stmt as $row) {
        print_r($row); 
    }
}

2 个答案:

答案 0 :(得分:1)

这是对代码的重写。我使用数组来构建嵌套的ANDOR条件,使用implode来组合它们,而不是字符串连接的序列。我使用数组索引为每个占位符指定一个不同的名称。我将您的所有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[],请将price循环更改为:

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

答案 1 :(得分:-2)

我担心你不能像你想要的那样迭代声明。而是使用fetch方法访问查询结果:

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

关于“数组到字符串转换”错误,我怀疑一个或多个POST变量实际上是一个数组。要测试此假设,请尝试print_r($ _ POST)。