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

标签 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

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

最佳答案

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

相关文章:

php - 以编程方式访问货币汇率

mysql - 选择一个项目,该项目在数据库中重复出现的总次数以及该项目状态为1的次数

PHPStorm:转到 Laravel 方法声明

php - Laravel Excel 垂直居中对齐

css - Laravel 无法加载 css 文件

php - Yii2 GridView 排序

php - 如何使用 MySQLi 准备好的语句创建新的 MySQL 数据库用户?

php - 图标未在实时服务器上显示

php - 我可以在 php 中编辑 mysqli_result 对象吗?

mysql - Rspec 和 capybara : saving results to database?