我第一次使用Laravel,在将Eloquent模型保存到数据库时遇到SQL语法错误。
SQLSTATE [42000]:[Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server]'s'附近的语法不正确。 (SQL:update [plan_part] set [plan_id] = 48,[is_astm_testing_complete] = 0,[supplier_part_weight] = .0308,[hazard_class_type_id] = 42,[supplier_additional_details] = test's,[modified_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,所以我不确定那里是否存在我不理解的细微差别。
更新 看起来SQL Server使用双单引号而不是斜线单引号进行转义。任何人都知道我应该做些什么来让Laravel更好地使用SQL Server?
答案 0 :(得分:0)
问题是我们的PHP Web服务器未配置适当的SQLSRV PDO驱动程序。我们有一个愚蠢的设置,我们在FreeBSD上运行PHP,但是指向SQL Server数据库。 FreeBSD框没有用于SQL Server的PDO驱动程序,并且Microsoft在不需要手动编译等情况下不为该特定操作系统提供任何驱动程序。
我们最终将Web服务器迁移到IIS,并能够通过安装Microsoft提供的IIS / Windows SQLSRV PDO驱动程序来解决此问题。