繁体   English   中英

在MySQL查询中使用多个WHERE条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM