2012-08-31 1 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 구문의 오류. 'do hotel AND given_date> = 2012-09-01 및 given_date < = 2012-09-05 ORDER BY htl_nam'줄 1 근처에서 사용할 올바른 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. *

나는 명확한 실수를 볼 수 없기 때문에 이것은 정말로 나를 괴롭 히고있다.

어떤 도움을 주셔서 감사합니다.

+2

$의 호텔'은 SQL 쿼리에 바로 전달되는 것 원료 사용자 입력되지'제발 말해! 그건 [나쁜] 일 것입니다 (http://php.net/manual/en/security.database.sql-injection.php). – user113215

+0

아래에 제안 된 @njk와 같이 쿼리에 사용중인 정수가 아닌 모든 값을 작은 따옴표로 묶으십시오. – inhan

+0

$ 호텔은 텍스트 입력 유형이 아닌 선택 입력에서 제공됩니다. "호텔 이름"은 단지 샘플 일뿐입니다. 나는이 문제에서 진짜 hote 이름을 사용하지 않았다. –

답변

-2

당신은 작은 따옴표로 $hotel, $newdata1$newdata2을 싸는 필요 감사드립니다.

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

당신해야 또한 stop usingmysql_ 기능 :

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

또한보다 작 & 더를 작성하는 대신 BETWEEN 연산자를 사용할 수 있습니다.

1

문제의 출처가 인용되어 있습니다. Prepared statement with placeholder를 사용하고, 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)); 

또는 Mihai의 답변에서와 같이 PDO를 사용할 수 있습니다. 이는 약간 다릅니다.

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

얘들 아, 내가 뭘하려고하는지 조금 더 설명하고 싶다. –