PHP登录功能中MySQL SELECT查询无结果问题排查求助
排查PHP登录查询无结果的问题
我帮你梳理下代码里的几个关键问题,这些应该就是导致你无法获取查询结果的原因:
1. 数据库连接未做错误检查
你当前的代码没有验证mysqli_connect和mysqli_select_db是否成功,如果连接失败或者选择数据库出错,后续的查询自然无法得到有效结果。必须在连接后添加错误判断,才能定位到连接层面的问题。
2. 混用mysql与mysqli函数 + 变量名错误
代码里写了mysql_fetch_row($return)——这是已经废弃的旧mysql扩展函数,而且变量名完全错误:应该用mysqli_fetch_row($result),操作的是之前查询得到的$result变量,而不是后面才定义的$return数组。
3. Session启动位置错误
session_start()必须放在PHP脚本的最顶部,在任何输出(包括空格、换行)之前执行,否则会话无法正常初始化。你现在把它放在if分支里,位置完全不对。
4. SQL注入风险 + 潜在语法错误
直接把$_POST参数拼进SQL语句,不仅有严重的注入风险,还可能因为输入里的特殊字符(比如单引号)导致SQL语法错误,让查询直接执行失败。必须使用mysqli预处理语句来解决这个问题。
5. 查询结果有效性判断缺失
mysqli_query可能返回false(当查询失败时),你直接调用mysqli_num_rows($result)会触发报错,应该先判断$result是否为有效结果集。
修正后的signin.php代码
<?php // 必须放在最顶部启动会话,确保无任何前置输出 session_start(); $mysql_hostname = "localhost"; $mysql_user = "spman"; $mysql_password = "spman"; $mysql_database = "sharepractice"; // 连接数据库并检查错误(直接在connect时指定数据库,省去select_db步骤) $conn = mysqli_connect($mysql_hostname, $mysql_user, $mysql_password, $mysql_database); if (!$conn) { error_log("数据库连接失败: " . mysqli_connect_error()); $return = array('result' => false, 'message' => "数据库连接失败"); echo json_encode($return); exit; } // 使用预处理语句避免SQL注入,同时避免语法错误 $query = "SELECT email, nickname FROM userinfo WHERE vald = 'Y' AND email = ? AND password = ?"; $stmt = mysqli_prepare($conn, $query); // 绑定参数:s表示字符串类型,两个参数对应SQL里的两个? mysqli_stmt_bind_param($stmt, "ss", $_POST['email'], $_POST['password']); mysqli_stmt_execute($stmt); // 获取查询结果集 $result = mysqli_stmt_get_result($stmt); // 检查结果集是否有效 if (!$result) { error_log("查询执行失败: " . mysqli_error($conn)); $return = array('result' => false, 'message' => "查询失败"); echo json_encode($return); mysqli_close($conn); exit; } $count = mysqli_num_rows($result); error_log(var_export($count, 1)); if ($count == 1) { $row = mysqli_fetch_row($result); error_log(var_export($row, 1)); $_SESSION['email'] = $row[0]; $_SESSION['nickname'] = $row[1]; $return = array('result' => true, 'message' => "success"); } else { $return = array('result' => false, 'message' => "邮箱或密码错误"); } echo json_encode($return); // 关闭预处理语句和数据库连接 mysqli_stmt_close($stmt); mysqli_close($conn); ?>
补充:signin.js的小问题修复
你的JS代码里变量名不一致:
// 原代码:var save = document.getElementById('btnSignIn'); // 改成: var btnSignIn = document.getElementById('btnSignIn'); btnSignIn.addEventListener('click', function() { // ... 原有逻辑 });
另外不建议使用async: false,它会阻塞浏览器主线程,改成默认的async: true即可(可以删除这个配置项,因为默认就是true)。
内容的提问来源于stack exchange,提问作者js. c
相关产品推荐
相关产品推荐

