You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:18:04