【问题标题】:Creating a MySql table with a php variable as a name创建一个以 php 变量为名称的 MySql 表
【发布时间】:2020-08-20 17:08:50
【问题描述】:

我正在尝试编写一个基本函数来创建一个以名称作为参数的表。

当我执行这个函数时,我得到了这个错误: “您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '( id int(10) unsigned NOT NULL AUTO_INCREMENT, nom VARCHAR (255), questio' 附近使用正确的语法"

我查看了很多论坛帖子,似乎这种语法对某些人有效,但对 meeee 无效! 这是我的代码:

function connexion_bd() {
    $serv ="localhost";
    $username = "root";
    $pwd = "blah_blah";
    $bd ="project";
    $connex = mysqli_connect($serv, $username, $pwd, $bd);  
    if (! $connex) {
        page_erreur(ERR_CONNEX, mysqli_connect_error($connex)); exit; 
    }
    return $connex;
}

function creer_jeu_bdd($nom) {
    $connex = connexion_bd();

    $nom = mysqli_real_escape_string($connex,$nom);

    $req = "CREATE TABLE IF NOT EXISTS ".$nom." ( 
        id int(10) unsigned NOT NULL AUTO_INCREMENT,
        nom VARCHAR (255),
        question text NOT NULL,
        reponse1 VARCHAR(256) NOT NULL DEFAULT ``,
        reponse2 VARCHAR(256) NOT NULL DEFAULT ``,
        reponse3 VARCHAR(256) NOT NULL DEFAULT ``,
        bonne_reponse TINYINT(2) UNSIGNED NOT NULL,
        foreign key (nom) references jeux(nom),
        primary key(`id`)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8; ";
    $resultat = mysqli_query($connex, $req);

    if (!$resultat) {
        page_erreur(ERR_REQUETE, mysqli_error($connex)); 
    } elseif (mysqli_num_rows($resultat) > 0) {
        page_erreur(ERR_LOGIN, ''); 
    }
    mysqli_close($connex);
    exit;
}

非常感谢。

【问题讨论】:

  • $nom 为空。另外,mysqli_real_escape_string我们绝对在这里没用
  • $nom 有什么价值?并且默认的双反引号是错误的。您可能的意思是双单引号。硒"When to use single quotes, double quotes, and backticks in MySQL"
  • 每当您发现自己使用枚举列名(例如,2)时,请考虑您的架构设计是否最佳
  • 正确的字符集是utf8mb4

标签: php mysql database mysqli


【解决方案1】:

您的 varchar 的默认值必须是 char,因此请使用单引号和 niot 反引号

请查看When to use single quotes, double quotes, and backticks in MySQL

 $req = "CREATE TABLE IF NOT EXISTS ".$nom." ( 
        id int(10) unsigned NOT NULL AUTO_INCREMENT,
        nom VARCHAR (255),
        question text NOT NULL,
        reponse1 VARCHAR(256) NOT NULL DEFAULT '',
        reponse2 VARCHAR(256) NOT NULL DEFAULT '',
        reponse3 VARCHAR(256) NOT NULL DEFAULT '',
        bonne_reponse TINYINT(2) UNSIGNED NOT NULL,
        foreign key (nom) references jeux(nom),
        primary key(`id`)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8; ";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 2017-08-19
    • 1970-01-01
    • 2016-02-25
    • 2018-05-29
    • 2013-04-27
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多