我正在尝试通过DB类查询远程数据库连接,并且在将参数作为表名传递时出现问题。
这有效并返回预期结果:
$result = DB::connection('remote')->select('select * from "Users who can post batch"');
但是,这些陈述不是:
// $view->name returns; string(34) "Users who can post batch"
$result = DB::connection('remote')->select('select * from ?', array( $view->name ));
$result = DB::connection('remote')->select('select * from "?"', array( $view->name ));
$result = DB::connection('remote')->select('select * from [?]', array( $view->name ));
$result = DB::connection('remote')->select('select * ' . $view->name );
我收到此错误:
SQLSTATE[HY000]: General error: 102 General SQL Server error: Check messages from the SQL Server
[102] (severity 15) [(null)] (SQL: select * from ?) (Bindings: array ( 0 => 'Users who can post batch', ))
我做错了什么?
Laravel数据库文档: http://laravel.com/docs/database
答案 0 :(得分:0)
你从一个没有告诉你一切的页面得到了你的答案。不要直接使用纯文本查询。通常你应该尝试使用QueryBuilder来创建你的查询,但是,当然,如果不可能,至少使用DB :: raw()来创建它们:
$result = DB::connection('remote')->select(DB::raw('select * from "' . $view->name . '"'));
Laravel将逃避您的查询以防止SQL注入。
使用参数,我看到的正确版本是您已经尝试过的:
$result = DB::connection('remote')->select(DB::raw('select * from "?"'), array($view->name));
但是,对于SQL Server,事情并不完全符合我们的想法。所以,看看你的服务器日志,你可能会在那里找到问题的根源:
SELECT t.[text]
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
WHERE t.[text] LIKE N'%something unique about your query%';
答案 1 :(得分:0)
DB :: raw这是你添加更多参数的方法
$result = DB::connection('remote')->select(DB::raw('select * from "' . $view->name . '" where id = ?', array(1)'));