【问题标题】:creating mysql tables with variable table names创建具有可变表名的mysql表
【发布时间】:2012-07-27 15:35:56
【问题描述】:

我正在尝试创建一个平台,在该平台上,可以从 php 创建表并将其命名为提交者键入的变量。我这里的代码会导致 mysql 语法错误。我相信这是括号放置的问题,但我尝试过的每一种组合都不成功,有人能弄清楚吗?我已经去掉了不正确的括号以减少混淆

    <?php

if (isset($_POST['submit']))
{ 
$name=$_POST['name'];

mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());


mysql_query("CREATE TABLE '$name'(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(30),
age INT)")
or die(mysql_error());  

echo "Table Created!";

?>   <html><form method='POST'>..........</html>

【问题讨论】:

  • 你能把你得到的语法错误贴出来吗?
  • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在“test”附近使用正确的语法(id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), name VARHA' at line 1
  • 在查询文本中使用 $name 周围的反引号,而不是单引号。反引号是 MySQL 中对象名称的默认分隔符。

标签: mysql


【解决方案1】:

在 SQL 文本中的表名周围使用反引号:

mysql_query("CREATE TABLE `$name`(

反引号是 MySQL 中标识符的默认分隔符。 (注意:可以启用其他分隔符,但您并不想去那里。)

如果标识符是保留字,包含空格等,则需要反引号。(在很多情况下可以省略反引号,但在不需要时使用它们并没有错。基本上,认为规则中的“总是在标识符周围使用反引号”,并在方便时省略它们并且您确定它们不是必需的。)

【讨论】:

    【解决方案2】:

    这可能有效:

    if (isset($_POST['submit']))
    { 
    $name=$_POST['name'];
    
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("test") or die(mysql_error());
    
    
    mysql_query("CREATE TABLE ".$name."(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    name VARCHAR(30),
    age INT)")
    or die(mysql_error());  
    
    echo "Table Created!";
    }
    ?>
    

    我已经对其进行了测试,没有问题...它创建了具有这种结构的表。

    【讨论】:

      【解决方案3】:

      更改为:mysql_query("CREATE TABLE ".$name."(

      【讨论】:

        【解决方案4】:

        你不要单引号表名。将它放在反引号中,以便它可以处理与保留字或字符匹配的名称。像这样

        mysql_query("CREATE TABLE `$name`(
        id INT NOT NULL AUTO_INCREMENT,
        PRIMARY KEY(id),
        name VARCHAR(30),
        age INT)")
        

        你也可以像其他建议的答案那样不使用反引号,但如果你不想先检查表名和一堆 MySQL 保留字,这会更可靠。

        【讨论】:

          【解决方案5】:

          除非您完全信任输入数据,否则验证 $name 非常重要 protect against SQL injection.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-21
            • 2015-06-20
            • 2016-11-16
            • 2012-01-13
            • 1970-01-01
            • 2013-11-10
            相关资源
            最近更新 更多