[英]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);
}
}
這是您的代碼的重寫。 我使用數組來構建嵌套的AND
和OR
條件,使用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.