使用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扩展
- 方案1需安装
- 可通过
php -m命令查看已启用的扩展,确认是否符合要求
内容的提问来源于stack exchange,提问作者riddley walker
相关产品推荐
相关产品推荐

