SQLSTATE [HY093]:无效的参数号和PDO :: ATTR_EMULATE_PREPARES

时间:2018-09-20 08:28:52

标签: php mysql laravel pdo

在执行如下所示的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]:无效的参数编号。

为此找到了解决方法。

我们可以添加以下代码

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

到config / database.php的mysql数组。

但是从安全角度来看,使用它会出现任何问题吗? https://github.com/Microsoft/msphpsql/issues/46

以上帖子中提到的问题仍然开放吗?

1 个答案:

答案 0 :(得分:2)

是的,该安全问题也适用于您。但是,还有另一种针对您的问题的快速解决方案,该解决方案不涉及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个标识符。