PHP+AJAX调用MSSQL Server 2017查询无结果问题求助
解决MSSQL带条件查询无返回结果的问题
看起来你遇到的问题主要有两个核心原因:提前调用fetch()导致结果丢失,以及直接拼接SQL可能引发的类型不匹配问题,咱们一步步来排查修复:
1. 先解决fetch()导致的结果丢失问题
你在代码里先执行了一次:
if( $stmt->fetch() === false) { die( print_r( sqlsrv_errors(), true)); }
这个fetch()会直接取走查询结果的第一行数据,后面的while ($row = $stmt->fetch())就只能从第二行开始读取。如果rmnumber='102'对应的结果只有一行,那自然就没有输出了。
2. 修复SQL拼接的类型匹配问题
虽然你在SSMS里执行SELECT * FROM rmmaster where rmnumber='102'能得到结果,但如果rmnumber字段是数字类型(比如int、bigint),在PHP里用字符串引号包裹查询值,可能触发隐式类型转换,导致MSSQL无法匹配到正确数据。更安全的做法是使用参数绑定,既避免SQL注入,也能保证类型严格匹配。
修正后的data.php代码
include_once ('home.php'); if( $conn === false ) { die( print_r( sqlsrv_errors(), true)); } $name = "102"; // 使用参数绑定构建查询(官方推荐的安全写法) $sql = "SELECT * FROM rmmaster where rmnumber = ?"; $params = array($name); $stmt = sqlsrv_query($conn, $sql, $params); if( $stmt === false ) { die( print_r( sqlsrv_errors(), true)); } // 直接循环读取所有结果,不要提前调用fetch while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){ echo $row['rmtype'] . $name; } // 推荐释放语句资源并关闭连接 sqlsrv_free_stmt($stmt); sqlsrv_close($conn);
额外提示
- 用
sqlsrv_query配合参数绑定,是微软官方推荐的MSSQL PHP扩展查询方式,能彻底避免SQL注入和类型不匹配的坑。 - 如果坚持要直接拼接SQL,先确认
rmnumber的字段类型:如果是数字类型,去掉引号写成rmnumber=$name;如果是字符串类型,要确保变量编码和数据库一致,避免隐形空格或字符编码差异。 - 测试时可以在AJAX的
success回调里打印完整的data,排查是否有隐藏的SQL警告信息。
内容的提问来源于stack exchange,提问作者S.Hettz
相关产品推荐
相关产品推荐

