Всем привет. У меня двойной вопрос, если позволите. Есть форма с массивом данных в атрибуте name: HTML: <form class="form-inline" action="add.php" method="POST"> <div class="form-group w-25 mx-auto"> <input type="text" class="form-control" name="products[name1][name]" id="name" placeholder="Введи название продукта"> <input type="text" class="form-control" name="products[name1][count]" id="count" placeholder="Количество"> <select class="form-control" name="products[name1][volume]" id="volume"> <option value="кг.">кг.</option> <option value="л.">л.</option> <option value="шт.">шт.</option> </select> </div> <div class="form-group w-25 mx-auto"> <input type="text" class="form-control" name="products[name2][name]" id="name" placeholder="Введи название продукта"> <input type="text" class="form-control" name="products[name2][count]" id="count" placeholder="Количество"> <select class="form-control" name="products[name2][volume]" id="volume"> <option value="кг.">кг.</option> <option value="л.">л.</option> <option value="шт.">шт.</option> </select> </div> <button type="submit" name="submit" class="btn btn-primary">Отправить</button> </form> Не могу понять две вещи. 1. в файле add.php нужно написать вот так, чтобы данные принимались из формы: PHP: if($_SERVER['REQUEST_METHOD'] == 'POST'){ $array = $_POST["products"];} ? На многих ресурсах пишут именно так или ответы очень расплывчатые, не полные... 2. Мне нужно добавлять в таблицу SQL данные построчно (например, HTML: <input type="text" class="form-control" name="products[name1][name]" id="name" placeholder="Введи название продукта"> <input type="text" class="form-control" name="products[name1][count]" id="count" placeholder="Количество"> <select class="form-control" name="products[name1][volume]" id="volume"> <option value="кг.">кг.</option> <option value="л.">л.</option> <option value="шт.">шт.</option> </select> первая строка HTML: <input type="text" class="form-control" name="products[name2][name]" id="name" placeholder="Введи название продукта"> <input type="text" class="form-control" name="products[name2][count]" id="count" placeholder="Количество"> <select class="form-control" name="products[name2][volume]" id="volume"> <option value="кг.">кг.</option> <option value="л.">л.</option> <option value="шт.">шт.</option> </select> вторая строка для этого нужно использовать конструкцию foreach, но я не могу понять, что писать внутри конструкции... PHP: foreach ($array as $key => $value) { //Мой код } Полный код php: PHP: <?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ $array = $_POST["products"]; $mysqli = new mysqli("localhost", "alexturt_list", "lostpassword", "alexturt_listShopping"); $mysqli->set_charset("utf8"); if (!$mysqli) { echo 'Не могу соединиться с БД. Код ошибки: ' . mysqli_connect_errno() . ', ошибка: ' . mysqli_connect_error(); exit; } foreach ($array as $key => $value) { } $result = $mysqli->query("INSERT INTO `listProducts` (name,count,volume) VALUES ('$value')"); if($result == true){ echo "true"; }else { echo (mysqli_error($result)); }; } ?> Я пробовал просто вывести данные PHP: printf($array) , но ничего не выводилось. Ребята, только не бейте сильно тапками...помогите, пожалуйста, разобраться с этими вопросами
Единовременное многострочное сохранение из формы – это идиотизм. Лучше переделайте логику. P.S. Можете AJAX'ом сохранять в отдельности хоть каждое поле каждой записи.
@Valick, я не про это, а про доставку, возникающие при этом ограничения сервера, сомнительную необходимость в таком способе отправки. А обновление – это вообще отдельная песня. Сто раз приходилось наблюдать, как из-за пары полей пары записей записи в БД переписываются десятками впустую. Это дает нехилую нагрузку на сервер БД. --- Добавлено --- @Turte_post, при использовании ООП-синтаксиса MySQLi ошибка подключения обрабатывается по-другому. --- Добавлено --- И какого фига set_charset размещается до проверки? У него должна быть своя проверка. --- Добавлено --- Если по существу, у вас значением $value внутри цикла является одномерный массив --- Добавлено --- Уник. ключи двумерного массива в значениях атрибута name по идее указывать не надо. Пых умеет «накапливать» такие значения. Т.е. попробуйте вот так: name="products[][name]".
я Вас всех любить буду, если покидаете примеров на моем примере...на словах понятно всё, а как это в коде должно выглядить, не понятно --- Добавлено --- А как правильно сделать проверку? Можно пример? Проверка на set-charset необязательное в текущем случае... А вот как правильно? Я за этим и пришёл сюда
PHP: <?php if( isset($_POST['products']) ) { $products = $_POST["products"]; if( is_array($products) && count($products) !== 0) { $mysqli = new mysqli("localhost", "alexturt_list", "lostpassword", "alexturt_listShopping"); if ( $mysqli->connect_errno ) { printf("Не удалось подключиться: %s\n", $mysqli->connect_error); exit(); } $mysqli->set_charset("utf8"); $sql = "INSERT INTO `listProducts` SET `name`=?,`count`=?, `volume`=?"; $res = $mysqli->prepare($sql); if( ! $res ) { die( "SQL Error: {$mysqli->errno} - {$mysqli->error}" ); } foreach( $products as $item ) { $res->bind_param( "sds", $item['name'],$item['count'], $item['volume'] ); $res->execute(); } $mysqli->close(); } } ?>
@Artur_hopf О, Великий, спасибо тебе Обещал любить, люблю! В общем картина мне ясна, как раз не хватало этого кода Пойду разбирать код на мелкие детали, чтобы в дальнейшем уже самостоятельно писать такие конструкции. Ну и поменьше беспокоить великих Есть несколько параметров, которые мне показались будут неуместны в моем коде, буду изучать их...
Я говорю, что есть, чтобы вы не лепили просто $value в запрос. Хотя бы implode прикрути. Правильно не так Если уж взялись так желать, хотя бы проверяйте наличие всех элементов у каждого влож. массива --- Добавлено --- @Artur_hopf, не ccы См. выше. Чем докажешь, что все $item['name'],$item['count'], $item['volume'] существуют?
я желаю, чтобы код работал, но из-за слабых знаний в php обратился к знающим людям, чтобы наконец-то разобраться... А как?