在执行如下所示的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
以上帖子中提到的问题仍然开放吗?
答案 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个标识符。