PHP远程连接SQL Server报错:Call to a member function query() on string
报错根本原因
你当前触发的调用字符串类型的成员函数query()错误,核心是执行SQL的数据库变量不是正常初始化的PDO对象,结合你贴的连接代码,存在几个明确问题:
- 连接方法内初始化的PDO对象赋值给了局部变量
$db,但你声明的全局连接变量是$con,方法运行结束后$db直接被回收,全局$con没有被赋值,后续调用database::query()时使用的$con要么未初始化、要么被错误赋值为字符串 - 整个
conexao方法没有返回值,也没有把初始化成功的PDO对象存入类静态属性或全局变量,外部根本拿不到可用的连接实例 - 没有加异常捕获逻辑,即使PDO连接报错你也看不到具体信息,会误以为连接正常
- 你用了MySQL的
SET CHARACTER SET语法设置编码,SQL Server的PDO驱动不支持该语法,会触发连接异常
修复方案
1. 修正数据库连接方法
public static function conexao() { // 用静态属性存储连接实例,避免重复初始化 static $con = null; // 已初始化则直接返回实例 if ($con !== null) { return $con; } try { // 服务器地址格式参考:公网IP,1433 如有命名实例则为 公网IP\实例名,1433 $con = new PDO ("sqlsrv:Server=XXXXX;Database=XX",'XX','XXXX'); // SQL Server专用的UTF8编码设置 $con->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8); $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $con; } catch (PDOException $e) { // 生产环境可替换为写日志逻辑 die("数据库连接失败:" . $e->getMessage()); } }
2. 修正query方法的调用逻辑
你的database类的query方法需要先获取有效连接实例再执行SQL,参考逻辑:
public static function query($sql) { $con = self::conexao(); return $con->query($sql); }
3. 额外排查项
如果修改后仍有问题,依次检查:
- SQL Server所在VPS的防火墙、安全组除了开放1433端口,还要确认允许XAMPP所在VPS的公网IP访问
- 确认SQL Server配置管理器中已开启TCP/IP协议,关闭动态端口、固定端口设置为1433,且开启了远程连接权限
内容的提问来源于stack exchange,提问作者Mononym
相关产品推荐
相关产品推荐

