Как исправить ошибку SQL при удалении таблицы в PHP? - PullRequest
0 голосов
/ 02 января 2019

Я создал сеть, в которую вы можете загружать и скачивать файлы - все работает отлично. Но теперь я хочу создать файл инициализации, который удалит старые записи в базе данных и создаст в ней новые таблицы.

Итак, я пишу это:

$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, на предмет правильного синтаксиса, который можно использовать рядом с «IF OBJECT_ID (db.Users) NOT NULL DROP TABLE db.User» в строке 1 **.

Это означает, что у него нет проблем с подключением к базе данных SQL.

Я пытался вместо IF OBJECT_ID использовать IF NOT EXISTS, но это тоже не работает. Кто-нибудь может сказать мне, является ли многострочная команда SQL этой проблемой или это что-то еще?

Примечание: я использую 5.5.37 версию MariaDB (если это поможет)

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Что касается OBJECT_ID, то он не существует в mysql, только в mssql. Поиск OBJECT_ID mysql 8.0 справочное руководство не возвращает ничего значащего. Даже если бы он существовал, ваш синтаксис для блока 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;
0 голосов
/ 02 января 2019

IF не является допустимым оператором SQL в MySQL / MariaDB.

Оператор 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

0 голосов
/ 02 января 2019

никогда не использовал OBJECT_ID, но то, что вы хотите, кажется легко выполнимым "удалить таблицу, если существует пользователь;"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...