Php 在mysql查询中使用多个WHERE条件

Php 在mysql查询中使用多个WHERE条件,php,mysql,Php,Mysql,我正在尝试对我的查询应用多个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],

我正在尝试对我的查询应用多个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());
$hotel=“hotel Name”;
$data1=分解(“/”,$data1);
$newdata1=mktime(0,0,0,$data1[0],$data1[1],$data1[2]);
$newdata1=日期(“Y-m-d”,$newdata1);
$data2=分解('/',$data2);
$newdata2=mktime(0,0,0,$data2[0],$data2[1],$data2[2]);
$newdata2=日期(“Y-m-d”,$newdata2);
$filtro=mysql\u查询(“选择*
从酒店到公寓
其中htl_name=$hotel AND
给定日期>=$newdata1和

给定日期,您需要用单引号括住
$hotel
$newdata1
$newdata2

从hotels\u rates\u flat中选择*,其中htl\u name=“$hotel”和…

您也可以使用
BETWEEN
操作符,而不是写出小于或大于:

且给定日期介于“$newdata1”和“$newdata2”之间。


您还应该
mysql\uuquot>函数。

问题的根源是引用。您应该使用带有占位符的准备好的语句,让mysql驱动程序找出如何以语法有效的方式插入值

您可以使用类似于
mysql\ucode>函数的
mysqli\ucode>函数,只需添加几个额外的调用来处理参数。您确实需要一个显式的数据库句柄(我在下面称它为
$dbh
;它是从
mysqli\u connect()
返回的)而不是依赖像mysql_uu函数这样的隐式函数

$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的回答一样,这有点不同。

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


请告诉我,
$hotel
不是直接传递到SQL查询中的原始用户输入!应该是这样。请将查询中使用的所有非整数值单引号括起来,如下面建议的@njk。$hotel来自选择输入,而不是文本输入类型。“hotel Name”“这只是一个示例。我在这件事上没有使用真正的hote名称。我只想指出,选择输入并不比文本框更安全,只是有一点点困难。伙计们,我想更好地解释一下我正在尝试做的事情: