php - PDO::ATTR_EMULATE_PREPARES 问题

标签 php mysql sql pdo

一旦我设置了 setAttribute(PDO::ATTR_EMULATE_PREPARES, false); MySQL 选择查询将不再起作用,有谁知道为什么?

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();
    }
}

在我将属性设置为 false 之前,代码运行良好。

最佳答案

如果禁用 PREPARE 模拟,则无法多次使用同一占位符。您需要为 :user_checkin:user_checkout 的每次使用提供不同的占位符。

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

关于php - PDO::ATTR_EMULATE_PREPARES 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36415290/

相关文章:

php - 从python脚本获取变量到php页面

mysql - 使用连接表中的两个计数编写 JOIN 查询

mysql - phpmyadmin 和 mysql 套接字错误

sql - 序数使用哪种数据类型?

mysql - 按 "today"、 "in last 7 days"、 "in last month"和 "older"对查询结果进行分组

php - 准备多插入查询时出错

php - ANDROID - 通过 VOLLEY 将列表发送到 PHP

php - 使用sftp上传文件时如何修复PHP curl错误CURLE_SSH(79)

php - 在 phpmyadmin 中工作的 Laravel 中的 MySQL 访问冲突

php - 更改 MySQL 表列以匹配另一个表中的 id