使用sqlsrv_connect连接成功后调用query()函数报错问题求助
sqlsrv连接成功但无法调用query()的问题解决
问题情况
使用sqlsrv_connect连接SQL Server时,页面显示"Connected successfully",但执行查询时报错:
sqlsrv error "Call to a member function query() on bool"
连接文件代码:
<?php $serverName = "..."; $uid = "..."; $pwd = ""; $databaseName = "..."; try { $connectionInfo = array( "UID"=>$uid, "PWD"=>$pwd, "Database"=>$databaseName); /* Connect using SQL Server Authentication. */ $connectionInfo = sqlsrv_connect( $serverName, $connectionInfo); echo "Connected successfully"; } catch(PDOException $e) { echo "Connection failed: " . $e->getMessage(); } ?>
查询代码:
<?php include_once 'includes/dataconn2.inc.php'; $sql = "SELECT C_CODE, C_ID, C_DESCRIPTION FROM t_product"; $result = $connectionInfo->query($sql); ?>
错误原因
- 变量名冲突+错误捕获无效:连接代码里把
$connectionInfo数组直接覆盖成了sqlsrv_connect的返回值,且用PDO异常捕获错误完全无效——sqlsrv是 procedural 风格扩展,不会抛出PDOException,哪怕连接实际失败,你也会误以为成功,此时$connectionInfo是bool(false),调用query()自然触发"Call to a member function on bool"错误。 - 调用方式错误:
sqlsrv扩展不支持通过对象调用query()方法,必须用它提供的sqlsrv_query()函数执行查询。
修复步骤
1. 修正连接代码
- 不要复用
$connectionInfo变量,改用新变量存储连接资源 - 用
sqlsrv_errors()检测真实的连接错误
修复后的连接文件:
<?php $serverName = "..."; $uid = "..."; $pwd = ""; $databaseName = "..."; $connectionInfo = array( "UID" => $uid, "PWD" => $pwd, "Database" => $databaseName ); // 用独立变量存储连接结果 $conn = sqlsrv_connect($serverName, $connectionInfo); if ($conn === false) { // 获取并输出连接错误 $errors = sqlsrv_errors(); echo "Connection failed: "; foreach ($errors as $error) { echo $error['message'] . " "; } exit; } else { echo "Connected successfully"; } ?>
2. 修正查询代码
使用sqlsrv_query()函数执行查询,并处理查询错误:
<?php include_once 'includes/dataconn2.inc.php'; $sql = "SELECT C_CODE, C_ID, C_DESCRIPTION FROM t_product"; // 传入连接资源和SQL语句执行查询 $result = sqlsrv_query($conn, $sql); if ($result === false) { $errors = sqlsrv_errors(); echo "Query failed: "; foreach ($errors as $error) { echo $error['message'] . " "; } exit; } // 遍历查询结果示例 while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) { echo "Code: {$row['C_CODE']}, ID: {$row['C_ID']}, Description: {$row['C_DESCRIPTION']}<br>"; } // 释放结果集资源 sqlsrv_free_stmt($result); ?>
可选:改用PDO_SQLSRV驱动(面向对象方式)
如果习惯用面向对象的query()方法,可以切换到PDO连接SQL Server,示例如下:
连接文件:
<?php $serverName = "..."; $uid = "..."; $pwd = ""; $databaseName = "..."; try { $conn = new PDO("sqlsrv:Server=$serverName;Database=$databaseName", $uid, $pwd); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully"; } catch(PDOException $e) { echo "Connection failed: " . $e->getMessage(); exit; } ?>
查询代码:
<?php include_once 'includes/dataconn2.inc.php'; $sql = "SELECT C_CODE, C_ID, C_DESCRIPTION FROM t_product"; $result = $conn->query($sql); foreach ($result as $row) { echo "Code: {$row['C_CODE']}, ID: {$row['C_ID']}, Description: {$row['C_DESCRIPTION']}<br>"; } ?>
内容的提问来源于stack exchange,提问作者SamATEIT
相关产品推荐
相关产品推荐

