所以,导致错误的代码片段是:
$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();
}