[英]Using more than one WHERE condition in mysql query
我試圖將多個WHERE條件應用於我的查詢,如下所示:
$hotel="Hotel Name";
$data1=explode('/',$data1);
$newdata1=mktime(0, 0, 0, $data1[0], $data1[1], $data1[2]);
$newdata1=date("Y-m-d", $newdata1);
$data2=explode('/',$data2);
$newdata2=mktime(0, 0, 0, $data2[0], $data2[1], $data2[2]);
$newdata2=date("Y-m-d", $newdata2);
$filtro=mysql_query("SELECT *
FROM hotels_rates_flat
WHERE htl_name = $hotel AND
given_date>=$newdata1 AND
given_date<=$newdata2
ORDER BY htl_name, city_zone, given_date")
or die(mysql_error());
它返回以下錯誤:
* 您的SQL語法有誤; 請查看與您的MySQL服務器版本相對應的手冊,以在第1行“ do Hotel AND named_date> = 2012-09-01 AND named_date <= 2012-09-05 ORDER BY htl_nam”附近使用正確的語法。*
這真的讓我很困擾,因為我看不到任何明顯的錯誤。
我將不勝感激任何幫助。
謝謝
使用PDO避免SQL注入和錯誤報告:
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$hotel="Hotel Name";
$data1=explode('/',$data1);
$newdata1=mktime(0, 0, 0, $data1[0], $data1[1], $data1[2]);
$newdata1=date("Y-m-d", $newdata1);
$data2=explode('/',$data2);
$newdata2=mktime(0, 0, 0, $data2[0], $data2[1], $data2[2]);
$newdata2=date("Y-m-d", $newdata2);
try {
$stmt = $db->query("SELECT * FROM `hotels_rates_flat` WHERE `htl_name` = :hotel AND (`given_date` BETWEEN :date1 AND :date2) ORDER BY `htl_name`, `city_zone`, `given_date`");
$stmt->execute(array(':hotel' => $hotel,':date1' => $newdata1,':date2' => $newdata2));
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $ex) {
echo $ex->getMessage();
}
// use $results
?>
問題的根源在於報價。 您應該使用帶占位符的預處理語句,並讓mysql驅動程序弄清楚如何以語法上有效的方式插入值。
您可以使用mysqli_
功能類似於mysql_
的人,只是添加一些額外的呼叫處理的參數。 您確實需要顯式的數據庫句柄(我在下面將其稱為$dbh
;它是從mysqli_connect()
返回的),而不是像mysql_函數那樣依賴於隱式的句柄。
$stmt = mysqli_prepare($dbh, 'SELECT * FROM hotels_rates_flat'
. ' WHERE htl_name = ?'
. ' AND given_date BETWEEN ? AND ?'
. ' ORDER BY htl_name, city_zone, given_date');
# the 'sss' means treat all three parameters as (s)trings
mysqli_bind_param($stmt, 'sss', $hotel, $newdata1, $newdata2) or die(mysqli_error($dbh));
$filtro = mysqli_stmt_execute($stmt) or die(mysqli_error($dbh));
或者,您可以使用PDO,就像Mihai的回答一樣,這有點不同。
您需要用單引號將$hotel
, $newdata1
和$newdata2
括起來。
SELECT * FROM hotels_rates_flat WHERE htl_name = '$hotel' AND ...
您還可以使用BETWEEN
運算符,而不是寫出小於和大於:
AND given_date BETWEEN '$newdata1' AND '$newdata2'
您還應該停止使用 mysql_
函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.