为每个用户创建带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
相关产品推荐
相关产品推荐

