Я читаю файл TEXT из PHP и пытаюсь выполнить команды из него, например, создание базы данных и всех таблиц и процедур, которые она имеет. Мой код создает таблицы, но не создает хранимые процедуры, указанные в файле.
DELIMITER $$ DROP PROCEDURE IF EXISTS `add_hits`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `add_hits`( In id varchar(255)) BEGIN select hits into @hits from db_books where Book_ID = id; update db_books set hits=@hits+1 where Book_ID = id; END$$
PDO не создает SP, как можно будет выполнить эту задачу? Я попытался выполнить всю часть кода вместе и по строкам, но ничего не работает.
Я пытаюсь создать сценарий установки БД.
Ну, PMA Помог мне ответить на этот собственный вопрос.
Чтобы преодолеть это, вам нужно удалить часть разделителя процедуры, чтобы ваши запросы стали такими:
DROP PROCEDURE IF EXISTS `add_hits`; CREATE DEFINER=`root`@`localhost` PROCEDURE `add_hits`( In id varchar(255)) BEGIN declare hits_bk int; select hits into hits_bk from db_books where Book_ID = id; update db_books set hits=hits_bk+1 where Book_ID = id; END;
Теперь запросы будут работать.
Благодаря @Your Common Sense и @RiggsFolly за помощь.
PHP позволяет выполнять только один запрос в обычном режиме, поэтому разделители не нужны
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass); $pdo->exec('DROP PROCEDURE IF EXISTS `add_hits`'); $pdo->exec('CREATE DEFINER=`root`@`localhost` PROCEDURE `add_hits`( In id varchar(255)) BEGIN declare hits_bk int; select hits into hits_bk from db_books where Book_ID = id; update db_books set hits=hits_bk+1 where Book_ID = id; END');
Стремясь продолжать тему и отвечать на вопрос
DELIMITER $$ DROP PROCEDURE IF EXISTS `add_hits`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `add_hits`( In id varchar(255)) BEGIN select hits into @hits from db_books where Book_ID = id; update db_books set hits=@hits+1 where Book_ID = id; END$$
Первое появление $$
приведет к прекращению DDL, поэтому
DROP PROCEDURE IF EXISTS `add_hits`$$
Поэтому я думаю, что это должно быть
DELIMITER $$ DROP PROCEDURE IF EXISTS `add_hits`; CREATE DEFINER=`root`@`localhost` PROCEDURE `add_hits`( In id varchar(255)) BEGIN select hits into @hits from db_books where Book_ID = id; update db_books set hits=@hits+1 where Book_ID = id; END $$