6

PHP から TEXT ファイルを読み取り、そこからコマンドを実行しようとしています。たとえば、DB とそれに含まれるすべてのテーブルとプロシージャを作成します。私のコードはテーブルを作成しますが、ファイルに指定されたストアド プロシージャを作成しません。

 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 行ずつ実行しようとしましたが、何も機能しません。
DB インストーラー スクリプトを作成しようとしています。

4

3 に答える 3

7

PHP では通常、一度に 1 つのクエリしか実行できないため、区切り記号は必要ありません。

$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 に答える