【问题标题】:SQLSTATE[HY093]: Invalid parameter number and PDO::ATTR_EMULATE_PREPARESSQLSTATE[HY093]:参数号和 PDO::ATTR_EMULATE_PREPARES 无效
【发布时间】:2019-02-24 12:12:05
【问题描述】:

在laravel中执行如下查询时

  $result = DB::select(
                'SELECT p.f1 FROM `tab1` m
                INNER JOIN `tab2` p
                ON m.id= p.fk
                WHERE m.good_id = :good_id AND p.good_id = :good_id LIMIT 1',
                ['good_id' => 12]
            );

得到一个错误 SQLSTATE[HY093]: Invalid parameter number.

找到了解决办法。

我们可以添加以下代码

'options' => [
     PDO::ATTR_EMULATE_PREPARES => true,
],

到 config/database.php 的 mysql 数组。

但是从安全的角度来看,使用它会有什么问题吗? https://github.com/Microsoft/msphpsql/issues/46

上述帖子中提到的问题仍然存在?

【问题讨论】:

    标签: php mysql laravel pdo


    【解决方案1】:

    是的,该安全问题也适用于您。但是,您的问题还有另一个快速解决方案,不涉及PDO::ATTR_EMULATE_PREPARES

    $result = DB::select(
        'SELECT p.f1 FROM `tab1` m
        INNER JOIN `tab2` p
        ON m.id= p.fk
        WHERE m.good_id = :good_id AND p.good_id = :good_id0 LIMIT 1',
                ['good_id' => 12, 'good_id0' => 12]
        );
    

    这增加了 sql 中标识符的数量,并将相同的值放入其中。你也可以优化你的sql,

    $result = DB::select(
        'SELECT p.f1 FROM `tab1` m
        INNER JOIN `tab2` p
        ON (m.id= p.fk AND m.good_id = p.good_id)
        WHERE m.good_id = :good_id LIMIT 1',
                ['good_id' => 12]
        );
    

    这将使您的 sql 只需要 1 个标识符。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2014-02-10
      • 1970-01-01
      • 2023-01-09
      • 2016-12-15
      • 2022-01-10
      • 2017-06-10
      • 1970-01-01
      • 2016-03-04
      相关资源
      最近更新 更多