在 PHP 中使用 PDO 创建存储过程

Posted

技术标签:

【中文标题】在 PHP 中使用 PDO 创建存储过程【英文标题】:Create Stored Procedures with PDO in PHP 【发布时间】: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,如何才能完成这项任务? 我曾尝试将所有代码部分一起逐行执行,但没有任何效果。 我正在尝试制作数据库安装脚本。

【问题讨论】:

【参考方案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 方法一起运行整个部分。但是还是不行。

以上是关于在 PHP 中使用 PDO 创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP PDO 调用 MySQL 存储过程 [重复]

如何使用 PDO 在 PHP 中创建包含 DELIMITER 的存储过程?

使用 PDO 在 php 中使用 mac 运行 MS SQL 服务器存储过程

使用 PHP PDO 将参数传递给 SQL Server 存储过程

使用 php PDO 调用多个存储过程

PHP 7和MSSQL PDO:使用输入和输出参数调用存储过程