在数据库中创建一个新表 [关闭]

Posted

技术标签:

【中文标题】在数据库中创建一个新表 [关闭]【英文标题】:Create a new table in the database [closed] 【发布时间】:2021-08-31 14:59:00 【问题描述】:

我在 php 文件中有一个表单。发送表单时,我调用一个 test.php 文件来检查接收到的数据的有效性并将它们插入到我的数据库表中。我还想在数据库中创建一个名为 $category_ $username 的新表。文件如下:

<?php

if(isset($_POST['mySubmit'])) 
    $db = mysqli_connect('localhost','root','','DBsito');
    if (!$db)
    
        die('Could not connect to database: ' . mysqli_error());
    

    $db_select = mysqli_select_db($db, 'DBsito');

    //Salva il nome del file
    $imagename = $_FILES['icona']['name'];
    //tipo del file
    $imagetype = $_FILES['icona']['type'];
    $imagetemp = $_FILES['icona']['tmp_name'];
    
    //Path dell'upload
    $imagePath = "img/upload/";
    
    if(is_uploaded_file($imagetemp)) 
        if(move_uploaded_file($imagetemp, $imagePath . $imagename)) 
            echo "Sussecfully uploaded your image.";
        
        else 
            echo "Failed to move your image.";
        
        
    
    else 
        echo "Failed to upload your image.";
    

    $categoria = mysqli_real_escape_string($db, $_POST['categoria']);
    $username = mysqli_real_escape_string($db, $_POST['utente']);

    $result = mysqli_query($db, "SELECT categoria.nome_categoria, categoria.user_utente FROM categoria WHERE BINARY categoria.nome_categoria = BINARY '$categoria' AND BINARY categoria.user_utente = BINARY '$username' ");

    if(!empty($categoria) && mysqli_num_rows($result)) 
        $name_error = "Categoria già esistente!";

    
    else if (!empty($categoria))
        $query = "INSERT INTO categoria (nome_categoria, user_utente, icona) values ('$categoria','$username', '$imagename')";
        $db->query("CREATE TABLE '$categoria'_'$username'");

        // sql to create table
        $sql = "CREATE TABLE $categoria'_'$username (
        )";
        
        if ($db->query($sql) === TRUE) 
        echo "Table MyGuests created successfully";
         else 
        echo "Error creating table: " . $db->error;
        

        if(!mysqli_query($db, $query))
            die("DAMMIT");
        
        else 
             header("Location: confermaCategoria.php"); 
        
        mysqli_query($db, $query);
    
    else 
        $name_error = "";
    
    mysqli_close($db);


?>

数据被插入到数据库中的现有表中,但我无法创建新表。我能怎么做?我哪里错了?

【问题讨论】:

您不应该在用户输入时创建新表。此外,您的查询对 SQL 注入开放。在查询字符串中使用准备好的语句而不是变量。 只是不要!您将在管理这些只有少量记录的表时遇到问题。最好为所有用户提供一个表来存储该信息,并为用户表提供适当的索引。 而您的 create table 语句只是语法错误。名字是CREATE TABLE fooCategory'_'barUsername。并且必须定义列 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或MySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough! 【参考方案1】:

您的表名周围和表名中有不正确的引号。您还必须在表中指定至少一列。我已经编了几列,你应该用你需要的名称和类型来替换它们。

$sql = "CREATE TABLE `$categoria_$username` (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    col1 VARCHAR(100)";

您还需要添加对$categoria$username 的验证以防止SQL 注入。您不能将准备好的语句与表/列名称的参数一起使用,因此您必须自己验证它们。使用mysqli_real_escape_string() 也没什么意义,因为转义在这些名称中不起作用。

一般来说,如果您像这样动态地创建表名,那么您的数据库设计就很差。动态信息应该在表数据中,而不是在表/列名中。

【讨论】:

我尝试这样做,但我的数据库中没有创建表。为什么? 创建时需要列出表中的所有列。 我还是看不到它,即使我插入了列 执行查询时是否出错?如果没有,则必须创建表。 我试图插入这个检查,它实际上返回了 DAMMIT: if(!mysqli_query($db, $sql)) die("DAMMIT"); `

以上是关于在数据库中创建一个新表 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我想从两个表的数据中创建一个新表

如何在现有 Sqlite DB 中添加新表

如何在现有的cloudant nosql数据库中创建/添加新表

如何仅在表中创建具有名字的新表

在 Django 的 view.py 中创建一个新表

如何在 Google Bigquery 中创建动态更改数据集的查询?