За последние 24 часа нас посетили 22939 программистов и 1234 робота. Сейчас ищет 691 программист ...

Как бороться с неопределёнными переменными?

Тема в разделе "PHP для новичков", создана пользователем Алексей87К, 19 окт 2017.

Метки:
  1. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    Здравствуйте! Столкнулся с такой проблемой! На локальном сервере, таких ошибок не было. Они выявились когда я залил сайт на хост. Сначала было это...
    what2.png

    потом, с добавление этой строчки, ошибки ушли

    what8.png
    но не совсем... Дело в том, что в самой форме, они остались

    what9.png

    Помогите пожалуйста решить. Поддержка на хостинге не может. Уже обращался!
    На форуме подсказали следующее...
    PHP:
    1. <?=$_POST['name'] ?? '';?>
    Но я не знаю куда его вставлять!

    Привожу свой код ниже:
    PHP:
    1.                  if(!empty($_POST['name'])){
    2.                      $to = 'a.kovalkovsky@gmail.com';
    3.                      $tema = 'Новое сообщение';
    4.                      $name = strip_tags(trim($_POST['name']));
    5.                      $email = strip_tags(trim($_POST['email']));
    6.                      $skype = strip_tags(trim($_POST['skype']));
    7.                      $sms = strip_tags(trim($_POST['sms']));
    8.                      $message = "Имя пользователя: ".$name."\r\n";
    9.                      $message .= "Почта: ".$email."\r\n";
    10.                      $message .= "Skype: ".$skype."\r\n";
    11.                      $message .= "Сообщение: ".$sms."\r\n";
    12.                      $error = false;
    13.                      $err = array('email' => '', 'name' => '', 'sms' => '');
    14.  
    15.                      if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)){
    16.               $err['email'] = 'Вы ввели не корректный email';
    17.         $error = true;
    18.          }
    19.                      if (empty($name)){
    20.               $err['name'] = 'Вы не ввели имя';
    21.         $error = true;
    22.          }
    23.  
    24.  
    25.                     // if(!$error){
    26.                         $tema = "=?utf-8?B?".base64_encode($subject)."?=";
    27.                         $headers = "From: $from\r\nReply-to: $from\r\nContent-type:text/plain; charset=utf-8\r\n";
    28.                         mail($to, $tema, $message, $headers);
    29.                        // if(mail($to, $subject, $sms, $headers)){
    30.                            //  header('Location: /otzivi.php');
    31.                        // }
    32.                     // }
    33.                  }
    HTML:
    1. <div class="popupcontact">
    2.             <div class="wrapper">
    3.                  <div class="popupcontacttitle" id="about">Оставьте заявку сейчас и получите бесплатную консультацию!</div>
    4.                  <form id="form" method="post" action="form.php" class="popupform">
    5.                      <input type="text" placeholder="Ваше имя" id="name" name="name"  value="<?=$_POST['name']?>"  />
    6.  
    7.                      <input type="e-mail" placeholder="Ваша почта" id="email" name="email"  value="<?=$_POST['email']?>" />
    8.  
    9.                      <input type="text" placeholder="Ваш Skype"  name="skype"  value="<?=$_POST['skype']?>" />
    10.                      <textarea name="sms" cols="5" rows="10" placeholder="Ваше сообщение" value="<?=$_POST['sms']?>"></textarea>
    11.  
    12.                      <div>
    13.                          <button type="submit" id="sbm">Оставьте заявку</button>
    14.                      </div>
    15.                  </form>
    16.  
    17.               </div>
    18.             </div>
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
  3. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    Я ввёл вас в небольшое заблуждение, прошу ещё раз посмотреть на код. Я убрал всё лишнее... Касаемо, валидации и проверок поле, мне это не нужно. Мне нужно, чтобы не было этих ошибок:
    what12.png

    Код:
    PHP:
    1. $to = 'a.kovalkovsky@gmail.com';
    2.                      $tema = 'Новое сообщение';
    3.  
    4.                      if(!empty($_POST['name'])){$name = strip_tags(trim($_POST['name']));}
    5.                      if(!empty($_POST['email'])){$email = strip_tags(trim($_POST['email']));}
    6.                      if(!empty($_POST['skype'])){$skype = strip_tags(trim($_POST['skype']));}
    7.                      if(!empty($_POST['sms'])){$sms = strip_tags(trim($_POST['sms']));}
    8.                      $message = "Имя пользователя: ".$name."\r\n";
    9.                      $message .= "Почта: ".$email."\r\n";
    10.                      $message .= "Skype: ".$skype."\r\n";
    11.                      $message .= "Сообщение: ".$sms."\r\n";
    12.  
    13.  
    14.  
    15.                         $tema = "=?utf-8?B?".base64_encode($subject)."?=";
    16.                         $headers = "From: $from\r\nReply-to: $from\r\nContent-type:text/plain; charset=utf-8\r\n";
    17.                         mail($to, $tema, $message, $headers);
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    чтов ошибках пишется ?
    --- Добавлено ---
    тогда наслаждайся ошибками
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    проверяй на существование переменной - isset()
     
  6. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    Вы вообще меня не поняли! Я хочу решить проблему с ошибками, которые отображаются в браузере при загрузке страницы! Всё остальное потом!!! Вы можете помочь решить мне эти ошибки???
    --- Добавлено ---
    Пробовал по разному, всё равно ошибка...
    PHP:
    1. if(isset($_POST['name'])){
    2.                      $name = strip_tags(trim($_POST['name']));
    3.                     }
    4.                      if(!empty($_POST['email'])){
    5.                          $email = strip_tags(trim($_POST['email']));
    6.                      }
    what12.png
     
  7. Каменьвогород

    С нами с:
    19 окт 2017
    Сообщения:
    12
    Симпатии:
    1
    Код (Text):
    1. error_reporting(0);
    2. $_POST['name'];
    В данном случае ошибка не будет выводиться, но так делать не нужно.

    Код (Text):
    1. @$_POST['name'];
    Так ошибка тоже не будет выводиться, и опять же, так делать не нужно.

    Код (Text):
    1. if ( !empty( $_POST['name'] ) )  {
    2. ...
    3. }
    И так ошибка не выведется, но такой вариант самый приемлемый. Можно еще так:
    Код (Text):
    1. if ( isset( $_POST['name'] ) )  {
    2. ...
    3. }
    О чем собственно говорили на пару комментов выше.

    Это что касается $_POST, а теперь о самих переменных внутри условий.

    Если переменную объявить внутри условия
    Код (Text):
    1. if ( !empty( $_POST['name'] ) )  {
    2.     $name = 'тра-ля-ля';
    3. }
    То она будет доступ только после того, как условие будет истиной. Если же будет ложь, тогда переменная в памяти не будет создана и вызывая ее за пределами условия, интерпретатору php нечего будет вам вернуть, переменной ведь нет.

    Как с этим бороться?

    Можно объявить переменную в самом начале.
    Код (Text):
    1. $name = '';
    2.  
    3. if ( isset( $_POST['name'] ) ) {
    4.    $name = $_POST['name'];
    5. }
    6.  
    7. echo $name;
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    на хостинг. любой компьютер можно назвать "хост", это практически синонимы.

    на самом деле ситуация должна быть обратная: на локальном хосте надо включить вывод всех предупреждений, а на публичном хостинге выключить. рулится это настройкой http://php.net/manual/ru/errorfunc.configuration#ini.error-reporting

    на локалке надо бороться с причинами предупреждений, не подавляя сообщения. в публичном пользовании такие сообщения конечно лишние. они демонстрируют твой истинный уровень разработчика и кричат "ломай меня полностью".
     
    #8 artoodetoo, 19 окт 2017
    Последнее редактирование: 20 окт 2017
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    могу, что ошибки пишут ? расскажи как ты их понимаешь
     
  10. alexpride1993

    alexpride1993 Новичок

    С нами с:
    28 мар 2016
    Сообщения:
    56
    Симпатии:
    20
    Эх, заранее извиняюсь за оффтоп, но после таких тредов появляется желание выговориться.
    Как же мне жаль, как же мне с*ка жаль что даже в седьмой версии ванильный PHP позволяет ляпать такое, и оно даже будет выполняться, хоть и с вагоном нотисов. Вот не понимаю я почему разработчики до сих пор оставили такую возможность а не порезали ее к фигам собачьим?
    Вот в laravel как сделано, вот это я понимаю! Используешь неинициализированную переменную? Лови фаталочку! Не обработал исключение от неудачного запроса к MySQL? Нафиг с пляжа! Пытаешься обратиться к полю не-объекта? Давайгуляй! И это правильно и круто! Хотя бы по тому что такой подход дисциплинирует программиста, заставляет его лучше анализировать поведение своего кода, что в конечном счете положительно сказывается на качестве конечного продукта. Ну и с точки зрения саморазвития, человеку будет легче изучить какой нибудь новый язык, уже зная что переменные НУЖНО объявлять, а исключения НУЖНО ловить.
    По моему мнению так должно быть по дефолту, а не с помощью огорода из кастомных обработчиков ошибок фреймворков, не понимаю почему ребята из Zend (или кто сейчас рулит разработкой PHP) так боятся зарубить на корню старую парадигму, порождающую безалаберность в написании кода и сделать реализовать в PHP "взрослую" обработку ошибок (а нотис таки да, ошибка), а может даже и (опциональную) статическую типизацию везде, а не только в аргументах методов и функций, а для любителей, которые "знают толк" сделать директиву на подобии
    Код (Text):
    1. 'use lame';
    , чтобы они дальше могли писать свои собачки и обращаться к $undefined.

    PS: извините если кто-то принял мои слова на свой счет, уверяю вас, мои мысли абстрактны и не относятся к конкретным людям. Последнее время порой приходится разбирать и вносить правки в быдлокод, написанный на коленке в режиме "шобработало" и у меня горит так, что отдел снабжения задолбался уже стулья менять.
     
    rewuxiin, Каменьвогород и romach нравится это.
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Алексей87К
    Проверяй переменную функцией empty(); с твоими ошибками легко бороться они самые примитивные у начинающих php кодеров, я тоже как бы начинающий :D так что слушай ребят которые тебе советуют выше.
    --- Добавлено ---
    @alexpride1993
    Правильно иногда нужно выговорится, чтобы опустило.
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    В целом согласен: беспощадность это благо в процессе разработки.

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

     
    #12 artoodetoo, 20 окт 2017
    Последнее редактирование: 20 окт 2017
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Тру вэй
    PHP:
    1. <?php
    2. $name = filter_input(INPUT_POST, 'name');
    3. if ($name !== null) {
    4.    /* обработка формы */
    5. }
    6. ?>
    7. <form method="POST">
    8. <input type="text" name="name" value="<?=$name?>">
    функция filter_input создана для правильного получения переменных запроса.
     
  14. alexpride1993

    alexpride1993 Новичок

    С нами с:
    28 мар 2016
    Сообщения:
    56
    Симпатии:
    20
    Согласен, кривыми настройками можно испортить все что угодно, я говорил скорее о поведении системы по умолчанию, без самовольного вмешательства в папку vendor.
    У меня к ваниле претензии в плане стратегии обработки ошибок. Если лара обнаружив косяк немедленно остановит исполнение скрипта и вывалит в ответ код 500, то ванила сглотнет и пойдет бежать дальше, используя в дальнейших расчетах непредсказуемый, ошибочный результат, и если в ларе нужно ковыряться в настройках чтобы переопределить поведение немедленного останова скрипта, то в ванильном PHP наоборот, нужно прилагать усилия чтобы реализовать его.
    Это обстоятельство, особенно в умах начинающих программистов, которые только постигают язык и не готово лезть в глубины конфигов и фреймворков, и используют настройки по умолчанию для своих первых скриптов, порождает неправильное отношение к ошибкам в принципе, они начинают считать что notice это что-то не серьезное, в то время как это наигрубейшая ошибка, ведущая к неправильному исполнению скрипта. Если это форма обратной связи, в которой половину полей можно просто не заполнять, да и хрен с ней, но вот давайте представим что чувак, укрепленный тем что его детище работает берется писать что нибудь серьезное, например инструмент для интеграции с платежным сервисом, и в один прекрасный момент может настать ситуация, когда сервис запросит баланс, скрипт его не получит из-за сбоя MySQL и вместо вылета вернет NULL, который пойдет в ответ сервису, а тот спишет все деньги с клиента.
    Именно по этому, чтобы душить такой стиль кодинга в зародыше и не допускать подобных ситуаций как в моем примере я и хотел бы чтобы изначально, на самых самых дефолтных настройках пых бил скрипт в ответ на любой пук и чих не давая исполняться говнокоду.
    PHP замечательный язык и мне он очень нравится, но у него есть огромная проблема - на нем слишком легко писать очень плохой код, и было бы круто если бы такую возможность убрали, для всеобщего блага.
     
  15. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    Здравствуйте! Мне посоветовали объявлять переменные в самом начале и это сработало... Но в полях формы, они по прежнему выводятся
    what9.png
     
    #15 Алексей87К, 20 окт 2017
    Последнее редактирование: 20 окт 2017
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Потому что в полях формы ты выводишь переменные, которые не были объявлены
     
  17. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    Что лучше сделать в этой ситуации?
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Я думаю, нужно объявлять именно те переменные, которые буду выводиться в форме.
     
  19. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    w.png
    Я все объявил! Не помогло только частично!
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Код формы в студию
     
  21. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    PHP:
    1. <?php
    2. include_once('functions.php');
    3. /*
    4.  
    5.     ФИЛТРАЦИЯ ! ! !
    6.  
    7. */
    8. $to = 'a.kovalkovsky@gmail.com';
    9.                      $tema = 'Новое сообщение';
    10.                      $name = '';
    11.                      $email = '';
    12.                      $skype = '';
    13.                      $sms = '';
    14.                      $subject = '';
    15.                      $from = '';
    16.                      if(!empty($_POST['name'])){$name = strip_tags(trim($_POST['name']));}
    17.                      if(!empty($_POST['email'])){$email = strip_tags(trim($_POST['email']));}
    18.                      if(!empty($_POST['skype'])){$skype = strip_tags(trim($_POST['skype']));}
    19.                      if(!empty($_POST['sms'])){$sms = strip_tags(trim($_POST['sms']));}
    20.                      $message = "Имя пользователя: ".$name."\r\n";
    21.                      $message .= "Почта: ".$email."\r\n";
    22.                      $message .= "Skype: ".$skype."\r\n";
    23.                      $message .= "Сообщение: ".$sms."\r\n";
    24.  
    25.  
    26.  
    27.                         $tema = "=?utf-8?B?".base64_encode($subject)."?=";
    28.                         $headers = "From: $from\r\nReply-to: $from\r\nContent-type:text/plain; charset=utf-8\r\n";
    29.                         mail($to, $tema, $message, $headers);
    HTML:
    1. <div class="popupcontact">
    2.             <div class="wrapper">
    3.                  <div class="popupcontacttitle" id="about">Оставьте заявку сейчас и получите бесплатную консультацию!</div>
    4.                  <form id="form" method="post" action="form.php" class="popupform">
    5.                      <input type="text" placeholder="Ваше имя" id="name" name="name"  value="<?=$_POST['name']?>"  />
    6.  
    7.                      <input type="e-mail" placeholder="Ваша почта" id="email" name="email"  value="<?=$_POST['email']?>" />
    8.  
    9.                      <input type="text" placeholder="Ваш Skype"  name="skype"  value="<?=$_POST['skype']?>" />
    10.                      <textarea name="sms" cols="5" rows="10" placeholder="Ваше сообщение" value="<?=$_POST['sms']?>"></textarea>
    11.  
    12.                      <div>
    13.                          <button type="submit" id="sbm">Оставьте заявку</button>
    14.                      </div>
    15.                  </form>
    16.  
    17.               </div>
    18.             </div>
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Ну и какие переменные ты выводишь в форме? $name, $email и т.д.?
     
  23. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    $name, $email, $skype, $sms - эти. А что неправильно?
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Да где они в форме???
    --- Добавлено ---
    Какой силы должно быть внушение чтобы видеть то, чего нет?
     
  25. Алексей87К

    Алексей87К Новичок

    С нами с:
    5 янв 2017
    Сообщения:
    157
    Симпатии:
    4
    Я вас понял, и исправил, но всё равно не помогло...
    HTML:
    1. <div class="popupcontact">
    2.             <div class="wrapper">
    3.                  <div class="popupcontacttitle" id="about">Оставьте заявку сейчас и получите бесплатную консультацию!</div>
    4.                  <form id="form" method="post" action="form.php" class="popupform">
    5.                      <input type="text" placeholder="Ваше имя" id="name" name="name"  value="<?=$name?>"  />
    6.  
    7.                      <input type="e-mail" placeholder="Ваша почта" id="email" name="email"  value="<?=$email?>" />
    8.  
    9.                      <input type="text" placeholder="Ваш Skype"  name="skype"  value="<?=$skype?>" />
    10.                      <textarea name="sms" cols="5" rows="10" placeholder="Ваше сообщение" value="<?=$sms?>"></textarea>
    11.  
    12.                      <div>
    13.                          <button type="submit" id="sbm">Оставьте заявку</button>
    14.                      </div>
    15.                  </form>
    16.  
    17.               </div>
    18.             </div>
    --- Добавлено ---
    Извините, но кажется помогло!!!
     
    [vs] нравится это.