2012-08-31 57 views
0

我想申請多個WHERE條件,以我的查詢就像這樣:使用一個以上的WHERE條件在MySQL查詢

$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 given_date> = 2012-09-01 AND given_date < = 2012-09-05 ORDER BY htl_nam'處使用正確的語法。*

這真的困擾我,因爲我看不到任何明顯的錯誤。

我將不勝感激任何幫助。

謝謝

+2

請告訴我'$ hotel'不是唯一的被直接傳遞到一個SQL查詢原始用戶輸入!這將是[壞](http://php.net/manual/en/security.database.sql-injection.php)。 – user113215

+0

單引號您在查詢中使用的所有非整數值,如下面提供的@njk。 – inhan

+0

$ hotel來自選擇輸入,而不是來自文本輸入類型。 「酒店名稱」只是一個例子。在這個問題上,我沒有使用真正的酒店名稱。 –

回答

-2

您需要包住$hotel$newdata1$newdata2單引號。

SELECT * FROM hotels_rates_flat WHERE htl_name = '$hotel' AND ...

您還可以使用BETWEEN操盤寫出比小於&更大:

AND given_date BETWEEN '$newdata1' AND '$newdata2'

你也應該stop usingmysql_功能。

1

問題的根源在引用。您應該使用佔位符的準備語句,並讓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的回答那樣,它有點不同。

2

使用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 
?> 
+0

夥計們,我想解釋一下我想要做的事情: –