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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:20:14