42247


お世話になります。何卒よろしくお願い致します。

以下のサイトを参考にphpからMySQLに設定した(ルーチンタブ内に作成した)ストアドプロシージャを起動させようとしておりますが、エラーが出ないものの、起動もできません。

[MySQLのストアドプロシージャを呼び出す](https://phpjpn.com/?MySQL%E3%81%AE%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99)

以下はphpの記述と、MySQLの設定です。どこに問題があるかご指摘、ご教示等頂けませんでしょうか。

*php側では、db接続に関する記述（$connect_db、$connect_user、$connect_passwd）を異なるものにするとエラーが出ます。また、$stmt = $dbh->prepareをprepaなどと変更するとエラーになりますが、CALL get_image(:code)自体をCALL get_ima(:code)と変更してもエラーが出ないことを考えると、データベースに接続し、$stmtを実行しようとしているのは確かだけれど、ストアドプロシージャの呼び出し、'CALL get_image(:code)'をしていない、あるいは、ができていないと考えられます。

*MySQLのストアドプロシージャのwhere句のcodeにテーブルtbl_productsに存在するproduct_id、例えば12を設定し、mySql上で”実行する”を押すと期待通りの結果になります。即ち設定したストアドプロシージャの内容、テーブル上でt1.main_image に t1.main_image_xを挿入致します。

データベース：MySQL5.0.77  
PHP：5.0.22  
WEBサーバ：apache2

**phpの設定**

[code]

    try {
      $connect_db = "mysql:dbname=xxxxxxx;host=localhost";
      $connect_user = 'xxxxxxx';
      $connect_passwd = 'xxxxxxx';
    
      //データベース接続
      $dbh = new PDO(
            $connect_db,
            $connect_user,
            $connect_passwd,
            array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
      );
    
      $stmt = $dbh->prepare('CALL get_image(:code)');
      $code = '12';//　最終的にはシステム的に変数を代入する設定にする
      $stmt->bindParam(':code', $code);
      // ストアドプロシージャをコールします
      $stmt->execute();
    
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
     echo $row['t1.main_image'];
      }
    } catch(PDOException $e){
       var_dump($e->getMessage());
    }
    }
    // 切断
    $dbh = null;
    
[/code]

**MySQL ストアドプロシージャの設定**

[code]

    DELIMITER $$
    CREATE DEFINER=`xxxxxxx`@`%` PROCEDURE `get_image(IN code varchar(2))`()
        NO SQL
    BEGIN
    
    UPDATE tbl_products t1 SET t1.main_image = t1.main_image_x WHERE t1.product_id = code;
    
    End$$
    DELIMITER ;
    
[/code]


CC BY-SA 3.0
2018-03-08T00:55:39.317
42206
2018-03-09T02:43:45.927
2018-03-08T01:22:16.307
27650
27650
question
php mysql pdo
phpからMySQLの（ルーチンタブ）ストアドプロシージャを呼び出すことができない件に関して。


CALL get_image('12'); でエラーになるという時点で、そもそも期待通りにストアドプロシジャが作成できていないということです。

「get_image」がストアドプロシジャ名であり続きの括弧の中「(IN code
varchar(2))」は引数の宣言ですよね？であれば以下のようになるのではないでしょうか？

[code]

    DELIMITER $$
    CREATE DEFINER=`xxxxxxx`@`%` PROCEDURE `get_image`(IN code varchar(2))
        NO SQL
    BEGIN
    
    UPDATE tbl_products t1 SET t1.main_image = t1.main_image_x WHERE t1.product_id = code;
    
    End$$
    DELIMITER ;
    
[/code]

質問にお書きになられたソースコードでは「get_image(IN code
varchar(2))」という名前で、引数がないストアドプロシジャを定義している状態です。

ご確認ください。


CC BY-SA 3.0
2018-03-09T02:43:45.927
42247
2018-03-09T02:43:45.927
27410
42206
answer