3

PDO を使用して SP (ストアド プロシージャ) を呼び出そうとしています。

try {
    // Connecting using the PDO object.
    $conn = new PDO("mysql:host=$host; dbname=$dbname", $user, $password);        

    $stmt = $conn->prepare('CALL sp_user(?,?,@user_id,@product_id)');    
    $stmt->execute(array("demouser", "demoproduct"));
    $result = $stmt->fetchAll();
    print_r($result);
}
// Catching it if something went wrong.
catch(PDOException $e) {
  echo "Error : ".$e->getMessage();
}

SP が正常に実行され、関連するテーブルにデータが挿入され、新しく挿入された ID が返されるとします。しかし、結果を印刷すると、空の配列が得られます。

なにか提案を?

以下は私が使用しているSPです。

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_user`$$
CREATE PROCEDURE `sp_user`(
    IN user_name VARCHAR(255),
    IN product_name VARCHAR(255),
    OUT user_id INT(11),
    OUT product_id INT(11)
)
BEGIN       
    START TRANSACTION;      
        INSERT INTO `user` (`name`) VALUES(user_name);
        SET user_id := LAST_INSERT_ID();        
        INSERT INTO `product` (`name`) VALUES(product_name);        
        SET product_id := LAST_INSERT_ID();         
        INSERT INTO `map_user_product` (`user_id`,`product_id`) VALUES(user_id,product_id); 
    commit;
END$$
DELIMITER ;

編集:気にしないでください。

$result 変数を使用することで、OUT 変数の値を取得できると思いました。しかし後で、別の SQL クエリを使用してそれらの out 変数を取得する必要があることがわかりました。

$stmt = $conn->query("SELECT @user_id,@product_id");
4

3 に答える 3

0

これを使用して、最後に挿入された ID を取得できます。PDO::lastInsertId();

あなたは現在 から配列を返していると思いますがfetchAll、これには id が含まれていないと思います: http://php.net/manual/en/pdostatement.fetchall.php

于 2013-01-08T08:13:36.677 に答える
0

これを試して

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_user`$$
CREATE PROCEDURE `sp_user`(
    IN user_name VARCHAR(255),
    IN product_name VARCHAR(255)
)
BEGIN       
    START TRANSACTION;      
        INSERT INTO `user` (`name`) VALUES(user_name);
        SET user_id := LAST_INSERT_ID();        
        INSERT INTO `product` (`name`) VALUES(product_name);        
        SET product_id := LAST_INSERT_ID();         
        INSERT INTO `map_user_product` (`user_id`,`product_id`) VALUES(user_id,product_id); 
    commit;

    SELECT user_id, product_id;

END$$
DELIMITER ;

PHPで

$result = $conn->query("CALL sp_user(demouser, demoproduct)")->fetchAll();
var_dump($result);
于 2014-10-27T11:28:04.120 に答える