【问题标题】:Invalid parameter number given with pdo's prepared statementpdo 的预处理语句给出的参数号无效
【发布时间】:2014-01-07 08:01:23
【问题描述】:

您好,我已进行查询以从数据库中选择某些值。不幸的是,我收到此错误消息:参数编号无效

代码如下

$vehicles = DB::select( DB::raw("
        SELECT v.id, v.brand, v.type, v.description, v.airco, v.seats, v.hourly_rent 
        FROM vehicle as v 
        WHERE v.id 
        NOT IN((SELECT v.id FROM vehicle as v INNER JOIN reservation as r on r.`vehicle_id` = v.id WHERE r.status_id in(3,4,5) 
        AND (
                (
                    (:start >= r.startdate AND :eind <= r.enddate )
                    OR
                    (:start <= r.startdate AND :eind >= r.enddate ) 
                ) 
                OR
                (
                    (:start >= r.startdate AND :start <= r.enddate)
                    OR
                    (:eind >= r.startdate AND :eind <= r.enddate)
                )
            )
        GROUP BY v.id
        ))"), 
         array(
            'start' => $startdate, 
            'eind' => $enddate
         )
    );

【问题讨论】:

  • 一个参数名可以多次使用吗?我想这是你的问题。
  • 那么我该如何解决呢?因为正如你所见,我必须将它们相互匹配..
  • 每次使用不同的参数名称。

标签: php mysql database pdo laravel-4


【解决方案1】:

您不能多次使用相同的参数名称。为每个参数指定自己的名称并准确绑定该数量的参数:

$vehicles = DB::select( DB::raw("
        SELECT v.id, v.brand, v.type, v.description, v.airco, v.seats, v.hourly_rent 
        FROM vehicle as v 
        WHERE v.id 
        NOT IN((SELECT v.id FROM vehicle as v INNER JOIN reservation as r on r.`vehicle_id` = v.id WHERE r.status_id in(3,4,5) 
        AND (
                (
                    (:starta >= r.startdate AND :einda <= r.enddate )
                    OR
                    (:startb <= r.startdate AND :eindb >= r.enddate ) 
                ) 
                OR
                (
                    (:startc >= r.startdate AND :startd <= r.enddate)
                    OR
                    (:eindc >= r.startdate AND :eindd <= r.enddate)
                )
            )
        GROUP BY v.id
        ))"), 
         array(
            'starta' => $startdate, 
            'einda' => $enddate,
            'startb' => $startdate, 
            'eindb' => $enddate,
            'startc' => $startdate, 
            'eindc' => $enddate,
            'startd' => $startdate, 
            'eindd' => $enddate
         )
    );

【讨论】:

  • 嗨马塞尔,你知道为什么会这样吗?为什么绑定名称不能多次使用?
【解决方案2】:

其实可以。只需将 PDO 置于仿真模式即可。

【讨论】:

  • 如果您想要最大的安全性,您不希望 PDO 处于仿真模式,而是使用 real 准备好的语句。
  • 没有区别,安全是平等的。
  • 还记得stackoverflow.com/a/12118602/258127吗? (我承认这是一种极端情况,但在仿真模式下使用 PDO 更危险)。
  • 这个案例没有一个问题。
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2012-07-09
  • 2012-01-07
相关资源
最近更新 更多