За последние 24 часа нас посетили 111055 программистов и 6480 роботов. Сейчас ищут 1432 программиста ...

Передача данных с первого раза

Тема в разделе "PHP для новичков", создана пользователем TYMON_KROT, 3 сен 2018.

  1. TYMON_KROT

    TYMON_KROT Новичок

    С нами с:
    20 мар 2018
    Сообщения:
    5
    Симпатии:
    1
    Здравствуйте. Пытаюсь передать данные от одной страницы к другой, но проблема в том, что они с первого раза не передаются, то есть заполняю форму на странице test.php нажимаю далее, и меня опять возвращает обратно (срабатывает условие в acc.php). Далее, если заполнить форму ещё раз, то данные нормально передаются, пропускается условие в acc.php и подгружается необходимая мне страница. Подскажите, пожалуйста, решение проблемы?

    Код test.php

    PHP:
    1. <?
    2. ?>
    3. <h2 align="center">Тест</h2>
    4. <div class="tab_f">
    5. <div class="form_a">
    6. Анкетные данные </div>
    7. <?php
    8. if(isset($_POST['go'])):
    9.     $e1=null;
    10.     $name=trim($_POST["name"]);
    11.     $name=strip_tags($name); // вырезаем теги
    12.         //конвертируем специальные символы в мнемоники HTML
    13.     $name=htmlspecialchars($name,ENT_QUOTES);
    14.         $name=stripslashes($name);
    15.     if(strlen($name)=="0"):
    16.         $e1.="Заполните поле 'ФИО'<br>";
    17.     endif;
    18.     $e2=null;
    19.     $phone=trim($_POST["phone"]);
    20.     $phone=strip_tags($phone);
    21.     $phone=htmlspecialchars($phone,ENT_QUOTES);
    22.     $phone=stripslashes($phone);
    23.     if(strlen($phone)=="0"):
    24.         $e2.="Заполните поле 'Телефон'<br>";
    25.     elseif((strlen($phone)>0) && (!preg_match("/^[0-9-]+$/",$phone))):
    26.         $e2.="Неверный формат<br>";
    27.     endif;
    28.    
    29.     $e3=null;
    30.     $mail=trim($_POST["mail"]);
    31.     $mail=strip_tags($mail);
    32.     $mail=htmlspecialchars($mail,ENT_QUOTES);
    33.     $mail=stripslashes($mail);
    34.     if(strlen($mail)=="0"):
    35.         $e3.="Заполните поле 'E-mail'<br>";
    36.     elseif
    37.     (!filter_var($mail, FILTER_VALIDATE_EMAIL)):
    38.         $e3.="Неккоректно введен E-mail<br>";
    39.     endif;
    40.     $eEn=$e1.$e2.$e3;
    41.     if($eEn==null):
    42.             // выводим уведомление об успехе операции и перезагружаем страничку
    43.         print "<script language='Javascript' type='text/javascript'>
    44.        <!--
    45.        alert ('Тест состоит из вопросов. Вам необходимо выбрать правильный ответ.');
    46.        function reload(){location = '/test/acc.php'};
    47.        setTimeout('reload()', 0);
    48.        -->
    49.        </script>";
    50.     endif;
    51.     endif;
    52.     $_SESSION['name'] = htmlspecialchars($_POST['name']);
    53.     $_SESSION['phone'] = htmlspecialchars($_POST['phone']);
    54.     $_SESSION['mail'] = htmlspecialchars($_POST['mail']);
    55.     $_SESSION['voteid'] = htmlspecialchars($_POST['voteid']);
    56. ?>
    57. <form action="" method="post">
    58.   <table style="font-family: tahoma; font-size: 12px; padding: 10px;" width="50%" align="center">
    59.       <tr>
    60.         <td><div align="right">ФИО<font color="red">*</font>:&nbsp;</div></td>
    61.         <td><input name="name" value="<?=@$name;?>" > <br><span class="error"><?=@$e1;?></span></td>
    62.             </tr>
    63.       <tr>
    64.        <td><div align="right">Телефон<font color="red">*</font>:&nbsp;</div></td>
    65.        <td><input name="phone" value="<?=@$phone;?>"><br><span class="error"><?=@$e2;?></span></td>
    66.       </tr>
    67.       <tr>
    68.         <td><div align="right">E-mail<font color="red">*</font>:&nbsp;</div></td>
    69.         <td><input name="mail" value="<?=@$mail;?>"><br><span class="error"><?=@$e3;?></span></td>
    70.       </tr>
    71.       <tr>
    72.         <td><div align="right">Откуда Вы о нас узнали<font color="red">*</font>:&nbsp;</div></td>
    73.         <td style="font-family: tahoma; font-size: 12px;">
    74.         <select name="voteid" size="1">
    75. <option  value=""  /></option>
    76. <option   value="Буклеты-визитки " alt="6" />Буклеты-визитки</option>
    77. <option   value="От знакомых" alt="7" />От знакомых</option></select> </td>
    78.       </tr>
    79.       <tr>
    80.         <td>&nbsp;</td>
    81.         <td><font color="red">*</font> - поля обязательные для заполнения</td>
    82.       </tr>
    83.   </table></div>
    84.   <input type="hidden" name="go" value="5"><br>
    85. <input name="input" type="image" value=" " src="/images/dalee.jpg" alt="Далее" align="right" />
    86. </form>
    Код acc.php

    PHP:
    1. <?
    2. if(!isset($_SESSION['name']) || !isset($_SESSION['phone']) || !isset($_SESSION['mail']) || !$_SESSION['voteid']) {
    3.     header("test/test.php");
    4.     exit();
    5. }
    6. ?>
    7. //далее код с вопросами и ответами
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Мне кажется ты здесь не правильно проверяешь, этот знак || вроде означает "ИЛИ" а тебе нужно использовать вроде знак && "И"
    Да и еще в этом коде очень тяжело ориентироваться.
    И хочу добавить переделайте код полностью.
     
    #2 _ne_scaju_, 3 сен 2018
    Последнее редактирование: 3 сен 2018
  3. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    Всё, что можно было сделать не так, вы сделали. Для получения и обработки данных из формы используйте filter_input_array. А вот, что бы исключить ошибки логики, купите в магазине книгу и прочитайте пару раз от корки до корки. На одних видеоуроках далеко не уедешь.
     
    _ne_scaju_ нравится это.
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    вместо этого кода, примерно я бы сделал так:
    PHP:
    1. <?php
    2. if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    3. {
    4.   $checkARGS = [
    5.     'name' => FILTER_SANITIZE_STRING,
    6.     'phone' => FILTER_VALIDATE_INT,
    7.     'mail' => FILTER_VALIDATE_EMAIL
    8.   ];
    9.  
    10.   $inputFIELD = filter_input_array( INPUT_POST, $checkARGS );
    11.  
    12.   $error = [];
    13.  
    14.   if(!empty($inputFIELD['name']))
    15.   {
    16.     if(!empty($inputFIELD['phone']))
    17.     {
    18.       if (mb_strlen($inputFIELD['phone'], 'UTF-8' ) >= 10)
    19.       {
    20.         if(!empty($inputFIELD['mail']))
    21.         {
    22.           if(in_array($error) === true){
    23.  
    24.             $_SESSION['name'] = $inputFIELD['name'];
    25.             $_SESSION['phone'] = $inputFIELD['phone'];
    26.             $_SESSION['mail'] = $inputFIELD['mail'];
    27.             header('Location: /test/acc.php');
    28.             exit();
    29.           }
    30.         }else{
    31.           $error['mail'] = "Заполните поле 'E-mail'<br>";
    32.           //редирект
    33.         }
    34.       }else{
    35.         $error['phone'] = "Не правильно введен телефон<br>";
    36.         //редирект
    37.       }
    38.     }else{
    39.       $error['phone'] = "Заполните поле 'Телефон'<br>";
    40.       //редирект
    41.     }
    42.   }else{
    43.     $error['name'] = "Заполните поле 'ФИО'<br>";
    44.     //редирект
    45.   }
    46.  
    47. }
     
    TYMON_KROT нравится это.
  5. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @_ne_scaju_, зачем вложенные друг в друга if? Очень сильно бесит когда форма ввода поочерёдно ругается на свои поля. Лучше когда ошибки на полях ввода проверяются все сразу и отображаются клиенту.
     
    MouseZver нравится это.
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    а ТС все ждал пока ему готовое блюдо преподнесут, так и не поняв из какого говна слеплено. Сьел!
     
  7. TYMON_KROT

    TYMON_KROT Новичок

    С нами с:
    20 мар 2018
    Сообщения:
    5
    Симпатии:
    1
    всё прекрасно заработало. Спасибо @_ne_scaju_, хоть так и не понял в чем суть поменялась :)

    А для тех кто решил поумничать: я понимаю, что Вы себя тут тешите и показываете Вашу состоятельность и значимость, хорошего Вам настроения. Интересно для чего же тогда форумы нужны?

    P.S. я вообще не php-программист, люди попросили помочь по мелочи поправить чей-то код. В чем смог за короткий срок разобрался.
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я с тобой не согласен, если я решил что будет одна ошибка за другой показываться значит так и будет, мне нравиться именно так, пользователи не настолько тупые что не догадаются что нужно заполнить данные правильно, не пропуская поля.
    А вообще это делаю для того чтобы красивым блоком выводить ошибки ибо этот блок будет на пол страницы если полей дофига.
     
  9. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    Ну уж точно не для того, что бы выполнять за кого-то чужую работу бесплатно. Форум - это место где начинающий программист переходя от теории к практическим занятиям и сталкиваясь с какими-либо трудностями, может получить разъяснение некоторых нюансов, и иногда даже готовый код от такого же начинающего программиста, которому необходима некоторая практика для закрепление материала.
    Люди приходящие на форум с формулировкой вопроса "дайте код" какой бы завуалированной эта формулировка не была, в лучшем случае попадают в платный раздел форума. Так было на 10 лет назад на softtime.ru, так было 5 лет назад на phpforum.su и сильно сомневаюсь, что на php.ru в нынешнее время как-то иначе.
    --- Добавлено ---
    ни одному пользователю не интересно как нравиться вам ;) про эргономику сайтов кстати тоже не мало книг написано
    пользователь заполняя форму, какой бы сложной она не была, не должен нажимать кнопку отправить больше дух раз
    опять же я не настаиваю, я просто рекомендую, прислушиваться к моим рекомендациям или нет, дело ваше, поверьте мне от этого хуже не станет :)
     
    _ne_scaju_ нравится это.
  10. TYMON_KROT

    TYMON_KROT Новичок

    С нами с:
    20 мар 2018
    Сообщения:
    5
    Симпатии:
    1
    Ну так в чем проблема? я и хотел получить как новичок, разъяснение нюансов, или указание ошибок, спасибо человеку подсказал сразу решение. Или всё за последнюю крошку удавиться готовы, не всё в этом мире в коммерческих целях делается
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Я еще не дорос до их уровня, но чем смог тем помог, да можно сделать вывод сразу всех ошибок но код чуток измениться:
    PHP:
    1. if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    2. {
    3.   $checkARGS = [
    4.     'name' => FILTER_SANITIZE_STRING,
    5.     'phone' => FILTER_VALIDATE_INT,
    6.     'mail' => FILTER_VALIDATE_EMAIL
    7.   ];
    8.  
    9.   $inputFIELD = filter_input_array( INPUT_POST, $checkARGS );
    10.  
    11.   $error = [];
    12.  
    13.   if(empty($inputFIELD['name']))
    14.   {
    15.     $error['name'] = "Заполните поле ФИО";
    16.   }
    17.  
    18.   if(empty($inputFIELD['phone']))
    19.   {
    20.     $error['phone'] = "Заполните поле Телефон";
    21.   }
    22.  
    23.   if(empty($inputFIELD['mail']))
    24.   {
    25.     $error['mail'] = "Заполните поле E-mail";
    26.   }
    27.  
    28.   if(count($error) > 0)
    29.   {
    30.     echo implode('<br>', $error);
    31.   }else{
    32.     $_SESSION['name'] = $inputFIELD['name'];
    33.     $_SESSION['phone'] = $inputFIELD['phone'];
    34.     $_SESSION['mail'] = $inputFIELD['mail'];
    35.     header('Location: /test/acc.php');
    36.     exit();
    37.   }
    38.  
    39. }
    Как по мне этот код аналогичен, выводит все ошибки сразу.
    А так не чем не отличается почти.


    @Valick так тебе нравиться больше?
    есть люди разные ты один и хочешь чтоб так было, я другой и хочу чтобы по моему было, а так спасибо, может как нибудь перейду на вывод всех ошибок.
    --- Добавлено ---
    @Valick
    Вопрос на засыпку а в MVC разве вывод сразу всех ошибок делаеться, я говорю вообще за любой MVC?
     
    #11 _ne_scaju_, 3 сен 2018
    Последнее редактирование: 3 сен 2018
    Valick нравится это.
  12. TYMON_KROT

    TYMON_KROT Новичок

    С нами с:
    20 мар 2018
    Сообщения:
    5
    Симпатии:
    1
    @_ne_scaju_ , я Вам желаю успехов роста в профессиональном плане, и при этом надеюсь Вы останетесь Человеком
     
    _ne_scaju_ нравится это.
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    спасибо, Вам того же желаю.
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Хорошо, а если используется ajax(асинхронная передача) тоже лучше все ошибки сразу выводить?
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    скопипастив
    Эронично обсираются через пару месяцев
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    Не хочу создавать тему, вопрос: хочу сделать систему ролей на сайте, но так вот как правильно организовать таблицы в бд?
    1 таблица users в ней храниться id роли
    2 таблица role в ней храниться именованные ролей (админ, юзер, модер и т.д.)
    я же правильно понимаю?
    Стоит ли создавать таблицу для хранения 4 полей ролей в бд?
     
  17. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    да
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    а то что я описал для ролей будет правильно?
     
  19. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    509
    Симпатии:
    40
    Зачем, разложить всех юзеров по 4м полям отдельной таблицы?
    Можно одним полем статус в таблице юзеров обойтись.
     
    MouseZver нравится это.
  20. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    Иногда для дополнений и прочее всяких плагинов, идут альтернативой как описано выше. В итоге стоит и правильно, создать доп таблицу, а не трогать основной таб лист с юзер данными.
     
  21. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @MouseZver, дело даже не в плагинах, всё гораздо банальнее.
    @keren, вы не поверите, но существуют правила грамотной организации структуры БД. И самое главное из них "одна сущность - одна таблица". Сущность юзер - таблица юзер, сущность роль - таблица роль. Дальше определяется их отношение. При отношении "многие к одному" (когда множество юзеров могут иметь одну и ту же роль), действительно в таблицу пользователей необходимо добавить поле где будет храниться идентификатор роли, а вся остальная информация в таблице ролей. При отношении "многие ко многим" (когда множество юзеров могут иметь множество ролей (а бывает и такое)) добавляем таблицу связи "идентификатор юзера - идентификатор роли". Далее нормализуем эти таблицы минимум до третьего закона нормализации. И садимся писать код.
    Как правило огрехи архитектуры БД проявляют себя не сразу, а когда становиться "поздно" и таблица забита данными. И потом начинается сарафанное радио, что MySQL стала узким местом проекта.
     
    _ne_scaju_ нравится это.
  22. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    @Valick если в своем проекте более не будут добавляться в будущем новые фишки/задумки, то рентабельно сделать это в юзер табе (Other колонка).
    --- Добавлено ---
    Я же не просто так тому посту лайк поставил
     
  23. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @MouseZver, вы хотите сказать, что вы у юзера в таблице в отдельной колонке напишите "администратор", "модератор" и т.д. и это будет рентабельно?
     
  24. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    Я напишу айди к ссылающей строке другого таба, где возможно будут 100500 изменений на счет "модыратора":
    Ид_должности / название должности
    --- Добавлено ---
    а с дополнениями и прочими плагинами + 1 еще табл
    ид_юзера / ид_должности
    --- Добавлено ---
    в табе юзера будут only данные юзера
     
  25. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @MouseZver, давай я тебе процитирую себя любимого: