簡體   English   中英

PDO准備好的語句未返回結果

[英]PDO Prepared Statement not returning results

我一直在嘗試使用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); 
    }
}

這是您的代碼的重寫。 我使用數組來構建嵌套的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); 
    }
}

更新:

如果您有兩個參數price2[] 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];
    }

恐怕您在嘗試執行時無法遍歷該語句。 而是使用fetch方法訪問查詢結果:

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

關於您收到的“數組到字符串轉換”錯誤,我懷疑一個或多個POST變量實際上是一個數組。 要檢驗此假設,請嘗試使用print_r($ _ POST)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM