Laravel / Красноречивый квест - PullRequest
0 голосов
/ 05 мая 2018

Я впервые использую Laravel и у меня возникает ошибка синтаксиса SQL при сохранении модели Eloquent в БД.

SQLSTATE [42000]: [Microsoft] [Драйвер ODBC 11 для SQL Server] [SQL Server] Неверный синтаксис рядом с 's'. (SQL: обновление [plan_part] set [plan_id] = 48, [is_astm_testing_complete] = 0, [supplier_part_weight] = .0308, [danger_class_type_id] = 42, [supplier_additional_details] = test's, [updated_by] = 1003, где [plan_part_id] = 55826 )

Это связано с supplier_additional_details = test's, где у меня есть апостроф в значении.

Я не понимаю, почему это происходит, потому что я думал, что метод сохранения Eloquent использует PHP PDO и связанные параметры, о чем свидетельствует трассировка стека в ответе об ошибке:

Connection->runQueryCallback('update [plan_part] set [plan_id] = ?, [is_astm_testing_complete] = ?, [supplier_part_weight] = ?, [hazard_class_type_id] = ?, [supplier_additional_details] = ?, [modified_by] = ? where [plan_part_id] = ?', array('48', 0, '.0308', '42', 'test\'s', 1003, '55826'), object(Closure))

Я вижу, что апостроф, по-видимому, автоматически экранирован (я ничего не делал, чтобы добавить косую черту), но не привязанные параметры автоматически делают это для меня?

Почему Laravel ошибается из-за этого, когда кажется, что он все-таки правильно сбежал? Должен ли я вручную экранировать каждый вход в логике моего контроллера?

Это кажется неправильным и ненужным, но опять же, я не очень знаком с Eloquent / Laravel.

Логика сохранения довольно проста:

$plan_part = PlanPart::find(...); ... $plan_part->supplier_additional_details = $request->supplier_additional_details; $plan_part->save();

Что я делаю не так?

FWIW, я использую SQL Server, а не MySQL, поэтому я не уверен, есть ли там нюансы, которые я не понимаю.

UPDATE Похоже, SQL Server использует двойные одинарные кавычки вместо косых одинарных кавычек для экранирования. Кто-нибудь знает, что я должен сделать, чтобы Laravel лучше работал с SQL Server?

1 Ответ

0 голосов
/ 30 мая 2019

Проблема заключалась в том, что наш веб-сервер PHP не был настроен с соответствующими драйверами PDSR SQLSRV. У нас была тупая установка, где мы запускали PHP на коробке FreeBSD, но указывали на базу данных SQL Server. В коробке FreeBSD не было драйверов PDO для SQL Server, и Microsoft не предоставляет драйверы для этой конкретной ОС, не требуя ручной компиляции и т. Д.

В итоге мы перенесли наши веб-серверы на IIS и смогли устранить проблему, установив предоставляемые Microsoft драйверы SQLSRV PDO для IIS / Windows.

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