SQL 语法 通过 PHP 运行时出错,但作为 SQL 查询运行良好


SQL Syntax Error when running through PHP but runs fine as an SQL Query

所以,导致错误的代码片段是:

$con = mysqli_connect('localhost', 'root', '', 'notesDB');
if(isset($_POST['tableName'])) {
    $tName = htmlentities($_POST['tableName']);
    $firstQuery = mysqli_query($con,"INSERT into notes(Title) VALUES( '$tName'); CREATE TABLE $tName(id int NOT NULL AUTO_INCREMENT, Title varchar(20) NOT NULL, Description varchar(100), PRIMARY KEY(id));");
    if($firstQuery){
        header("Location: create2.php");
    }
    else 
        echo mysqli_error($con);
}

其输出为:

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 'CREATE TABLE test1(id int NOT NULL AUTO_INCREMENT, Title varchar(20) NOT NULL, D' at line 1

好吧,有趣的是,确切的代码(变量除外 - 我刚刚删除了 $ 符号)在 phpMyAdmin 中完美执行。

此外,为了证明 php 没有真正的问题,当查询只是 INSERT 查询(而不是 CREATE 查询)时,执行的查询没有任何错误。

mysqli_query一次

只能执行一个查询。

请尝试mysqli_multi_query

作为旁白,动态创建表通常是较大设计问题的标志。架构应该是相对静态的,而数据应该是动态的。

您正在尝试在代码中一次运行两个单独的查询,但不能那样运行。您必须单独运行它们,如下所示:

$con = mysqli_connect('localhost', 'root', '', 'notesDB');
if(isset($_POST['tableName'])) {
    $tName = htmlentities($_POST['tableName']);
    $firstQuery = mysqli_query($con,"INSERT into notes(Title) VALUES( '$tName')");
$secondQuery = mysqli_query("CREATE        TABLE '$tName' (id int NOT NULL AUTO_INCREMENT, Title varchar(20) NOT NULL, Description varchar(100), PRIMARY KEY(id));");
    if($firstQuery || $secondQuery){
        header("Location: create2.php");
    }
    else 
        echo mysqli_error($con);
}

您的数据库体系结构是错误的。
不应动态创建表。因此,您只需使用简单的常规 INSERT 查询注册任何新实体。然后使用此实体的 id 链接另一个 [已存在的] 表中的记录。

if(isset($_POST['tableName'])) {
    $stm = mysqli_prepare($con,"INSERT into notes(Title) VALUES(?)");
    $stm->bind_param("s",$_POST['tableName']);
    $stm->execute();
}