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

PHP登录后跳转至index.php报错:conn未定义及query()调用失败

解决登录系统中的数据库连接错误

看起来你的登录脚本遇到了数据库连接相关的问题,咱们一步步来排查和解决:

报错原因分析

你看到的两个错误是连锁反应:

  1. Notice: Undefined variable: conn:说明login.php里找不到$conn这个变量——要么是connection.php没有正确定义这个变量,要么是include路径不对导致连接文件根本没加载成功。
  2. Fatal error: Call to a member function query() on null:因为$conn是null(未定义或连接失败),所以调用query()方法自然会触发致命错误。

分步解决方案

1. 检查connection.php的正确性

首先确保你的数据库连接文件connection.php正确创建了$conn变量,以下是MySQLi和PDO两种常见的正确写法:

MySQLi 写法

<?php
// 替换成你的数据库配置
$db_host = 'localhost';
$db_name = 'your_database_name';
$db_user = 'root'; // 通常XAMPP默认是root
$db_pass = ''; // XAMPP默认密码为空

// 创建数据库连接
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);

// 检查连接是否成功
if ($conn->connect_error) {
    die("数据库连接失败: " . $conn->connect_error);
}
?>

PDO 写法

<?php
$db_host = 'localhost';
$db_name = 'your_database_name';
$db_user = 'root';
$db_pass = '';

try {
    $conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
?>

2. 确保login.php正确加载connection.php

  • 先确认connection.php和login.php在同一个目录下,如果不在,要调整include的路径(比如上级目录用include('../connection.php'))。
  • 可以在include后加一个检查,确保连接变量存在:
<?php
session_start(); // 注意:session_start()必须放在所有输出之前,建议移到最开头
include('connection.php');

// 检查连接是否成功加载
if (!isset($conn) || $conn === null) {
    die("错误:数据库连接文件未正确加载或连接失败");
}

// 你的登录逻辑代码...
?>

3. 修复登录逻辑的安全问题(额外建议)

从你的代码片段来看,还需要注意安全问题:

  • 避免SQL注入:永远不要直接把用户输入拼到SQL语句里,一定要用预处理语句(上面的MySQLi示例已经用了prepare和bind_param)。
  • 密码安全:不要明文存储密码,注册用户时用password_hash()加密,登录时用password_verify()验证,不要直接比较明文密码。
  • 跳转后终止代码:使用header('Location: index.php')后一定要加exit或die,避免后续代码继续执行。

修正后的login.php示例

<?php
session_start(); // 移到最顶部,确保没有输出前调用

// 已登录用户直接跳转
if (!empty($_SESSION['username'])) {
    header('Location: index.php');
    exit;
}

include('connection.php');
// 检查连接
if (!isset($conn) || $conn->connect_error) {
    die("数据库连接失败");
}

// 处理登录提交
if (isset($_POST['submit'])) {
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    // 使用预处理语句查询用户
    $stmt = $conn->prepare("SELECT id, username, password FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows === 1) {
        $user = $result->fetch_assoc();
        // 验证密码
        if (password_verify($password, $user['password'])) {
            $_SESSION['username'] = $user['username'];
            header('Location: index.php');
            exit;
        } else {
            echo "<p>密码错误,请重试</p>";
        }
    } else {
        echo "<p>用户名不存在,请重试</p>";
    }

    $stmt->close();
}
?>

内容的提问来源于stack exchange,提问作者Panca E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:24:12