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

使用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);

?>

错误原因

  1. 变量名冲突+错误捕获无效:连接代码里把$connectionInfo数组直接覆盖成了sqlsrv_connect的返回值,且用PDO异常捕获错误完全无效——sqlsrv是 procedural 风格扩展,不会抛出PDOException,哪怕连接实际失败,你也会误以为成功,此时$connectionInfo是bool(false),调用query()自然触发"Call to a member function on bool"错误。
  2. 调用方式错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:55:25