0

次のように、クエリに複数の 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 構文に誤りがあります。1 行目の「do Hotel AND given_date>=2012-09-01 AND given_date<=2012-09-05 ORDER BY htl_nam」の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

明確な間違いが見られないので、これは本当に気になります。

助けていただければ幸いです。

ありがとうございました

4

3 に答える 3

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
?>
于 2012-09-01T00:08:05.703 に答える
1

あなたの問題の原因は引用です。プレースホルダーを含む準備済みステートメントを使用し、mysql ドライバーに、構文的に有効な方法で値を挿入する方法を理解させる必要があります。

mysqli_関数と同様に関数を使用できmysql_、パラメーターを処理するためにいくつかの呼び出しを追加するだけです。mysql_ 関数のように暗黙的なデータベース ハンドルに依存するのではなく、明示的なデータベース ハンドル (以下で呼び出し$dbhます。 から返されます) が必要です。mysqli_connect()

$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));

または、Mihai's answer のように PDO を使用することもできますが、これは少し異なります。

于 2012-09-01T00:03:52.767 に答える
-2

$hotel$newdata1および一重引用符で囲む必要があります$newdata2

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

BETWEEN以下のように書く代わりに、演算子を使用することもできます。

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

関数の使用も停止 mysql_する必要があります。

于 2012-08-31T23:54:51.320 に答える