【问题标题】:PHP PDO: Stored Procedure Return Empty ResultPHP PDO:存储过程返回空结果
【发布时间】:2012-12-22 01:12:23
【问题描述】:

我正在尝试使用 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 查询来获取这些变量。

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

【问题讨论】:

    标签: php mysql stored-procedures pdo


    【解决方案1】:

    试试这个……

    try 
    {
        // Connecting using the PDO object.
        $conn = new PDO("mysql:host=$host; dbname=$dbname", $user, $password);        
    
        $stmt = $conn->prepare('CALL sp_user(:demouser, :demoproduct, @user_id, @product_id)'); 
    
        $demouser = "demouser";
        $demoproduct = "demoproduct";
    
        $stmt->bindParam(":demouser", $demouser, PDO::PARAM_STR, 255);
        $stmt->bindParam(":demoproduct", $demoproduct, PDO::PARAM_STR, 255);
        $stmt->execute();
    
        $result = $conn->query("select @user_id, @product_id;")->fetchAll();
    
        print_r($result);
    
        foreach($result as $row)
        {
            echo $row["@user_id"];
            echo $row["@product_id"];
        }
    
    }
    // Catching it if something went wrong.
    catch(PDOException $e) 
    {
      echo "Error : ".$e->getMessage();
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用以下方法获取最后插入的 id:PDO::lastInsertId();

      我认为您目前正在从 fetchAll 返回数组,我认为其中不包含 id:http://php.net/manual/en/pdostatement.fetchall.php

      【讨论】:

      • 我通过 SP 返回两个 id(user_id 和 product_id)。我不认为你的解决方案在这种情况下会起作用还是会起作用?换句话说,我想使用 PDO 获取 OUT 变量......我该怎么做?
      • 我看不到您的 SP 实际返回这些 ID 的位置
      • 查看 SET user_id := LAST_INSERT_ID();和 SET product_id := LAST_INSERT_ID();并且这些变量是 OUT 变量。
      • 明白了。当您在 mysql 客户端或终端中调用此查询时,您会返回两个 ID 吗?
      • 看看这个看看是否有帮助:stackoverflow.com/questions/6422030/…
      【解决方案3】:

      试试这个

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

      【讨论】:

        猜你喜欢
        • 2018-06-05
        • 2015-06-03
        • 2010-11-02
        • 1970-01-01
        • 2021-03-22
        • 2013-06-21
        • 1970-01-01
        • 2013-09-27
        相关资源
        最近更新 更多