SQLSTATE [HY093]: неверный номер параметра и PDO :: ATTR_EMULATE_PREPARES - PullRequest
0 голосов
/ 20 сентября 2018

При выполнении запроса, как показано ниже в 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,
],

в массив mysql файла config / database.php.

Но использование этого будет иметь какие-либо проблемы с точки зрения безопасности?https://github.com/Microsoft/msphpsql/issues/46

Проблема, упомянутая в сообщении выше, все еще открыта?

1 Ответ

0 голосов
/ 20 сентября 2018

Да, эта проблема безопасности относится и к вам.однако есть другое быстрое решение для вашей проблемы, которое не включает 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 идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...