Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5 PDO绑定变量数与令牌数不匹配_Php_Sql Server_Laravel_Pdo - Fatal编程技术网

Php Laravel 5 PDO绑定变量数与令牌数不匹配

Php Laravel 5 PDO绑定变量数与令牌数不匹配,php,sql-server,laravel,pdo,Php,Sql Server,Laravel,Pdo,我现在在这方面遇到了麻烦 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($

我现在在这方面遇到了麻烦

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时,我没有任何错误!:(

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


这种行为的一个原因是,SQL server根据传输的SQL语句构建其查询计划。但是,如果它不知道应该使用哪个表,它应该如何构建查询计划。这与我希望您告诉我的相同,您需要从工厂为我带来一些部件,但不告诉您从哪个表中获取actory(它可能是街上的一个小的,也可能是世界上的另一半)。

我用DB::statement([MySQL UPDATE])解决了这个问题。。。 不知道为什么它不起作用。。。 我本可以使用雄辩,但我有一个限制,以保持更多的SQL


无论如何,谢谢大家。

PDO正在做这项工作,而不是SQL Server。他在将正确的SQL发送到服务器之前准备查询。好的,我不知道(我是SQL人员)。这种行为的缺点是,它会导致计划缓存污染(如果每个查询参数都替换为其值,则您将获得两个不同查询参数的两个不同计划)。错误208表示“无效对象”-您是否检查是否连接到正确的服务器(如果statment在SSMS中工作,则不会拼写错误)?不久前,我遇到了一个类似的问题,直到我意识到我连接到了一个较旧的dev数据库副本。。。