【问题标题】:Laravel 5 PDO number of bound variables does not match number of tokensLaravel 5 PDO 绑定变量数与令牌数不匹配
【发布时间】:2015-07-31 02:49:49
【问题描述】:

我目前在这方面遇到了麻烦......

if (Input::has('numenr') and Input::has('table') and Input::has('type') and Input::has('st')) {

    $sql_up = "UPDATE [wds].[dbo].[?] SET [f_nonvint] = ? WHERE [numenr] = '?' AND [f_type] = ?";

    DB::connection('sqlsrv')->update($sql_up, [Input::get('table'), Input::get('st'), Input::get('numenr'), Input::get('type')]);
}

错误输出是:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens (SQL: UPDATE [wds].[dbo].[f_files_wines] SET [f_nonvint] = 1 WHERE [numenr] = '091DFF89-EB1B-4B81-9BF0-4AB36F65529E' AND [f_type] = 1)

给出的查询看起来不错,但我不明白这是从哪里来的。

感谢您的帮助! :)

更新:

用一个小技巧修复了之前的错误。问题出在唯一标识符上。我无法在 sql 中添加引号......不知道为什么。 有解决办法:

if (Input::has('numenr') and Input::has('table') and Input::has('type') and Input::has('st')) {

    $sql_up = "UPDATE [wds].[dbo].[?] SET [f_nonvint] = ? WHERE [numenr] = ? AND [f_type] = ?";

    DB::connection('sqlsrv')->update($sql_up, [Input::get('table'), Input::get('st'), "'".Input::get('numenr')."'", Input::get('type')]);
}

但现在我遇到了一个更奇怪的问题。

SQLSTATE[HY000]: General error: 208 General SQL Server error: Check messages from the SQL Server [208] (severity 16) [(null)] (SQL: UPDATE [wds].[dbo].[t_files_wines] SET [f_nonvint] = 1 WHERE [numenr] = '7AEDE4A0-0109-4729-8AFE-D4A55A0A5893' AND [f_type] = 2)

但事实是当我将查询复制到 SqlServer 时,我没有错! :(

【问题讨论】:

  • 错误 208 表示“无效对象” - 您是否检查过您是否连接到正确的服务器(如果该语句在 SSMS 中有效,则不会拼写错误)?前段时间我遇到了类似的问题,直到我意识到我连接到了一个较旧的开发数据库副本......

标签: php sql-server laravel pdo


【解决方案1】:

您不能参数化表名本身(您必须将其直接添加到 sql 语句中)。

这种行为的一个原因是,SQL 服务器根据传输的 SQL 语句构建其查询计划。但是如果它不知道应该使用哪个表,它应该如何构建查询计划。就像我想让你告诉我的一样,你需要多长时间才能从工厂给我带来一些零件,但不要告诉你从哪家工厂(可能是街对面的小工厂或世界另一半的工厂) .

【讨论】:

  • PDO 正在做这项工作,而不是 SQL Server。他在将正确的 SQL 发送到服务器之前准备查询。
  • 好吧,我不知道(我是一个 SQL 人)。这种行为的缺点是,它会导致计划缓存污染(如果每个查询参数都被替换为它的值,那么您将获得针对两个不同查询参数的两个不同计划)。
【解决方案2】:

我通过使用 DB::statement([MY SQL UPDATE]) 解决了它... 不知道为什么它不起作用... 我本可以使用 Eloquent,但我有一个约束要保留更多的 SQL。

还是谢谢你们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多