代码之家  ›  专栏  ›  技术社区  ›  viKK

使用PHP变量名创建表不起作用

  •  0
  • viKK  · 技术社区  · 8 年前

    我已经看过了

    我是PHP新手,我希望你们能给我指出正确的方向。我已经阅读了以下帖子并修改了其答案,但我显然没有做正确的事情:

    Creating table with variable name php mysql

    Use a variable as table name when creating a table in mysql

    Create mysql table with php variable not working

    特别是,这段代码我一直在努力适应我自己的需要,因为这是使用heredocs的为数不多的例子之一,这就是我们被教会使用的:

    $create = <<<SQL
    CREATE TABLE `$tableusername` (
        `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `please` VARCHAR(50) NOT NULL,
        `make` VARCHAR(50) NOT NULL,
        `this` VARCHAR(50) NOT NULL,
        `work` VARCHAR(50) NOT NULL
    )
    

    我的处境

    我要我的登记簿。php使用用户选择的用户名创建一个新表。(如果用户已经登录,则无法访问Register.php,因此永远不可能复制表。)此表稍后将用于绘制表中包含的数据,这就是我没有设置PK的原因,因为该表永远不会被加入或与其他表共享其内容。(如果事实证明这是不可行的,我将添加一个自动递增的ID)。

    问题所在

    无法创建表。

    我的登记簿。php编辑:根据建议,我在代码中添加了

    我得到了一条关于将每个列名封装在引号中的语法的错误消息,因此我删除了这些错误消息,然后得到以下错误消息:

    Could not query database1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 11

    <?php
    include('template.php');
    if (isset($_POST['username']) and isset($_POST['password'])) {
        $name = $mysqli->real_escape_string($_POST['username']);
        $pwd = $mysqli->real_escape_string($_POST['password']);
        $mail = $mysqli->real_escape_string($_POST['email']);
        $first = $mysqli->real_escape_string($_POST['fname']);
        $last = $mysqli->real_escape_string($_POST['lname']);
        $query = <<<END
        INSERT INTO p_users(username,password,email,fname,lname)
            VALUES('{$name}','{$pwd}','
                {$mail}','{$first}','{$last}')
    END;
        $table = <<<END
            CREATE TABLE `$name` (
                steps_per_day int,
                energy_expenditure int,
                distance_walked_per_day int,
                bed_time int,
                waking_time int,
                hours_slept int,
                num_daytime_naps int,
                outdoor_temp int,
                indoor_temp int
            )
    END;
        if ($mysqli->query($table) !== TRUE) {
                die("Could not query database" . $mysqli->errno . " : " . $mysqli->error);
                    header('Location:index.php');
            }
        if ($mysqli->query($query) !== TRUE) {
            die("Could not query database" . $mysqli->errno . " : " . $mysqli->error);
                header('Location:index.php');
        }
    
    }
    
    $content = <<<END
    <form method="post" action="register.php">
    <input type="text" name="username" placeholder="username"><br>
    <input type="password" name="password" placeholder="password"><br>
    <input type="text" name="email" placeholder="email"><br>
    <input type="text" name="fname" placeholder="first name"><br>
    <input type="text" name="lname" placeholder="last name"><br>
    <input type="submit" value="Register">
    <input type="Reset" value="reset">
    </form>
    END;
    echo $navigation;
    echo $content;
    ?>
    
    1 回复  |  直到 8 年前
        1
  •  -1
  •   Peter van der Wal    8 年前

    indoor_temp int, -最后一个逗号不应该在那里,因为它是最后一列,因此导致 ... 室外温度 int, 室内温度 int, )

    旁注:

    你真的应该看看Deadooshka的评论。 real_escape_string 将值用作表名时,不会阻止SQL注入!!!

    可能是一个包含所有用户读数的表和一个额外的列 username (或 userid )是一种更好、更安全的数据库设计。

    推荐文章