ERP关联SQL Server表名含空格,PHP查询报Invalid object name错误求助
解决SQL Server表名带空格和$符号的PHP连接报错问题
我一眼就看出问题所在了!你遇到的Invalid object name 'Lareco Live'错误,根本原因是PHP双引号字符串的变量解析特性搞的鬼!
你写的SQL语句用了双引号包裹:
$sql = "select No_, Description from [Lareco Live$Lead] with (nolock) ";
在PHP中,双引号里的$Lead会被当作一个变量来解析,但你并没有定义这个变量,所以它会被替换成空字符串。最终发送给SQL Server的SQL语句其实变成了:
select No_, Description from [Lareco Live] with (nolock)
这就难怪数据库找不到名为Lareco Live的对象了——它要找的[Lareco Live$Lead]被硬生生截断了!
解决方案:
有两种简单的修复方式,选哪种都可以:
1. 使用单引号包裹SQL语句
单引号字符串在PHP中不会解析变量,能完整保留你的表名:
// 改用单引号,避免变量解析 $sql = 'select No_, Description from [Lareco Live$Lead] with (nolock) ';
2. 转义双引号里的$符号
如果坚持用双引号,给$加个反斜杠转义,告诉PHP这只是普通字符:
$sql = "select No_, Description from [Lareco Live\$Lead] with (nolock) ";
修改后的完整代码示例
// Establishes the connection $dbh = sqlsrv_connect($serverName, $connectionOptions); if ($dbh === false) { echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true); exit; } // 这里用单引号版本修复了表名解析问题 $sql = 'select No_, Description from [Lareco Live$Lead] with (nolock) '; $getResults = sqlsrv_query($dbh, $sql); if ($getResults === false) { echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true); exit; }
另外额外提醒下:如果你的数据库还有指定的架构(比如dbo),也可以把表名写全,比如[dbo].[Lareco Live$Lead],这样更保险,但当前问题的核心还是PHP的变量解析导致表名被篡改。
内容的提问来源于stack exchange,提问作者Ivan Pudic




