【问题标题】:Create a table for each user with their ID为每个用户创建一个带有他们 ID 的表
【发布时间】: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";

提前致谢

【问题讨论】:

  • 为什么不把gewichtuser_id 放在一张桌子上呢?这是正确的方法,而不是为每个用户创建单独的表。您的方法将无法维护。例如。您需要添加新列或列出gewicht &gt; 100.2 等的所有用户...
  • “我需要为每个用户准备一个表格”...这几乎肯定不是一个好的设计。为什么你认为你需要那个?这些表究竟存储了什么信息?可能您可以将列直接放入 users 表中,如果它是 1-1 映射,或者如果它是 1-many 映射,则您有一个“userdata”表,并且还有一个“user ID”列用作返回主用户表的外键。也许您需要在编写此应用程序时休息一下,并更详细地研究关系数据库设计,然后再为自己制造更多不必要的问题。
  • 您说的很对,这段代码$selectID = $pdo-&gt;prepare("SELECT * FROM users WHERE email = $email"); $idOutput = $selectID-&gt;execute(array('id' =&gt; $useridTable)); 没有意义。您准备一个不带参数的查询,然后使用您设置为不存在的变量的参数执行它,然后尝试使用该变量。看看它与代码中的其他类似查询有何不同。
  • 当您已经必须建立一个连接才能使您的第一个查询正常工作时,也无需继续创建新的数据库连接。如果它们有正当理由,例如连接到不同的数据库,请给它们起不同的名称,否则它们会相互覆盖。

标签: php sql


【解决方案1】:

回过头来:回想起来上面的问题没有多大意义,因为通常您会在表之间创建关系,如果您将来遇到这个问题,请在此处寻找合适的解决方案。

我没有在这里编写所有代码,因为它很多,但我已经重新安排了我的表格,W3schools 帮助我解决了很多不同的问题。

https://www.w3schools.com/sql/sql_foreignkey.asp

https://www.w3schools.com/sql/sql_join.asp

【讨论】:

    【解决方案2】:

    我使用 PDO,还有一个名为 lastInsertId() 的函数 当您在用户数据库中存储新用户时可以使用它 例如:$id = pdo->lastInsertId();

    然后你在你的表名中添加这个 $id 变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2021-11-20
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多