如何通过在PHP中删除表来修复SQL错误?

时间:2019-01-02 18:11:50

标签: php mysql sql mariadb

我创建了一个网站,您可以上传和下载文件-一切正常。但是现在,我想创建一个初始化文件,该文件将删除数据库中的旧记录并在其中创建新表。

所以我这样写:

$command = "
IF OBJECT_ID(`".$database.".Users`) IS NOT NULL 
    DROP TABLE ".$database.".Users; 
IF OBJECT_ID(`".$database.".Uploads`) IS NOT NULL 
    DROP TABLE ".$database.".Uploads; 

CREATE TABLE `Users` (
  `Id` int(11) NOT NULL,
  `User` text NOT NULL,
  `Password` text NOT NULL,
  `Permission` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

ALTER TABLE `Users` ADD PRIMARY KEY (`Id`);
ALTER TABLE `Users` MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=0;

CREATE TABLE `Uploads` (
  `Id` int(11) NOT NULL,
  `Name` text NOT NULL,
  `User` text NOT NULL,
  `Comment` text NOT NULL,
  `Path` text NOT NULL,
  `Permission` int(11) NOT NULL,
  `Date` text NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

ALTER TABLE `Uploads` ADD PRIMARY KEY (`Id`);
ALTER TABLE `Uploads` MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=0;
";
$result = mysqli_query($conn, $command) or die(mysqli_error($conn));

我认为,该代码是正确的(但显然不正确)。当我运行它时,SQL会引发错误:

  

您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以在第1 **行的'IF OBJECT_ID(db.Users)IS NOT NULL DROP TABLE db.User'附近使用正确的语法。

这意味着它与SQL数据库的连接没有问题。

我尝试使用IF OBJECT_ID而不是IF NOT EXISTS,但是它也不起作用。谁能告诉我多行SQL命令是这个问题还是其他问题?

注意:我使用5.5.37版的MariaDB(如果有帮助)

3 个答案:

答案 0 :(得分:1)

IF在MySQL / MariaDB中不是有效的SQL语句。

问题中的IF OBJECT_ID(...)语句似乎是Transact-SQL(Microsoft SQL Server)构造。

MySQL中的等效功能将通过

实现
DROP TABLE IF EXISTS foo.mytable ;

(我希望这可以在MariaDB 5.5中使用,但我尚未验证。)

请注意,如果该表不存在,则该语句的执行将引发警告。 (警告消息,而不是错误消息。)


mysqli_query 函数运行一条语句。要运行多个语句,我们可以使用 mysqli_multi_query 函数(在此处记录):

http://php.net/manual/en/mysqli.multi-query.php

答案 1 :(得分:0)

从未使用过OBJECT_ID,但是您想要的东西似乎很容易实现 “如果存在用户,则删除表;”

答案 2 :(得分:0)

就问题而言,OBJECT_ID在mysql中不存在,仅在mssql中存在。 Searching for OBJECT_ID mysql 8.0 reference manual不会重新调整任何有意义的内容。即使它存在,您的IF块语法也不理想:您想要IF...THEN...END

要解决该错误,您可以替换为:

IF OBJECT_ID(`".$database.".Users`) IS NOT NULL 
DROP TABLE ".$database.".Users; 
IF OBJECT_ID(`".$database.".Uploads`) IS NOT NULL 
DROP TABLE ".$database.".Uploads; 

使用:

DROP TABLE IF EXISTS ".$database.".Users;
DROP TABLE IF EXISTS ".$database.".Uploads;