AJAX返回结果转字符串不生效?如何获取JS可用的数据库总记录数
问题修复方案
现有代码的关键错误点
- PHP端取值逻辑完全错误
mysqli_query()执行后返回的是结果集对象,并不是查询出的计数值,直接对这个对象做intval()转换,最终得到的固定值是0,根本读不到真实的总记录数- 输出时拼接了
<p>标签,前端拿到的响应内容是带HTML标记的字符串,不是可直接使用的纯数字 - 代码中读取
$_GET['aa']的逻辑未在后续使用,请求时如果不带这个参数会触发PHP报错
- JS端的异步逻辑误区
- 未提前声明
fragenAnzahl变量,在不同执行环境下容易出现作用域异常 - AJAX请求是异步执行的,回调函数内对
fragenAnzahl的赋值,要等请求全部完成后才会触发,如果在请求发送后直接同步读取这个变量,永远拿不到真实值
- 未提前声明
修正后的服务端代码 server3.php
<?php // 连接数据库时直接指定库名,省略单独的select_db步骤 $con = mysqli_connect('localhost', 'root', '', 'loginpage'); if (!$con) { die('0'); // 连接失败直接返回0,避免输出HTML错误信息干扰前端取值 } $sql = "SELECT COUNT(id) AS anzahl FROM frage"; $result = mysqli_query($con, $sql); // 从结果集中取出行数据,而非直接对结果集对象做转换 $row = mysqli_fetch_assoc($result); // 取到计数后转为纯整数,直接输出,不包裹任何HTML标签 $count = intval($row['anzzahl']); echo $count; mysqli_close($con); ?>
修正后的客户端逻辑 js.js
// 提前声明存储总数的变量,避免作用域问题 let fragenAnzahl = 0; function anzahlFragen(callback) { const xmlhttp2 = new XMLHttpRequest(); xmlhttp2.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { // 服务端返回的是纯数字字符串,去空白后直接转成整数使用 fragenAnzahl = parseInt(this.responseText.trim()); // 把拿到的值通过回调传递出去,解决异步取值的时序问题 if (typeof callback === 'function') { callback(fragenAnzahl); } } } xmlhttp2.open("GET", "server3.php", true); xmlhttp2.send(); } // 实际使用示例:拿到值后再执行后续逻辑 anzahlFragen(function(count) { console.log("数据库总记录数是:", count); })
效果说明
- 服务端现在会直接输出纯数字字符串,前端拿到的
responseText就是可直接转换的纯文本,不需要额外剥离HTML标签 - 加入的回调机制解决了AJAX异步带来的取值时序问题,不会出现拿到空值/undefined的情况
- 数值转换时加了
trim()处理,避免服务端输出带换行、空格导致的parseInt转换失败
内容的提问来源于stack exchange,提问作者Raffael Gangelberger
相关产品推荐
相关产品推荐

