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

使用JSON实现数据库连接时sqlsrv_fetch_array报错求助

解决sqlsrv_fetch_array()参数类型错误问题

这个错误我之前也碰到过,本质是你的sqlsrv_query()执行失败,返回了布尔值false(而不是预期的结果集资源),导致后续sqlsrv_fetch_array()无法处理这个参数。咱们一步步拆解问题并修复:

1. 先解决最直接的SQL语法错误

你当前的SQL语句拼接有两个致命问题:

  • 缺少空格:".$obj->table."LIMIT".$obj->limit 会让表名和LIMIT直接连在一起,比如你的表名是PointEvent,最终SQL会变成SELECT Point FROM PointEventLIMIT10,完全不符合语法规范;
  • SQL Server不支持LIMIT:LIMIT是MySQL等数据库的语法,SQL Server要用TOP(适用于简单的前N条查询)或者OFFSET ... FETCH NEXT(更灵活的分页写法)。

2. 必须杜绝SQL注入风险

直接把用户传入的table和limit拼接到SQL里是极度危险的,很容易被攻击者利用执行恶意SQL:

  • 对于表名:用白名单验证,只允许指定的合法表名;
  • 对于limit这类数值参数,用参数化查询传递,避免直接拼接。

3. 修复结果收集逻辑

你当前的$outp=$row['Point'];每次循环都会覆盖之前的值,最终只会输出最后一条记录的Point值。应该用数组来收集所有结果。

4. 增加查询错误处理

执行sqlsrv_query后一定要检查是否成功,如果失败,打印具体的SQL错误信息,方便快速定位问题。


修改后的PHP代码

<?php
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_GET["x"], false);

// 数据库连接信息
$serverName = "AE58RETY245YU";
$connectionInfo = array( 
    "Database"=>"Test", 
    "UID"=>"bala", 
    "PWD"=>"bala"
);
$conn = sqlsrv_connect($serverName, $connectionInfo);

if( $conn ) {
    echo "Connection established.<br />";
} else {
    echo "Connection could not be established.<br />";
    die( print_r( sqlsrv_errors(), true));
}

$outp = array();

// 1. 白名单验证表名,防止SQL注入
$allowedTables = ["PointEvent"]; // 只允许这些合法表名
if(!in_array($obj->table, $allowedTables)){
    die(json_encode(["error"=>"Invalid table name"]));
}

// 2. 使用参数化查询处理limit,SQL Server兼容写法
$limit = intval($obj->limit); // 确保是整数类型
// 两种可选写法,选一种即可:
// 写法1:简单TOP查询(适合获取前N条)
// $sql = "SELECT TOP (?) Point FROM ".$obj->table;
// 写法2:OFFSET/FETCH(适合分页场景)
$sql = "SELECT Point FROM ".$obj->table." ORDER BY Point OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY";

// 准备参数数组
$params = array($limit);
$stmt = sqlsrv_query($conn, $sql, $params);

// 检查查询是否执行成功
if( $stmt === false ) {
    die( print_r( sqlsrv_errors(), true));
}

// 收集所有结果到数组
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
    $outp[] = $row['Point']; // 用数组追加,避免覆盖
}

// 释放结果集和关闭连接
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

echo json_encode($outp);
?>

HTML代码(无需修改,保持原样即可)

<!DOCTYPE html>
<html>
<body>
<h2>Get data as JSON from a PHP file on the server.</h2>
<p>The JSON received from the PHP file:</p>
<p id="demo"></p>
<script>
var obj, dbParam, xmlhttp;
obj = { "table":"PointEvent", "limit":10 };
dbParam = JSON.stringify(obj);
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    document.getElementById("demo").innerHTML = this.responseText;
  }
};
xmlhttp.open("GET", "testsql.php?x=" + dbParam, true);
xmlhttp.send();
</script>
</body>
</html>

内容的提问来源于stack exchange,提问作者lala bala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:08