XMLHttpRequest传JS变量至PHP查询MySQL返回0问题排查
问题根因
传参失败是两个代码写法错误:
- JS端
var sentValue1 = Number;赋值错误,Number是JS内置类型构造函数,不是你要传递的具体业务数值;同时GET请求的参数不能放在send()方法中传递,你当前写法没有把参数附带到请求里,PHP端根本拿不到sentValue1的值,查询条件为空自然返回0。 - 后端没有做参数合法性校验,拿到空值直接执行查询,没有抛出错误提示。
修正代码
前端JS部分
先给sentValue1赋你实际需要传递的游戏编号真实值,再把参数按照GET请求规范拼接到请求URL后,send()方法不需要传参:
<script> function getGameNumberOfPlays() { // 替换为你实际要查询的gameNumber值,示例为测试用的171 var sentValue1 = 171; var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("gameNumberOfPlays").innerHTML = this.responseText; } }; // GET请求参数拼接在URL末尾,格式为?参数名=参数值 xhttp.open("GET", `numberOfPlays.php?sentValue1=${sentValue1}`, true); xhttp.send(); } </script>
后端PHP部分
增加参数校验逻辑,拿到参数后转成整数类型,和数据库gameNumber的int字段类型匹配,避免空值、非法值传入:
<?php $dbhost = 'localhost'; $dbuser = 'xxx'; $dbpwd = 'xxx'; $dbname = 'xxx'; $conn = new mysqli($dbhost, $dbuser, $dbpwd, $dbname); // 参数校验 if (!isset($_GET['sentValue1']) || !is_numeric($_GET['sentValue1'])) { echo "参数非法"; exit; } $p1 = intval($_GET['sentValue1']); $sql = "SELECT COUNT(ID) FROM `data` WHERE `gameNumber` = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param('i', $p1); $stmt->execute(); $result = $stmt->get_result(); $user = $result->fetch_array(); echo $user[0]; $conn->close(); ?>
验证方式
改完后先直接在浏览器地址栏访问你的站点路径/numberOfPlays.php?sentValue1=171,如果能返回正确统计值,说明后端逻辑正常,再触发前端函数测试即可。
内容的提问来源于stack exchange,提问作者onecatnomice
相关产品推荐
相关产品推荐

