sqlstate[hy093]:无效的参数号和pdo::attr\u emulate\u

ntjbwcob  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(581)

在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数组。
但是从安全的Angular 来看,使用它会有什么问题吗?https://github.com/microsoft/msphpsql/issues/46
上面帖子提到的问题还没解决?

o2rvlv0m

o2rvlv0m1#

是的,安全问题也适用于你。然而,有另一个快速解决你的问题,不涉及 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个标识符。

相关问题