Недействительный аргумент для foreach () при переходе по URL-адресу - PullRequest
0 голосов
/ 21 июня 2020

У меня сейчас две страницы, называемые index.php и checkout.php.

В индексе. php страница, у меня 2 флажка и 4 переключателя.

Что Я делаю это: когда пользователь установил флажок и переключатели и щелкнул кнопку отправки, я отправляю значение флажков и переключателей на страницу checkout.php, и эти значения будут вызывать мой запрос для отображения вывода на моем страница оформления заказа.

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

Теперь моя проблема в том, что если я обновляю sh страницу, то проблем нет, но когда Я нажимаю URL-адрес, после чего появляется сообщение об ошибке

Предупреждение: неверный аргумент для foreach () в /home4/test/example/checkout.php в строке 70

индекс. php

<form action="checkout.php" method="post" name="form1">
    <div class="formWrapper">
        <div class="form-group">
            <fieldset>
            <input type="checkbox"  name="fruit[1]"  value="1"><label>Fruit One</label><br />
            <input type="radio"  name="color[1]"  value="1"><label>Black</label>
            <input type="radio"  name="color[1]"  value="2"><label>Yellow</label>
            </fieldset>
        </div>
        <div class="form-group">
            <fieldset>
            <input type="checkbox"  name="fruit[2]"  value="2"><label>Fruit Two</label><br />
            <input type="radio"  name="color[2]"  value="1"><label>Black</label>
            <input type="radio"  name="color[2]"  value="2"><label>Yellow</label>
            </fieldset>
        </div>
        <input type="submit" name="submit" value="Next">
    </div>
</form>

оформление заказа. php

<?php
session_start();
 include('connection.php');
 if(isset($_POST['submit'])){
 $_SESSION['fruits']=$_POST['fruit'];
 $_SESSION['colors']=$_POST['color'];
  
  foreach ($_SESSION['fruits'] as $key => $value) {
  try{
     $sqlquery="SELECT col1,col2, (select demoCol from tbl_colors where c_id=:c_id) as demoColor FROM tbl_mytable WHERE id=:id and is_active=1";
    $stmt = $pdo->prepare($sqlquery);
     $stmt->execute( array(':c_id' => $_SESSION['colors'][$key],':id'=>$_SESSION['fruits'][$key]) );
    $result = $stmt->fetchAll();
     foreach ($result as $row) {?>
        <h3><?php echo $row['col1'];?> <?php echo $row['col2'];?></h3>
        <p><?php echo $row['demoColor'];?></p>
<?php
     }
 }
 catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
  }
}
 }
 ?>

1 Ответ

0 голосов
/ 21 июня 2020

Быстро просматривая ваш код, я думаю, вы могли бы его немного изменить

<?php

    session_start();
    /*
        `fruit` and `color` MUST be available
        before attempting to assign as any 
        sort of variable - so test here!
    */
    if( isset( 
            $_POST['submit'],
            $_POST['fruit'],
            $_POST['color']
        )){
        
        
        include('connection.php');
        /*
            It is not entirely clear why you would want to assign
            session values directly from POST values when you could
            simply work with the POST values instead.
        */
        $fruits=$_POST['fruit'];
        $colours=$_POST['color'];
        
        /*
            create the sql statement with placeholders
            which are then bound as parameters when the
            statement is executed.
            
            Create the statement once and assign new values
            inside of any loops rather than re-stating it
            on each iteration.
        */
        $sql='select `col1`, `col2`, ( select `democol` from `tbl_colors` where `c_id`=:cid ) as `democolor`
                from `tbl_mytable`
                where `id`=:id and `is_active`=1';
        
        $stmt=$pdo->prepare( $sql );

        
        
        /*
            Process the POSTed variables
            using the $key to access the values
            within the other array ( colours )
        */
        foreach( $fruits as $key => $value ) {
            try{
                if( isset( $colours[ $key ] ) ){
                    $stmt->execute( array(
                        ':cid'  =>  $value,
                        ':id'   =>  $colours[ $key ]
                    ));
                    $result = $stmt->fetchAll();
                    foreach( $result as $row ) {
?>
                    <h3>
                        <?php echo $row['col1'];?>
                        <?php echo $row['col2'];?>
                    </h3>
                    <p><?php echo $row['demoColor'];?></p>
<?php
                    }
                }
            } catch( PDOException $e ) {
                echo "Error: " . $e->getMessage();
            }
        }
    }
?>

При более внимательном рассмотрении можно предположить, что у вас, вероятно, может быть только один SQL запрос для извлечения всех записей путем первоначальной обработки POST data и создание подходящих строк, содержащих различные идентификаторы, чтобы вы использовали оператор IN в sql - например, where id IN (1,2,3) et c - например:

$sql='select `col1`, `col2`, ( select `democol` from `tbl_colors` where `c_id` IN ( :cids ) ) as `democolor`
        from `tbl_mytable`
        where `id` IN ( :ids ) and `is_active`=1';
$stmt=$pdo->prepare( $sql );

$args=array(
    ':cids' =>  implode(',',array_values( $colours ) ),
    ':ids'  =>  implode(',',array_values( $fruits ) )
);

$stmt->execute( $args );

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

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