如何通过在PHP中删除表来修复SQL错误?
我已经创建了一个网站,你可以上传和下载文件-一切工作完美。但现在,我想创建一个init文件,删除数据库中的旧记录并在其中创建一个新表 所以我写下:如何通过在PHP中删除表来修复SQL错误?,php,mysql,sql,mariadb,Php,Mysql,Sql,Mariadb,我已经创建了一个网站,你可以上传和下载文件-一切工作完美。但现在,我想创建一个init文件,删除数据库中的旧记录并在其中创建一个新表 所以我写下: $command = " IF OBJECT_ID(`".$database.".Users`) IS NOT NULL DROP TABLE ".$database.".Users; IF OBJECT_ID(`".$database.".Uploads`) IS NOT NULL DROP TABLE ".$database
$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
)不是NULL DROP TABLE db.User”附近使用的正确语法
这意味着它与SQL数据库的连接没有问题
我尝试了在对象ID不存在时使用,而不是,但它也不起作用。谁能告诉我多行SQL命令是这个问题还是其他问题
注意:我使用5.5.37版本的MariaDB(如果有帮助)从未使用过对象ID,但您想要的似乎很容易实现
“如果存在用户,则删除表;”就用户而言,对象ID在mysql中不存在,仅在mssql中存在。不重复任何有意义的内容。即使它存在,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;
如果
不是MySQL/MariaDB中的有效SQL语句
问题中的IF OBJECT\u ID(…)
语句似乎是Transact-SQL(Microsoft SQL Server)构造
MySQL中的等效功能可以通过
DROP TABLE IF EXISTS foo.mytable ;
(我预计这将在MariaDB 5.5中起作用,但我尚未验证。)
请注意,如果该表不存在,则语句的执行将引发警告。(警告消息,而不是错误消息。)
mysqli\u查询
函数运行一条语句。要运行多条语句,我们可以使用mysqli\u multi\u query
函数,如下所示:
在很多地方,你用单引号,
代替了勾号,
。是的,但我用勾号也试过了,但结果是一样的;你必须更新你的问题,包括所有这些的真正语法。它也可以基于此关闭;它们必须分开分隔……也许,我从未见过Mysql/MariaDB中使用的对象ID,只有MSSQL。此外,除非MariaDB与MySQL有很大的不同,否则不能将脚本作为查询执行。您需要一次执行一个,如果存在,请使用删除表
,因为您不能使用如果
。对不起-现在它是对的。哦,对不起,我误解了。你写道:“我试过用IF NOT EXISTS代替IF OBJECT_ID use IF NOT EXISTS”我以为你试过在create table query中写‘IF NOT EXIST’,而不是在drop table query中写‘IF NOT EXISTS’,我试过了,但不管用。(现在,我又试了一次,但还是不起作用)@GBM After change“您的SQL语法有错误;请检查与您的MariaDB服务器版本相对应的手册,以了解在“DROP TABLE IF EXISTS db.Uploads;CREATE TABLEUsers
”(第2行的Id
)附近使用的正确语法(几乎相同)mysqli_multi_query-就是这样!谢谢!出于安全原因,避免使用mysqli_multi_query
。可以从PHP发出多个命令(这不是问题),也可以编写一个存储过程将其封装在一起,然后调用SP。