На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > Проблема с созданием и обработкой массива полученного из формы, isset($_POST[]) работает, а empty нет
      Ещё вопрос от новичка.
      Есть форма с несколькими полями. Данные обрабатываются методом $_POST и empty проверяет пустые значения. Все каждое поле обрабатывается отдельной "проверкой". Есть желание объединить в массив все эти проверки. Вот изначальный код:
      ExpandedWrap disabled
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        <?php
        if (isset($_POST['bodystyle'])) {$body_style=$_POST['bodystyle'];} /*  Задаю первое условие и проверяю, что введено и присваиваю значение */
            elseif (empty($body_style)) /*  Проевряю не пустая ли строка, если пустая - ниже оставляю пустым значение переменной */
            {
            $body_style='';
            }
            /*  Как правильно то сказать? Инициирую применение стиля */
            echo '<style type="text/css";>
            body {background:'.$body_style.';
        }
           </style>';
        ?>
            <!--  Ниже подобная схема для квадрата, который я хочу сделать массивом -->
        <?php
        if (isset($_POST['wcolor'])) {$wcolor=$_POST['wcolor'] ;}
            elseif (empty($wcolor))
            { $wcolor='';}
        if (isset($_POST['wtextcolor'])) {$wtextcolor=$_POST['wtextcolor'] ;}
            elseif (empty($wtextcolor))
           {  $wtextcolor='';}
        if (isset($_POST['wwidth'])) {$wwidth=$_POST['wwidth'] ;}
            elseif (empty($wwidth))
           {  $wwidth='';}
        echo '<style type="text/css";>
            .wrap {background:'.$wcolor.';
                color:'.$wtextcolor.';
                width:'.$wwidth.';
        }
            </style>';
        ?>
           <!--   Создаю две формы для ввода цвета БОДИ и квадрата -->
        <form action="indexM.php" method="post" enctype="multipart/form-data">
                           цвет фона для БОДИ:<input name="bodystyle" value="" type="text">
                           <input value="сменить" type="submit">
        </form>
        <form action="indexM.php" method="post" enctype="multipart/form-data">
                     цвет фона для Квадрата:<input name="wpriz[wcolor]" value="" type="text"><br>
                     цвет текста внутри квадрата:<input name="wpriz[wtextcolor]" value="" type="text"><br>
                     ширина квадрата:<input name="wpriz[wwidth]" value="" type="text">
                     <input value="сменить" type="submit">
        </form>

      Вот как пробую сделать:
      ExpandedWrap disabled
        if (isset($_POST['wpriz'])){$wprizs=array($_POST['wpriz']);
        foreach ($_POST['wpriz'] as $key => $value)
        {echo "$key $value <br>";} /* чисто для проверки присваивает или нет и все применяется, отчет вводится*/
        }
        elseif (empty($_POST['wpriz'])){
        $wprizs=array($_POST['wpriz']); /* Notice: Undefined index: wpriz */
        echo "$wprizs"; /* Тут проверка не проходит, ругается на эту строку Notice: Array to string conversion Array */
        }
         
            echo '<style type="text/css";>
            .wrap {background:'.$wcolor.';
                color:'.$wtextcolor.';
                width:'.$wwidth.';
        }
            </style>';

      Пробовал кусок с empty сделать вот так:
      ExpandedWrap disabled
        elseif (empty($wprizs)){
        $wcolor='';
        $wtextcolor='';
        $wwidth='';
        }
         
            echo '<style type="text/css";>
            .wrap {background:'.$wcolor.'; /* ругается на эти строки  */
                color:'.$wtextcolor.'; /* ругается на эти строки  */
                width:'.$wwidth.'; /* ругается на эти строки  */
        }
            </style>';

      Тоже ругается.
        Цитата D-G @
        foreach ($_POST['wpriz'] as $key => $value)

        Вообще то, foreach - перебор массива. Перебирая $_POST[.... следовало бы понимать что и как в нем размещено. Для изучения $_POST можно заюзать
        ExpandedWrap disabled
          var_dump($_POST);
        Сообщение отредактировано: Руслан -
        нечто нейтральное, пока что.
          Извращенец
          ExpandedWrap disabled
            if (isset($_POST['wcolor'])) {$wcolor=$_POST['wcolor'] ;}
                elseif (empty($wcolor))
                { $wcolor='';}
            if (isset($_POST['wtextcolor'])) {$wtextcolor=$_POST['wtextcolor'] ;}
                elseif (empty($wtextcolor))
               {  $wtextcolor='';}
            if (isset($_POST['wwidth'])) {$wwidth=$_POST['wwidth'] ;}
                elseif (empty($wwidth))
               {  $wwidth='';}

          Заменить на
          ExpandedWrap disabled
                  $variables = array('wcolor', 'wtextcolor', 'wwidth');
                  foreach ($variables as $value) {
                    $$value = '';
                    if (isset($_POST[$value])) $$value = $_POST[$value];
                  }
            ExpandedWrap disabled
              foreach ($_POST as $key=>$value)
              {
                  if (!empty($value)) {echo $key.' = '.$value.'<br>';} else {echo $key.' = none<br>';}
              }

            :whistle:
            Сообщение отредактировано: Руслан -
            нечто нейтральное, пока что.
              Цитата Gonarh @
              Извращенец

              Ну мы уже говорили с вами на эту тему ))) потому и пробую переделать в масив
              Ваш вариант работает, но в таком виде:
              ExpandedWrap disabled
                $variables = array('wcolor', 'wtextcolor', 'wwidth');
                foreach ($variables as $value) {
                $$value = '';
                  if (isset($_POST[$value])) $$value = $_POST[$value];
                   elseif (empty($_POST[$value])){
                $value='';
                }
                }

              Но мне пришлось ещё заменить в форме (видимо забыл сакцентировать внимание, на вот этом: <input name="wpriz[wcolor]"). Мне казалось, что так короче, особенно, если ещё добавлять поля с инпутами

              Добавлено
              Цитата Руслан @
              foreach ($_POST as $key=>$value)
              {
              if (!empty($value)) {echo $key.' = '.$value.'<br>';} else {echo $key.' = none<br>';}
              }


              Возможно я не так понял, но сделал вот так:
              ExpandedWrap disabled
                if (isset($_POST['wpriz'])){$wprizs=array($_POST['wpriz']);
                foreach ($_POST['wpriz'] as $key => $value)
                    {
                       if (!empty($value)) {echo $key.' = '.$value.'<br>';} else {echo $key.' = none<br>';}
                    }
                }

              Получилось вот что:
              ExpandedWrap disabled
                wcolor = green
                wtextcolor = none
                wwidth = none

              И ещё при обновлении страницы и после ввода данных в форму выдает нотис:
              ExpandedWrap disabled
                Notice: Undefined variable: wcolor on line 33
                Notice: Undefined variable: wtextcolor on line 34
                Notice: Undefined variable: wwidth on line 35
                Цитата D-G @
                Получилось вот что:

                Почему вы упорно игнорируете необходимость задать цвет по умолчанию? - на случай, когда одмин ни чего не передал. :huh:
                нечто нейтральное, пока что.
                  Цитата Руслан @
                  Почему вы упорно игнорируете необходимость задать цвет по умолчанию? - на случай, когда одмин ни чего не передал.

                  По умолчанию берется из файла стилей, для этого в моем я пробовал это сделать вот так
                  ExpandedWrap disabled
                    elseif (empty($wprizs)){
                    $wcolor='';
                    $wtextcolor='';
                    $wwidth='';
                    }

                  в вашем варианте я думал, что это выполняет эта строка
                  ExpandedWrap disabled
                     if (!empty($value)) {echo $key.' = '.$value.'<br>';} else {echo $key.' = none<br>';}


                  Добавлено
                  Цитата Gonarh @
                  $$value = '';
                  if (isset($_POST[$value])) $$value = $_POST[$value];


                  А почему у вас в этих строках value стоит с двумя долларами "$$"?
                    Цитата D-G @
                    По умолчанию берется из файла стилей, для этого в моем я пробовал это сделать вот так

                    Присвоить пустые значения = взять из файла стилей? :huh: С чего бы?! :-?
                    нечто нейтральное, пока что.
                      Цитата Руслан @
                      Присвоить пустые значения = взять из файла стилей? :huh: С чего бы?! :-?

                      Прочитал про приоритеты стилей, там сказано, что применяется пользовательский, а если в нем пустое значение, то применяется основной стиль, вот и поставил пустое значение, и оно работает.
                        Цитата D-G @
                        Прочитал про приоритеты стилей, там сказано, что применяется пользовательский, а если в нем пустое значение, то применяется основной стиль, вот и поставил пустое значение, и оно работает.

                        Изначальная логика применения файла стилей - не связана с изначальной логикой работы PHP.
                        Где в PHP вы установили стиль по умолчанию(который пробуете присвоить в любом случае) - я не вижу. И php интерпретатор не видит, выдавая "Notice: Undefined variable:". :-?
                        нечто нейтральное, пока что.
                          Цитата Руслан @
                          Где в PHP вы установили стиль по умолчанию(который пробуете присвоить в любом случае) - я не вижу

                          вот эта строка задает стиль
                          ExpandedWrap disabled
                            echo '<style type="text/css";></style>

                          Все, что между тегом стайл применяется. У меня вот код:
                          ExpandedWrap disabled
                               echo '<style type="text/css";>
                               .wrap {background:'.$wcolor.';
                            background-image:'.$wbgimg.';
                                 color:'.$wtextcolor.';
                                 width:'.$wwidth.';
                            }
                               </style>';
                            Цитата D-G @
                            echo '<style type="text/css";>
                            .wrap {background:'.$wcolor.';
                            background-image:'.$wbgimg.';
                            color:'.$wtextcolor.';
                            width:'.$wwidth.';
                            }
                            </style>';

                            По всей видимости, когда переменная $wcolor не установлена, вываливается ваш Notice: Undefined variable: wcolor on line 33.
                            т.е. вы её всё же не установили, но пробуете её куда-то применить...
                            нечто нейтральное, пока что.
                              Ладно, вот код-аналогия, для варианта с массивами. html урезал.

                              ExpandedWrap disabled
                                $HTMLSettings['user_bg_color']='';
                                $HTMLSettings['user_text_color']='';
                                $HTMLSettings['user_width']='';
                                 
                                if (isset($_POST['SetSetting']))
                                {
                                    foreach ($_POST['SetSetting'] as $key=>$value)
                                    {
                                        if (isset($HTMLSettings[$key])) {$HTMLSettings[$key]=$value;}
                                    }
                                }
                                 
                                echo 'цвет фона для Квадрата:<input name="SetSetting[user_bg_color]" value="'.$HTMLSettings['user_bg_color'].'" type="text"><br>
                                Фоновое изображение: <input name="SetSetting[user_text_color]" value="'.$HTMLSettings['user_text_color'].'" type="text"><br>'


                              Добавлено
                              Цитата D-G @
                              А почему у вас в этих строках value стоит с двумя долларами "$$"?

                              пример:
                              ExpandedWrap disabled
                                $x='test';
                                $$x='you'; //здесь появилась переменная $test, которой присвоено значение 'you'.
                                 
                                echo $x.'<hr>';
                                echo $test.'<hr>';
                              Сообщение отредактировано: Руслан -
                              нечто нейтральное, пока что.
                                А может кто-то допилить до рабочего состояния мой вариант, с учестом, что <input name="wpriz[wcolor]", <input name="wpriz[wtextcolor]", <input name="wpriz[wwidth]"? Такая форма потому что на мой взгляд новичка в случае добавления переменных в массиве придется много чего добавлять и будет длинная строка по типу: array('1','2','3','4','5','6','7','8','9', и тд) Или мой вариант абсолютно безнадежен? Если безнадежен, то пжл, поясните почему?
                                ExpandedWrap disabled
                                      if (isset($_POST['wpriz'])){$wprizs=array($_POST['wpriz']);
                                      foreach ($_POST['wpriz'] as $key => $value)
                                      {echo "$key $value <br>";} /* чисто для проверки присваивает или нет и все применяется, отчет выводится*/
                                  var_dump($_POST['wpriz']); /* тоже чисто для проверки присваивает или нет и все применяется, отчет выводится*/
                                      }
                                      elseif (empty($_POST['wpriz'])){
                                      $wprizs=array($_POST['wpriz']); /* Notice: Undefined index: wpriz */
                                      echo "$wprizs"; /* Тут проверка не проходит, ругается на эту строку Notice: Array to string conversion Array */
                                      }
                                   
                                  echo '<style type="text/css";>
                                         .wrap {
                                           background:'.$wcolor.'; /* При нажатии на "сменить выдает Undefined variable: wcolor on line 40, тоесть на эту строку */
                                           color:'.$wtextcolor.';  /* При нажатии на "сменить выдает Undefined variable: wtextcolor on line 41, тоесть на эту строку */
                                           width:'.$wwidth.';  /* При нажатии на "сменить выдает Undefined variable: wwidth on line 42, тоесть на эту строку */
                                      }
                                         </style>';

                                При нажатии на "Сменить" выдает следующее:
                                ExpandedWrap disabled
                                  wcolor green
                                  wtextcolor
                                  wwidth
                                  array(3) { ["wcolor"]=> string(5) "green" ["wtextcolor"]=> string(0) "" ["wwidth"]=> string(0) "" }
                                  Notice: Undefined variable: wcolor on line 40
                                  Notice: Undefined variable: wtextcolor on line 41
                                  Notice: Undefined variable: wwidth on line 42

                                Вижу, что $key присваивает правильно, из квадратных скобок конструкции <input name="wpriz[]" и $value тоже. string - это количество символов в $value. Но как это перекинуть в стиль? Может нужно подправить стиль? Но опять же как?
                                  Цитата Руслан @
                                  Ладно, вот код-аналогия, для варианта с массивами. html урезал.

                                  Кстати, только сейчас увидел прокрутку в вашем примере, и увидел как вы поменяли инпуты. Ваш вариант работает, спасибо за него.
                                  Только я в инпутах убрал значение value, так на мой взгляд удобней заполнять поле.
                                  Сообщение отредактировано: D-G -
                                    Цитата D-G @
                                    А может кто-то допилить до рабочего состояния мой вариант

                                    Чёт вы совсем запутали. :blink: Вы же хотели научиться программировать? :-? Или уже всё, нужно, что бы за вас написали? :huh:

                                    Цитата D-G @
                                    в случае добавления переменных в массиве придется много чего добавлять и будет длинная строка по типу

                                    Извиняюсь, а можете кратким русским языком пояснить(и указать строку кода, формирующую значение) - откуда ваша программа узнает значения переменных, которые вы подставляете в css:
                                    1. в случае, когда из браузера не прислали нового значения?
                                    2. в случае, когда из браузера прислали новое значение?
                                    Вопрос возник, т.к. похоже, часть вашего кода работает на чистой телепатии! А древний php интерпретатор, судя по всему не может корректно справится с такого рода нагрузкой... :-?

                                    Скрытый текст
                                    Цитата D-G @
                                    string - это количество символов в $value

                                    Не. String это тип данных, в скобках количество символов.


                                    Добавлено
                                    Цитата D-G @
                                    Кстати, только сейчас увидел прокрутку в вашем примере, и увидел как вы поменяли инпуты. Ваш вариант работает, спасибо за него.

                                    :)
                                    нечто нейтральное, пока что.
                                      Цитата Руслан @
                                      Или уже всё, нужно, что бы за вас написали

                                      Нет конечно. Но на рабочих примерах можно учится и видеть, в каком месте неправильно свернул. Потому и просил именно допилить, а не написать полностью свой.
                                      Цитата Руслан @
                                      откуда ваша программа узнает значения переменных, которые вы подставляете в css:
                                      1. в случае, когда из браузера не прислали нового значения?
                                      2. в случае, когда из браузера прислали новое значение?

                                      Может я опять же, чего-то не понимаю, но мне казалось, что когда мой index.php подгружает данные из admin.php (файл, где меняются настройки), то он автоматом подгружает и "зарезервированные" в нем стили для различных элементов (классов, айди и прочее). Эти куски стиля прописываются с помощью "echo" в файле admin.php. Его код я уже писал, вот он:
                                      ExpandedWrap disabled
                                        echo '<style type="text/css";>
                                          .wrap {background:'.$wcolor.';
                                             background-image:'.$wbgimg.';
                                             color:'.$wtextcolor.';
                                             width:'.$wwidth.';
                                        }
                                          </style>';

                                      Ну а там уже идет речь о приоритетах, которые я вычитал по подсказке JoeUser про !important. Может я что-то не правильно делаю, но особо об этом никто не говорит, а оно работает, вот я и не заморачиваюсь. Но понял, что это в любом случае до первой перезагрузки страницы. Или даже не обязательно до первой перезагрузки. Если я динамически добавляю(меняю) класс, у которого хочу поменять свойство, то не применяется, поскольку страница index.php уже была загружена без этих "новых" классов. Так что в любом случае вы правы, что нужно где-то сохранять, напр, в том же css-файле. Хотя чисто для тренировки почти полностью написал тот "инструмент" для мальчика Жени со своим вариантом (в нем есть часть "статичных" классов, которые грузятся сразу и часть "динамичных", которые можно выбирать из списка классов, в котором хочу поменять свойство и вот уже в нем пробую на ваших подсказках писать в css. Но пока есть вопросы. Сейчас заткнулся на чтении файлов и каталогов.
                                      Сообщение отредактировано: D-G -
                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script Execution time: 0,1966 ]   [ 17 queries used ]   [ Generated: 16.09.19, 14:20 GMT ]