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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:59:01