【问题标题】:Create Stored Procedures with PDO in PHP在 PHP 中使用 PDO 创建存储过程
【发布时间】:2013-08-26 21:55:58
【问题描述】:

我正在从 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,如何才能完成这项任务? 我曾尝试将所有代码部分一起逐行执行,但没有任何效果。
我正在尝试制作数据库安装脚本。

【问题讨论】:

    标签: php mysql sql stored-procedures pdo


    【解决方案1】:

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

    【讨论】:

    • 因为PDO每次执行只允许一个查询,你可以用Timo Huovinen的解决方案,一个一个地执行,最好是在事务中。
    【解决方案2】:

    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');
    

    【讨论】:

      【解决方案3】:

      努力保持话题并回答问题

      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
      $$
      

      【讨论】:

      • 现在我的查询是:DELIMITER $$ DROP PROCEDURE IF EXISTS add_hits; CREATE DEFINER=root@localhost PROCEDURE add_hits( In id varchar(255)) BEGIN declare hits_bk int;从 db_books where Book_ID = id 中选择 hits_bk;更新 db_books set hits=hits_bk+1 where Book_ID = id; END$$ 在此之后我还有另一个过程: DROP PROCEDURE IF EXISTS add_issues_num; 我正在通过 exec 方法一起运行整个部分。但是还是不行。
      猜你喜欢
      • 2012-08-03
      • 2017-09-28
      • 2017-08-09
      • 2012-03-07
      • 1970-01-01
      • 2014-08-08
      • 2019-05-11
      • 2014-09-07
      相关资源
      最近更新 更多