Доступ к возвращенному значению из хранимой процедуры MySQL в PHP - PullRequest
0 голосов
/ 10 октября 2019

У меня есть эта хранимая процедура, которая имеет 2 параметра, первый - cartId (который является IN), и у меня есть newOrderId (который является OUT). Теперь я знаю, что inCartId - это идентификатор корзины, который будет получен из формы, или что-то еще, что означает, что к корзине обращались, но я не понимаю OUT newOrderId, поскольку именно это и будет возвращать MySQL. Теперь в PHP, вызывающем эту хранимую процедуру, она будет выглядеть следующим образом.

$sql = 'CALL create_order(:cart_id, "What will be here")// The cart_id is what PHP will pass to MySQL, but what will be passed
    to the 2nd argument since PHP does not know before hand what MySQL will return.
CREATE PROCEDURE create_order(
    IN inCartId int,
    OUT newOrderId int
)
BEGIN

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

    -- Insert order details in order_detail table
    INSERT INTO order_detail (
        order_id, product_id, attributes, product_name, quantity, unit_cost
    )
    SELECT
        orderId,
        p.id,
        sc.attributes,
        p.name,
        sc.quantity,
        COALESCE( NULLIF( p.discounted_price, 0 ), p.price ) AS unit_cost
    FROM
        shopping_cart sc
        INNER JOIN products p ON sc.product_id = p.id
    WHERE
        sc.cart_id = inCartId
        AND
        sc.buy_now;

    -- Save the order's total amount
    UPDATE
        orders
    SET
        total_amount = (
            SELECT
                SUM( unit_cost * quantity )
            FROM
                order_detail
            WHERE
                order_id = orderId
        )
    WHERE
        id = orderId;

    -- Clear the shopping cart
    CALL shopping_cart_empty(inCartId);

END```

1 Ответ

0 голосов
/ 12 октября 2019

были в состоянии решить это. И вот как я это сделал.

CREATE PROCEDURE `shopping_cart_create_order2`(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;

    -- Insert order details in order_detail table
    INSERT INTO order_detail (
        order_id, product_id, attributes, product_name, quantity, unit_cost
    )
    SELECT
        newOrder,
        p.id,
        sc.attributes,
        p.name,
        sc.quantity,
        COALESCE( NULLIF( p.discounted_price, 0 ), p.price ) AS unit_cost
    FROM
        shopping_cart sc
        INNER JOIN products p ON sc.product_id = p.id
    WHERE
        sc.cart_id = inCartId
        AND
        sc.buy_now;

    -- Save the order's total amount
    UPDATE
     orders
    SET
        total_amount = (
            SELECT
                SUM( unit_cost * quantity )
            FROM
                order_detail
            WHERE
                order_id = newOrder
        )
    WHERE
        id = newOrder;

    -- Clear the shopping cart
    CALL shopping_cart_empty(inCartId);
    SET newOrder = newOrderId;
END

На уровне PHP // Вероятно, на уровне модели / сущности Сначала нам нужно выполнить

shopping_cart_create_order2 ()

хранимая процедура. Что, вероятно, может быть в функции.

Во-вторых, чтобы получить последний идентификатор заказа, нам нужно запросить его из переменной

@ 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_order2(: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;    
}

Для получения дополнительной информации см. введите описание ссылки здесь

Я надеюсь, что смогу помочь кому-то, кто, возможно, попадет в то, через что я прошел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...