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

为每个用户创建带ID后缀的数据表失败,请求技术支持

问题分析与解决方案

首先咱们直接抓核心:你的代码现在有三个关键错误,导致拿不到用户ID、表名缺失后缀,甚至还有数据库扩展混用的问题。我一步步给你拆解并修正:

1. 最冗余的错误:没必要重新查询用户ID

你在登录成功后已经把用户ID存入$_SESSION['userid']了,在createPersonalTable.php里直接用这个值就行,完全不需要再查一次数据库——这不仅多余,还因为你没正确传递$email变量导致查询失败,$useridTable根本没赋值,所以表名变成了user_。

2. 数据库扩展混用导致创建表失败

你前面用PDO连接数据库,但后面突然用mysqli_query($conn, $createTable),这两个是完全独立的PHP数据库扩展,$conn变量根本没定义,所以创建表的代码肯定报错。必须统一用PDO来操作。

3. 注册逻辑混乱:嵌套登录代码完全没必要

你在注册成功的代码块里嵌套了登录的处理逻辑,这会导致只有注册时同时携带login的GET参数才会执行,逻辑完全混乱。注册成功后直接获取刚插入的用户ID,自动登录并创建表即可。


修正后的代码

第一步:修复registration.php的注册逻辑

把注册成功后的代码改成这样,直接获取刚注册用户的ID,自动登录并创建表:

//Keine Fehler, wir können den Nutzer registrieren
if(!$error) {
    $passwort_hash = password_hash($passwort, PASSWORD_DEFAULT);
    $statement = $pdo->prepare("INSERT INTO users (email, passwort, vorname, nachname) VALUES (:email, :passwort, :vorname, :nachname)");
    $result = $statement->execute(array(
        'email' => $email, 
        'passwort' => $passwort_hash, 
        'vorname' => $vorname, 
        'nachname' => $nachname
    ));

    if($result) {
        // 获取刚插入的用户ID(PDO自带方法,高效准确)
        $new_user_id = $pdo->lastInsertId();
        
        // 启动session并存储用户ID
        session_start();
        $_SESSION['userid'] = $new_user_id;
        
        // 创建用户专属表
        include 'createPersonalTable.php';
        
        // 跳转到内部页面
        header("Location: geheim.php");
        exit; // 跳转后必须终止代码执行
    } else {
        echo 'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
    }
}

第二步:彻底重写createPersonalTable.php

去掉冗余的查询,直接用session里的用户ID,统一用PDO操作:

<?php
// 确保session已启动(如果调用页面没启动的话)
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// 检查用户是否已登录(防止直接访问这个页面)
if (!isset($_SESSION['userid'])) {
    die("Fehler: Du bist nicht eingeloggt!");
}

// 从session获取用户ID
$user_id = $_SESSION['userid'];
$tablename = "user_" . $user_id;

// 初始化PDO连接(最好把连接逻辑抽成公共文件,避免重复代码)
try {
    $pdo = new PDO('mysql:host=localhost;dbname=fitnessstats', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 开启错误提示,方便调试
} catch(PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}

try {
    // 创建表的SQL,用反引号包裹表名避免特殊字符冲突
    $create_table_sql = "CREATE TABLE `$tablename` (
        id INT AUTO_INCREMENT PRIMARY KEY,
        gewicht FLOAT,
        dauer FLOAT,
        anzahl INT
    )";
    $pdo->exec($create_table_sql);
    echo "Benuzertabelle $tablename wurde erfolgreich erstellt!";
} catch(PDOException $e) {
    echo "Fehler bei der Tabellenerstellung: " . $e->getMessage();
}
?>

额外建议:不推荐为每个用户创建独立表

虽然你的需求是实现这个功能,但从数据库设计的角度来说,为每个用户创建独立表是非常糟糕的实践。更好的做法是创建一个统一的表(比如user_stats),里面加一个user_id字段关联users表的id,这样:

  • 不用维护几十上百个结构完全一样的表
  • 查询、统计数据更方便
  • 数据库性能更优

比如user_stats的结构可以是:

CREATE TABLE user_stats (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    gewicht FLOAT,
    dauer FLOAT,
    anzahl INT,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

这样每个用户的数据都存在这个表里,通过user_id区分即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:12:40