【问题标题】:Calling stored procedures with an OUT parameter in PHP [duplicate]在 PHP 中使用 OUT 参数调用存储过程 [重复]
【发布时间】:2019-10-12 15:19:48
【问题描述】:

使用 IN 参数调用存储过程很简单

CREATE PROCEDURE `catalog_delete_product`(IN `inProductId` INT) BEGIN DELETE FROM product_attribute WHERE product_id = inProductId; DELETE FROM product_category WHERE product_id = inProductId; DELETE FROM shopping_cart WHERE product_id = inProductId; DELETE FROM product WHERE product_id = inProductId; END

你可以看到它就是这么简单。但是我们如何在 MySQL Stored 参数中调用 OUT 参数并在 PHP 中使用它呢?

【问题讨论】:

  • @Nigel Ren 好吧,我搜索了又搜索,但在这里或任何地方都找不到答案,直到我偶然遇到了 mysqltutorial。但是如果社区认为它是重复的,那么我可以删除它
  • 是否要删除它取决于您,因为有些人可能会觉得它有用。
  • 不使用 OUT 参数,只需在过程结束时选择变量,您就可以像使用任何其他结果集一样在 PHP 中使用结果集。这可以节省您执行另一个查询的时间。当您从另一个过程调用一个过程时,OUT 参数很有用,而不是在将信息传递回应用程序时。
  • @slaakso 这就是我之前所做的。它在本地主机上工作,但在实时服务器上不工作
  • 本地或远程(实时)服务器之间没有区别。如果您可以连接到服务器,它们应该与 PHP 一样工作。如果您对一台服务器有问题,您可以提出问题。

标签: php mysql stored-procedures


【解决方案1】:

作为一个例子来说明它,我将一个现实世界的实际例子(将数据插入订单表并返回lastInsertId)。

CREATE PROCEDURE `shopping_cart_create_order`(IN `inCartId` INT(11), OUT `newOrderId` INT(11)) BEGIN
    DECLARE newOrder int;
    -- Insert a new record into orders and obtain the new order ID
    INSERT INTO orders (created_on) VALUES (NOW());

    -- Obtain the new Order ID
    SELECT LAST_INSERT_ID() INTO newOrder;

    SET newOrder = newOrderId;
END

在PHP级别//可能在模型/实体级别首先,我们需要执行

shopping_cart_create_order()

存储过程。这可能在一个函数中。

其次,要获取最后的订单id,需要从变量中查询

@oid

。重要的是我们必须调用方法

closeCursor()

PDOStatement 对象,以便执行下一条 SQL 语句。

function query($pdo, $sql, $parameters = []){
    $query = $pdo->prepare($sql);
    $query->execute($parameters);
    return $query;
}

function create_order($pdo, $cart_id){
    // Binding the parameters
    $parameters = [':cart_id' => $cart_id];

    // calling stored procedure command
    $sql = 'CALL shopping_cart_create_order(:cart_id)';

    // prepare for execution of the stored procedure, pass value to the command 
    and execute the Stored Procedure
    $query = query($pdo, $sql, $parameters);

   // Then close Cursor. It is important for you to close it.
    $query->closeCursor();

   // execute the second query to get last insert id
    $row = $pdo->query("SELECT @oid AS oid")->fetch();
    return $row;    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2019-09-18
    • 2020-01-09
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多