2016-04-05 8 views
0

Sobald ich setAttribute(PDO::ATTR_EMULATE_PREPARES, false); MySQL wählen Abfrage würde nicht mehr funktionieren, weiß jemand warum?PDO :: ATTR_EMULATE_PREPARES Problem

if($_POST) 
{ 
    $user_checkin  = test_input($_POST['checkin']); 
    $user_checkout = test_input($_POST['checkout']); 
    $user_noofpeople = test_input($_POST['noofpeople']); 
    $user_roomtype = test_input($_POST['roomtype']); 

    try 
    { 

     $stmt = $db_con->prepare(" 
      SELECT r.* 
       FROM system_apartment AS r 
      WHERE r.apartment_type = :user_roomtype 
       AND r.apartment_capacity >= :user_capacity 
       AND r.apartment_id 
      NOT IN 
       (
        SELECT b.booking_apartmentid 
         FROM system_booking AS b 
        WHERE (b.booking_date_checkout >= :user_checkin AND b.booking_date_checkin <= :user_checkout) 
         OR (b.booking_date_checkin <= :user_checkin AND b.booking_date_checkout >= :user_checkout) 
       ); 
     "); 
     $stmt->bindParam(':user_checkin', $user_checkin, PDO::PARAM_STR); 
     $stmt->bindParam(':user_checkout', $user_checkout, PDO::PARAM_STR); 
     $stmt->bindParam(':user_roomtype', $user_roomtype, PDO::PARAM_STR); 
     $stmt->bindParam(':user_capacity', $user_noofpeople, PDO::PARAM_INT); 
     $stmt->execute(); 
     $count = $stmt->fetchAll(); 
     $count = count($count); 

     if($count==0){ 
      echo "noapartments"; // not available 
     } 
     else{ 
      echo "searchcomplete"; // not available 
     } 

    } 
    catch(PDOException $e){ 
     echo $e->getMessage(); 
    } 
} 

Der Code funktionierte alles in Ordnung, bevor ich das Attribut auf false setzte.

Antwort

0

Sie können denselben Platzhalter nicht mehrfach verwenden, wenn Sie die Emulation PREPARE deaktivieren. Sie müssen jede Verwendung von :user_checkin und :user_checkout verschiedenen Platzhaltern geben.

$stmt = $db_con->prepare(" 
     SELECT r.* 
      FROM system_apartment AS r 
     WHERE r.apartment_type = :user_roomtype 
      AND r.apartment_capacity >= :user_capacity 
      AND r.apartment_id 
     NOT IN 
      (
       SELECT b.booking_apartmentid 
        FROM system_booking AS b 
       WHERE (b.booking_date_checkout >= :user_checkin AND b.booking_date_checkin <= :user_checkout) 
        OR (b.booking_date_checkin <= :user_checkin2 AND b.booking_date_checkout >= :user_checkout2) 
      ); 
    "); 
    $stmt->bindParam(':user_checkin', $user_checkin, PDO::PARAM_STR); 
    $stmt->bindParam(':user_checkout', $user_checkout, PDO::PARAM_STR); 
    $stmt->bindParam(':user_checkin2', $user_checkin, PDO::PARAM_STR); 
    $stmt->bindParam(':user_checkout2', $user_checkout, PDO::PARAM_STR); 
    $stmt->bindParam(':user_roomtype', $user_roomtype, PDO::PARAM_STR); 
    $stmt->bindParam(':user_capacity', $user_noofpeople, PDO::PARAM_INT);