使用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
相关产品推荐
相关产品推荐

