在 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
上面帖子中提到的问题仍然存在?
最佳答案
是的,这个安全问题也适用于您。但是,还有另一种快速解决方案可以解决您的问题,该解决方案不涉及 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 个标识符。
关于php - SQLSTATE[HY093]:参数号和 PDO::ATTR_EMULATE_PREPARES 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52420768/