Перенаправление успешно после завершения цикла - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть сеанс корзины покупок, который полностью вставляется в базу данных через цикл, после того как я перенаправляю в сеанс, он вставляет только один продукт из нескольких продуктов в сеансе.

for($i = 0; $i < count($_SESSION['shopping_cart']); $i++){  
    $title          = $_POST['title'][$i];
    $quantity       = $_POST['quantity'][$i];
    $total          = $_POST['total'][$i];

$sql  = "INSERT INTO orders (title, quantity, total, paid, created_at, updated_at)";    
    $sql .= " VALUES ( '";
    $sql .= $title . "', '";
    $sql .= $quantity . "', '";
    $sql .= $total . "', '";
    $sql .= 0 . "', '";
    $sql .= $timestamp . "', '";
    $sql .= $timestamp . "')";
    $result = $database->query($sql);
    if($result){
        //success
        echo 'yes';
        //redirect_to('order_summary.php');
    }else{
        echo 'no';
        //failure

    }
        }

Это таблица ниже, я не совсем понимаю, почему всякий раз, когда я делаю перенаправление страницы, цикл for не полностью вставляется в базу данных, но каждый раз, когда я удаляю перенаправление, он полностью зацикливается со всеми деталями в базе данных..

<table class="table table-striped">
            <tr>
                <th colspan="7"><h3 class="text-center">Order details</h3></th>
            </tr>
            <tr  class="bg bg-success">
                <th>Title</th>
                <th>Slug</th>
                <th>Description</th>
                <th>Price</th>
                <th>Quantity</th>
                <th>Total</th>
                <th>Actions</th>
            </tr>
            <?php 
            if(!empty($_SESSION['shopping_cart']));
            $total = 0;

            foreach($_SESSION['shopping_cart'] as $key => $product):
            ?>
            <form method="post" action="cart5.php" class="form-horizontal">
            <tr>
                <td class="text-info"><input type="text" readonly  class="form-control" name="title[]" value="<?php echo $product['title']; ?>"/></td>
                <td><input type="text" readonly class="form-control" name="price[]" value="N<?php echo $product['price']; ?>"/></td>
                <td class="text-center text-info"><input type="text" readonly class="form-control" name="quantity[]" value="<?php echo $product['quantity']; ?>"/></td>
                <td><input type="text" readonly class="form-control" name="total[]" value="N<?php echo number_format($product['quantity'] * $product['price'], 2); ?>"/></td>
            </tr>
            <?php
            $total = $total + ($product['quantity'] * $product['price']);
            endforeach;
            ?>
            <tr>
            <td  class="bg bg-success" colspan="7" align="center"><b>SubTotal = N</b><input type="text" readonly multiple class="form-control" name="subTotal[]" value="<?php echo  number_format($total, 2); ?>"/></td>
            </tr>
            <tr>
                <td colspan="7">
                    <?php 
                    if (isset($_SESSION['shopping_cart'])):
                    if (count($_SESSION['shopping_cart']) > 0):
                    ?>
                    <input type="submit" name="submit" class="btn btn-success text-right" value="Checkout" />
                    <?php endif; endif; ?>
                </td>
            </tr>
        </table>

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Ваша логика говорит перенаправлять после любой успешной вставки.Следовательно, сначала выполните цикл, который работает и перенаправляет.

Кроме того, вы не можете отправить header() s после запуска какого-либо вывода на клиент - echo 'yes' может вызвать проблемы.Я бы изменил его, чтобы установить / отследить логическое значение, и после завершения цикла сделать что-нибудь.

for($i = 0; $i < count($_SESSION['shopping_cart']); $i++){  
    $title          = $_POST['title'][$i];
    $quantity       = $_POST['quantity'][$i];
    $total          = $_POST['total'][$i];

    $success=true; // assume it works
    $sql  = "INSERT INTO orders (title, quantity, total, paid, created_at, updated_at)";    
    $sql .= " VALUES ( '";
    $sql .= $title . "', '";
    $sql .= $quantity . "', '";
    $sql .= $total . "', '";
    $sql .= 0 . "', '";
    $sql .= $timestamp . "', '";
    $sql .= $timestamp . "')";
    $result = $database->query($sql);
    if(!$result){
        //  failure do something like trapping the sql error, 
        //  or recording a message in an array
        $success=false;
    }
}
if($success){
     // it all worked!
     // do your redirect here
}else{
    // something failed
    // do your error output, warning to user, whatever here
}
0 голосов
/ 17 ноября 2018

Проблема в том, что вы перенаправляете в цикле после первого успеха ...

for($i = 0; $i < count($_SESSION['shopping_cart']); $i++){  

    // ....
    if($result){
        //success
        echo 'yes';
        //redirect_to('order_summary.php');
    }else{
        echo 'no';
        //failure

    }
}

Что вам нужно сделать, это перенаправить только в случае сбоя или после завершения цикла ...

for($i = 0; $i < count($_SESSION['shopping_cart']); $i++){  

    // ....
    if(!$result){
        echo 'no';
        //failure
        redirect_to('failed.php');

    }
}
redirect_to('order_summary.php');

Или используйте флаг, который отмечает, что делать после цикла ...

$success = true;
for($i = 0; $i < count($_SESSION['shopping_cart']); $i++){  

    // ....
    if(!$result){
        echo 'no';
        //failure
        $success = false;

    }
}
if ( $success ) {
    redirect_to('order_summary.php');
}
else {
    redirect_to('failed.php');
}

Это основано на предположении, что redirect_to() выводит заголовок и автоматически вызывает exit который остановит сценарий.

У всех них есть возможность, что они оставят половину вставленного ордера, в зависимости от того, насколько важно это продиктовать, если вы хотите заключить все это в транзакцию или нет.

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