За последние 24 часа нас посетили 21614 программистов и 1028 роботов. Сейчас ищут 736 программистов ...

Передача массива из формы + foreach

Тема в разделе "PHP для новичков", создана пользователем Turte_post, 7 авг 2019.

Метки:
  1. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    Всем привет.

    У меня двойной вопрос, если позволите.

    Есть форма с массивом данных в атрибуте name:
    HTML:
    1. <form class="form-inline" action="add.php" method="POST">
    2.         <div class="form-group w-25 mx-auto">
    3.           <input type="text" class="form-control" name="products[name1][name]" id="name" placeholder="Введи название продукта">
    4.           <input type="text" class="form-control" name="products[name1][count]" id="count" placeholder="Количество">
    5.           <select class="form-control" name="products[name1][volume]" id="volume">
    6.             <option value="кг.">кг.</option>
    7.             <option value="л.">л.</option>
    8.             <option value="шт.">шт.</option>
    9.           </select>
    10.         </div>
    11.         <div class="form-group w-25 mx-auto">
    12.           <input type="text" class="form-control" name="products[name2][name]" id="name" placeholder="Введи название продукта">
    13.           <input type="text" class="form-control" name="products[name2][count]" id="count" placeholder="Количество">
    14.           <select class="form-control" name="products[name2][volume]" id="volume">
    15.             <option value="кг.">кг.</option>
    16.             <option value="л.">л.</option>
    17.             <option value="шт.">шт.</option>
    18.           </select>
    19.         </div>
    20.         <button type="submit" name="submit" class="btn btn-primary">Отправить</button>
    21.       </form>
    Не могу понять две вещи.
    1. в файле add.php нужно написать вот так, чтобы данные принимались из формы:
    PHP:
    1. if($_SERVER['REQUEST_METHOD'] == 'POST'){
    2.       $array = $_POST["products"];}
    ? На многих ресурсах пишут именно так или ответы очень расплывчатые, не полные...
    2. Мне нужно добавлять в таблицу SQL данные построчно (например,
    HTML:
    1. <input type="text" class="form-control" name="products[name1][name]" id="name" placeholder="Введи название продукта">
    2. <input type="text" class="form-control" name="products[name1][count]" id="count" placeholder="Количество">
    3. <select class="form-control" name="products[name1][volume]" id="volume">
    4.   <option value="кг.">кг.</option>
    5.   <option value="л.">л.</option>
    6.   <option value="шт.">шт.</option>
    7.  </select>
    первая строка

    HTML:
    1. <input type="text" class="form-control" name="products[name2][name]" id="name" placeholder="Введи название продукта">
    2. <input type="text" class="form-control" name="products[name2][count]" id="count" placeholder="Количество">
    3. <select class="form-control" name="products[name2][volume]" id="volume">
    4.   <option value="кг.">кг.</option>
    5.   <option value="л.">л.</option>
    6.   <option value="шт.">шт.</option>
    вторая строка
    для этого нужно использовать конструкцию foreach, но я не могу понять, что писать внутри конструкции...
    PHP:
    1. foreach ($array as $key => $value) {
    2.    //Мой код
    3. }

    Полный код php:
    PHP:
    1. <?php
    2.     if($_SERVER['REQUEST_METHOD'] == 'POST'){
    3.       $array = $_POST["products"];
    4.  
    5.       $mysqli = new mysqli("localhost", "alexturt_list", "lostpassword", "alexturt_listShopping");
    6.       $mysqli->set_charset("utf8");
    7.       if (!$mysqli) {
    8.         echo 'Не могу соединиться с БД. Код ошибки: ' . mysqli_connect_errno() . ', ошибка: ' . mysqli_connect_error();
    9.         exit;
    10.       }
    11.  
    12.       foreach ($array as $key => $value) {
    13.        
    14.       }
    15.      
    16.       $result = $mysqli->query("INSERT INTO `listProducts` (name,count,volume) VALUES ('$value')");
    17.  
    18.       if($result == true){
    19.         echo "true";
    20.       }else {
    21.         echo (mysqli_error($result));
    22.       };
    23.     }
    24. ?>
    Я пробовал просто вывести данные
    PHP:
    1. printf($array)
    , но ничего не выводилось.

    Ребята, только не бейте сильно тапками...помогите, пожалуйста, разобраться с этими вопросами :(
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Единовременное многострочное сохранение из формы – это идиотизм. Лучше переделайте логику.

    P.S. Можете AJAX'ом сохранять в отдельности хоть каждое поле каждой записи.
     
  3. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    чёйта? собираешь многострочный инсерт и выполняешь один единственный запрос
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @Valick, я не про это, а про доставку, возникающие при этом ограничения сервера, сомнительную необходимость в таком способе отправки. А обновление – это вообще отдельная песня. Сто раз приходилось наблюдать, как из-за пары полей пары записей записи в БД переписываются десятками впустую. Это дает нехилую нагрузку на сервер БД.
    --- Добавлено ---
    @Turte_post, при использовании ООП-синтаксиса MySQLi ошибка подключения обрабатывается по-другому.
    --- Добавлено ---
    И какого фига set_charset размещается до проверки? :) У него должна быть своя проверка.
    --- Добавлено ---
    Если по существу, у вас значением $value внутри цикла является одномерный массив ;)
    --- Добавлено ---
    Уник. ключи двумерного массива в значениях атрибута name по идее указывать не надо. Пых умеет «накапливать» такие значения. Т.е. попробуйте вот так: name="products[][name]".
     
  5. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    я Вас всех любить буду, если покидаете примеров на моем примере...на словах понятно всё, а как это в коде должно выглядить, не понятно :(
    --- Добавлено ---
    А как правильно сделать проверку? Можно пример?
    Проверка на set-charset необязательное в текущем случае...
    А вот как правильно? Я за этим и пришёл сюда :(
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    PHP:
    1. <?php
    2. if( isset($_POST['products']) )
    3. {
    4.     $products = $_POST["products"];
    5.  
    6.     if( is_array($products) && count($products) !== 0)
    7.     {
    8.         $mysqli = new mysqli("localhost", "alexturt_list", "lostpassword", "alexturt_listShopping");
    9.  
    10.         if ( $mysqli->connect_errno )
    11.         {
    12.             printf("Не удалось подключиться: %s\n", $mysqli->connect_error);
    13.             exit();
    14.         }
    15.  
    16.         $mysqli->set_charset("utf8");
    17.         $sql = "INSERT INTO `listProducts` SET `name`=?,`count`=?, `volume`=?";
    18.         $res = $mysqli->prepare($sql);
    19.  
    20.         if( ! $res )
    21.         {
    22.             die( "SQL Error: {$mysqli->errno} - {$mysqli->error}" );
    23.         }
    24.  
    25.         foreach( $products as $item )
    26.         {
    27.             $res->bind_param( "sds", $item['name'],$item['count'], $item['volume'] );
    28.             $res->execute();
    29.         }
    30.  
    31.         $mysqli->close();
    32.     }
    33. }
    34. ?>
     
  7. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    @Artur_hopf О, Великий, спасибо тебе ;) Обещал любить, люблю!
    В общем картина мне ясна, как раз не хватало этого кода :) Пойду разбирать код на мелкие детали, чтобы в дальнейшем уже самостоятельно писать такие конструкции. Ну и поменьше беспокоить великих :)
    Есть несколько параметров, которые мне показались будут неуместны в моем коде, буду изучать их...
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Turte_post ты погоди, щас великие придут и обосрут мой код, :D но это не точно.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Я говорю, что есть, чтобы вы не лепили просто $value в запрос. Хотя бы implode прикрути.

    Правильно не так :) Если уж взялись так желать, хотя бы проверяйте наличие всех элементов у каждого влож. массива ;)
    --- Добавлено ---
    @Artur_hopf, не ccы :) См. выше. Чем докажешь, что все $item['name'],$item['count'], $item['volume'] существуют?
     
  10. Turte_post

    Turte_post Новичок

    С нами с:
    12 фев 2019
    Сообщения:
    14
    Симпатии:
    0
    я желаю, чтобы код работал, но из-за слабых знаний в php обратился к знающим людям, чтобы наконец-то разобраться...
    А как?