6

我正在从 PHP 读取 TEXT 文件并尝试从中执行命令,例如创建数据库及其拥有的所有表和过程。我的代码创建了表,但没有创建文件中给出的存储过程。

 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,怎么能完成这个任务呢?我试过一起执行所有代码部分并逐行执行,但没有任何效果。
我正在尝试制作数据库安装程序脚本。

4

3 回答 3

13

好吧,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 的帮助。

于 2013-08-23T20:15:00.550 回答
7

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');
于 2015-08-11T12:01:18.013 回答
1

努力保持话题并回答问题

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
$$
于 2013-08-23T18:57:49.903 回答