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

使用sqlsrv_connect连接SQL Server后调用prepare报错,如何解决?

问题解决:Call to a member function prepare() on resource

错误原因

你用sqlsrv_connect()建立的连接返回的是资源(resource)类型,而非PDO对象。PDO的prepare()方法仅能被PDO对象调用,直接在资源上调用该方法就会触发此错误。

解决方案

方案1:使用SQLSRV扩展原生函数执行查询

既然用了sqlsrv_connect(),就配套使用SQLSRV扩展的查询函数:

$sql = "SELECT * from TableName";
// 用sqlsrv_prepare替代PDO的prepare,第一个参数是sqlsrv_connect返回的资源
$stmt = sqlsrv_prepare($pdo, $sql);
if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

// 用sqlsrv_execute执行语句
if (sqlsrv_execute($stmt) === false) {
    die(print_r(sqlsrv_errors(), true));
}

// 获取结果示例
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    // 处理数据
    print_r($row);
}

方案2:改用PDO的SQLSRV驱动(推荐,适配原有代码风格)

如果你的Unix环境已安装PDO_SQLSRV扩展,可以直接用PDO方式连接,保持和原有dblib代码的风格一致,无需修改查询逻辑:

// 替换原dblib的DSN为sqlsrv格式
$pdo = new PDO('sqlsrv:Server=192.168.2.4,1433;Database=Andover;charset=utf8', 'UserName', 'Password');
// 开启错误模式(可选,方便调试)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 原有查询代码可直接复用
$sql = "SELECT * from TableName";
$stmt = $pdo->prepare($sql);
$stmt->execute();

// 获取结果示例
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    print_r($row);
}

注意事项

  • Unix系统下需确保对应扩展已安装:
    • 方案1需安装sqlsrv扩展
    • 方案2需安装pdo_sqlsrv扩展
  • 可通过php -m命令查看已启用的扩展,确认是否符合要求

内容的提问来源于stack exchange,提问作者riddley walker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:20:01