За последние 24 часа нас посетили 20158 программистов и 1983 робота. Сейчас ищут 1312 программистов ...

Внесение в БД multiple данные.

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

Метки:
  1. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Здравствуйте еще раз, у меня появилась еще одна задача, изменить данные select multiple, искал в интернете если и находил, то не понимал, пробовал множество вариантов.

    Вот один из:
    PHP:
    1. //Если делать таким образом, то обработчик выводит данные, как нужно.
    2. if ($cat){
    3. foreach ($cat as $t){
    4.        echo $t;
    5.     }
    6. //Однако таким образом, он вносит данные только последнее выбранного значения. Почему? И как сделать, чтобы он полностью все вносил.
    7.     foreach ($cat as $t){
    8.         $stmt = $db->prepare("UPDATE `test` SET `category`=:ccWHERE `user`=:lg");
    9.         $stmt->bindParam(':cc', $t);
    10.         $stmt->bindParam(':lg', $USER);
    11.         $stmt->execute();
    12.     }
    13. }
    Вот второй вариант, аналогичная проблема:
    PHP:
    1. //Выводит все правильно.
    2. if(count($cat) > 0) {
    3.   for ($i=0; $i<count($cat); $i++) {
    4.     $array = array('name' => $cat[$i]);
    5.     $str = implode("", $array);
    6.     echo $str;
    7.     $stmt->execute();
    8.   }
    9. //Вносит только последнее выбранное значение.
    10. if(count($cat) > 0) {
    11.   for ($i=0; $i<count($cat); $i++) {
    12.     $array = array('name' => $cat[$i]);
    13.     $str = implode("", $array);
    14.     $stmt = $db->prepare("UPDATE `test` SET `category`=:ccWHERE `user`=:lg");
    15.     $stmt->bindParam(':cc', $t);
    16.     $stmt->bindParam(':lg', $USER);
    17.     $stmt->execute();
    18.   }
    19. }
     
  2. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Реализовал, пока ждал ответа. Кому нужно, вот решение.
    PHP:
    1. $selected_cat = $_POST['cat'];
    2.   foreach($selected_cat AS $key=>$values)
    3.   {
    4.     $arr .= $values.",";
    5. }
    6. $result = trim($arr, ',');
    7.  
    8. $stmt = $db->prepare("UPDATE `CFU` SET `category`=:category WHERE `user`=:login");
    9. $stmt->bindParam(':category', $result);
    10. $stmt->bindParam(':login', $login);
    11. $stmt->execute();
     
    denis01 нравится это.
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    А что ты вообще пытаешься сделать? Если связь многие-ко-многим, то это делается по-другому: https://habrahabr.ru/post/193380/
     
  4. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    фух начинаем переписывать

    корректирую вариант 1

    PHP:
    1. //Если делать таким образом, то обработчик выводит данные, как нужно.
    2. if ($cat){
    3. //вынесли за цицл и поставил пробел перед where
    4.   $stmt = $db->prepare("UPDATE `test` SET `category`=:cc WHERE `user`=:lg"); //не надо циклить препаре это только тормозит
    5.   $stmt->bindParam(':lg', $USER);  //$USER не меняется - смысл циклить ?
    6. //Однако таким образом, он вносит данные только последнее выбранного значения. Почему? И как сделать, чтобы он полностью все вносил.
    7.     foreach ($cat as $t){
    8. echo $t;
    9.    
    10.         $stmt->bindParam(':cc', $t);
    11.      
    12.         $stmt->execute();
    13.     }
    14. }
    что получится ?

    плюс этот же вариант но вот более интересный

    PHP:
    1. //Если делать таким образом, то обработчик выводит данные, как нужно.
    2. if ($cat){
    3. //вынесли за цицл и поставил пробел перед where
    4.   $stmt = $db->prepare("UPDATE `test` SET `category`=:cc WHERE `user`=:lg"); //не надо циклить препаре это только тормозит
    5.  
    6. $db->beginTransaction();
    7. $stmt->bindParam(':lg', $USER); //$USER не меняется - смысл циклить ?
    8. //Однако таким образом, он вносит данные только последнее выбранного значения. Почему? И как сделать, чтобы он полностью все вносил.
    9.     foreach ($cat as $t){
    10. echo $t;
    11.    
    12.         $stmt->bindParam(':cc', $t);
    13.        
    14.         $stmt->execute();
    15.     }
    16. $db->commit();
    17. }
    я добавил транзакцию - в случае сбоя обновления одного из параметров - не отработается не один иногда - но не во всех задачах это бывает полезно. Я не знаю всей Вашей задачи
     
    #4 Slavka, 7 янв 2017
    Последнее редактирование: 7 янв 2017
    Danil005 нравится это.
  5. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    так же после соединения с базой данных укажи режим вывода всех ошибок
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );