【发布时间】:2020-10-29 23:42:41
【问题描述】:
我目前正在创建的网站存在问题,我需要为每个用户创建一个表格,但它不起作用。我曾尝试在注册或第一次登录期间创建一个表,这也可以。我的问题是表的命名,因为我希望表具有以下名称。 “用户_1” “用户”是固定的,数字应该是用户的ID。 应该是这样的,表用户正常工作,但其他表不工作。
目前的数据库:
- 用户
- 用户_
数据库所需内容:
- 用户
- user_1
- user_2
表用户:
+----+--------------+-----------+------------------+---------------|
| id | first name | last name | email | password |
+------------------------------------------------------------------+
| 1 | user1 | user1 | user1@gmail.com | password Hash||
+------------------------------------------------------------------+
| 2 | user2 | user2 | user2@gmail.com | passowrd Hash |
+----+--------------+-----------+------------------+---------------+
我以前的机会: 到目前为止,如果注册成功,我已经尝试创建表。这是我可以创建表的错误,但它以名称“user_”创建它。 “id”被简单地省略了,所以我可以创建一个表。
使用第二种方法,我尝试在注册期间在表中存储一个“False”值,并在登录期间检查该值是否为“False”,如果是,则将此值更改为“True”并创建表。但是在这里我遇到了与第一次尝试相同的问题,即没有给我 id。
我的代码: 注册.php:
//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) {
$pdo = new PDO('mysql:host=localhost;dbname=fitnessstats', 'root', '');
if(isset($_GET['login'])) {
$email = $_POST['email'];
$passwort = $_POST['passwort'];
$statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$result = $statement->execute(array('email' => $email));
$user = $statement->fetch();
//Überprüfung des Passworts
if ($user !== false && password_verify($passwort, $user['passwort'])) {
$_SESSION['userid'] = $user['id'];
include 'createPersonalTable.php';
die('<script language="javascript" type="text/javascript"> document.location="geheim.php"; </script>'); //'Login erfolgreich. Weiter zu <a href="geheim.php">internen Bereich</a>'
} else {
$errorMessage = "E-Mail oder Passwort war ungültig<br>";
}
}
//User ID
$showFormular = false;
} else {
echo 'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
}
}
createPersonalTable.php:
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=fitnessstats', 'root', '');
$selectID = $pdo->prepare("SELECT * FROM users WHERE email = $email");
$idOutput = $selectID->execute(array('id' => $useridTable));
echo "$useridTable";
$tablename = "user_" . $useridTable;
//$tablename = "user_" . $vorname . $nachname;
$createTable = "CREATE TABLE $tablename (
id INT(255) AUTO_INCREMENT PRIMARY KEY,
gewicht FLOAT,
dauer FLOAT,
anzahl INT
)";
if(mysqli_query($conn, $createTable)){
echo "Table created successfully.";
//
} else{
echo "ERROR: Could not able to execute $createTable. " . mysqli_error($conn);
}
if(isset($errorMessage)) {
echo $errorMessage;
}
?>
我认为主要问题是读取 ID(即在本节中)。
$selectID = $pdo->prepare("SELECT * FROM users WHERE email = $email");
$idOutput = $selectID->execute(array('id' => $useridTable));
echo "$useridTable";
提前致谢
【问题讨论】:
-
为什么不把
gewicht和user_id放在一张桌子上呢?这是正确的方法,而不是为每个用户创建单独的表。您的方法将无法维护。例如。您需要添加新列或列出gewicht > 100.2等的所有用户... -
“我需要为每个用户准备一个表格”...这几乎肯定不是一个好的设计。为什么你认为你需要那个?这些表究竟存储了什么信息?可能您可以将列直接放入 users 表中,如果它是 1-1 映射,或者如果它是 1-many 映射,则您有一个“userdata”表,并且还有一个“user ID”列用作返回主用户表的外键。也许您需要在编写此应用程序时休息一下,并更详细地研究关系数据库设计,然后再为自己制造更多不必要的问题。
-
您说的很对,这段代码
$selectID = $pdo->prepare("SELECT * FROM users WHERE email = $email"); $idOutput = $selectID->execute(array('id' => $useridTable));没有意义。您准备一个不带参数的查询,然后使用您设置为不存在的变量的参数执行它,然后尝试使用该变量。看看它与代码中的其他类似查询有何不同。 -
当您已经必须建立一个连接才能使您的第一个查询正常工作时,也无需继续创建新的数据库连接。如果它们有正当理由,例如连接到不同的数据库,请给它们起不同的名称,否则它们会相互覆盖。