Здравствуйте. Пытаюсь передать данные от одной страницы к другой, но проблема в том, что они с первого раза не передаются, то есть заполняю форму на странице test.php нажимаю далее, и меня опять возвращает обратно (срабатывает условие в acc.php). Далее, если заполнить форму ещё раз, то данные нормально передаются, пропускается условие в acc.php и подгружается необходимая мне страница. Подскажите, пожалуйста, решение проблемы? Код test.php PHP: <? session_start(); ?> <h2 align="center">Тест</h2> <div class="tab_f"> <div class="form_a"> Анкетные данные </div> <?php if(isset($_POST['go'])): $e1=null; $name=trim($_POST["name"]); $name=strip_tags($name); // вырезаем теги //конвертируем специальные символы в мнемоники HTML $name=htmlspecialchars($name,ENT_QUOTES); $name=stripslashes($name); if(strlen($name)=="0"): $e1.="Заполните поле 'ФИО'<br>"; endif; $e2=null; $phone=trim($_POST["phone"]); $phone=strip_tags($phone); $phone=htmlspecialchars($phone,ENT_QUOTES); $phone=stripslashes($phone); if(strlen($phone)=="0"): $e2.="Заполните поле 'Телефон'<br>"; elseif((strlen($phone)>0) && (!preg_match("/^[0-9-]+$/",$phone))): $e2.="Неверный формат<br>"; endif; $e3=null; $mail=trim($_POST["mail"]); $mail=strip_tags($mail); $mail=htmlspecialchars($mail,ENT_QUOTES); $mail=stripslashes($mail); if(strlen($mail)=="0"): $e3.="Заполните поле 'E-mail'<br>"; elseif (!filter_var($mail, FILTER_VALIDATE_EMAIL)): $e3.="Неккоректно введен E-mail<br>"; endif; $eEn=$e1.$e2.$e3; if($eEn==null): // выводим уведомление об успехе операции и перезагружаем страничку print "<script language='Javascript' type='text/javascript'> <!-- alert ('Тест состоит из вопросов. Вам необходимо выбрать правильный ответ.'); function reload(){location = '/test/acc.php'}; setTimeout('reload()', 0); --> </script>"; endif; endif; $_SESSION['name'] = htmlspecialchars($_POST['name']); $_SESSION['phone'] = htmlspecialchars($_POST['phone']); $_SESSION['mail'] = htmlspecialchars($_POST['mail']); $_SESSION['voteid'] = htmlspecialchars($_POST['voteid']); ?> <form action="" method="post"> <table style="font-family: tahoma; font-size: 12px; padding: 10px;" width="50%" align="center"> <tr> <td><div align="right">ФИО<font color="red">*</font>: </div></td> <td><input name="name" value="<?=@$name;?>" > <br><span class="error"><?=@$e1;?></span></td> </tr> <tr> <td><div align="right">Телефон<font color="red">*</font>: </div></td> <td><input name="phone" value="<?=@$phone;?>"><br><span class="error"><?=@$e2;?></span></td> </tr> <tr> <td><div align="right">E-mail<font color="red">*</font>: </div></td> <td><input name="mail" value="<?=@$mail;?>"><br><span class="error"><?=@$e3;?></span></td> </tr> <tr> <td><div align="right">Откуда Вы о нас узнали<font color="red">*</font>: </div></td> <td style="font-family: tahoma; font-size: 12px;"> <select name="voteid" size="1"> <option value="" /></option> <option value="Буклеты-визитки " alt="6" />Буклеты-визитки</option> <option value="От знакомых" alt="7" />От знакомых</option></select> </td> </tr> <tr> <td> </td> <td><font color="red">*</font> - поля обязательные для заполнения</td> </tr> </table></div> <input type="hidden" name="go" value="5"><br> <input name="input" type="image" value=" " src="/images/dalee.jpg" alt="Далее" align="right" /> </form> Код acc.php PHP: <? session_start(); if(!isset($_SESSION['name']) || !isset($_SESSION['phone']) || !isset($_SESSION['mail']) || !$_SESSION['voteid']) { header("test/test.php"); exit(); } ?> //далее код с вопросами и ответами
Мне кажется ты здесь не правильно проверяешь, этот знак || вроде означает "ИЛИ" а тебе нужно использовать вроде знак && "И" Да и еще в этом коде очень тяжело ориентироваться. И хочу добавить переделайте код полностью.
Всё, что можно было сделать не так, вы сделали. Для получения и обработки данных из формы используйте filter_input_array. А вот, что бы исключить ошибки логики, купите в магазине книгу и прочитайте пару раз от корки до корки. На одних видеоуроках далеко не уедешь.
вместо этого кода, примерно я бы сделал так: PHP: <?php if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { $checkARGS = [ 'name' => FILTER_SANITIZE_STRING, 'phone' => FILTER_VALIDATE_INT, 'mail' => FILTER_VALIDATE_EMAIL ]; $inputFIELD = filter_input_array( INPUT_POST, $checkARGS ); $error = []; if(!empty($inputFIELD['name'])) { if(!empty($inputFIELD['phone'])) { if (mb_strlen($inputFIELD['phone'], 'UTF-8' ) >= 10) { if(!empty($inputFIELD['mail'])) { if(in_array($error) === true){ $_SESSION['name'] = $inputFIELD['name']; $_SESSION['phone'] = $inputFIELD['phone']; $_SESSION['mail'] = $inputFIELD['mail']; header('Location: /test/acc.php'); exit(); } }else{ $error['mail'] = "Заполните поле 'E-mail'<br>"; //редирект } }else{ $error['phone'] = "Не правильно введен телефон<br>"; //редирект } }else{ $error['phone'] = "Заполните поле 'Телефон'<br>"; //редирект } }else{ $error['name'] = "Заполните поле 'ФИО'<br>"; //редирект } }
@_ne_scaju_, зачем вложенные друг в друга if? Очень сильно бесит когда форма ввода поочерёдно ругается на свои поля. Лучше когда ошибки на полях ввода проверяются все сразу и отображаются клиенту.
всё прекрасно заработало. Спасибо @_ne_scaju_, хоть так и не понял в чем суть поменялась А для тех кто решил поумничать: я понимаю, что Вы себя тут тешите и показываете Вашу состоятельность и значимость, хорошего Вам настроения. Интересно для чего же тогда форумы нужны? P.S. я вообще не php-программист, люди попросили помочь по мелочи поправить чей-то код. В чем смог за короткий срок разобрался.
я с тобой не согласен, если я решил что будет одна ошибка за другой показываться значит так и будет, мне нравиться именно так, пользователи не настолько тупые что не догадаются что нужно заполнить данные правильно, не пропуская поля. А вообще это делаю для того чтобы красивым блоком выводить ошибки ибо этот блок будет на пол страницы если полей дофига.
Ну уж точно не для того, что бы выполнять за кого-то чужую работу бесплатно. Форум - это место где начинающий программист переходя от теории к практическим занятиям и сталкиваясь с какими-либо трудностями, может получить разъяснение некоторых нюансов, и иногда даже готовый код от такого же начинающего программиста, которому необходима некоторая практика для закрепление материала. Люди приходящие на форум с формулировкой вопроса "дайте код" какой бы завуалированной эта формулировка не была, в лучшем случае попадают в платный раздел форума. Так было на 10 лет назад на softtime.ru, так было 5 лет назад на phpforum.su и сильно сомневаюсь, что на php.ru в нынешнее время как-то иначе. --- Добавлено --- ни одному пользователю не интересно как нравиться вам про эргономику сайтов кстати тоже не мало книг написано пользователь заполняя форму, какой бы сложной она не была, не должен нажимать кнопку отправить больше дух раз опять же я не настаиваю, я просто рекомендую, прислушиваться к моим рекомендациям или нет, дело ваше, поверьте мне от этого хуже не станет
Ну так в чем проблема? я и хотел получить как новичок, разъяснение нюансов, или указание ошибок, спасибо человеку подсказал сразу решение. Или всё за последнюю крошку удавиться готовы, не всё в этом мире в коммерческих целях делается
Я еще не дорос до их уровня, но чем смог тем помог, да можно сделать вывод сразу всех ошибок но код чуток измениться: PHP: if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { $checkARGS = [ 'name' => FILTER_SANITIZE_STRING, 'phone' => FILTER_VALIDATE_INT, 'mail' => FILTER_VALIDATE_EMAIL ]; $inputFIELD = filter_input_array( INPUT_POST, $checkARGS ); $error = []; if(empty($inputFIELD['name'])) { $error['name'] = "Заполните поле ФИО"; } if(empty($inputFIELD['phone'])) { $error['phone'] = "Заполните поле Телефон"; } if(empty($inputFIELD['mail'])) { $error['mail'] = "Заполните поле E-mail"; } if(count($error) > 0) { echo implode('<br>', $error); }else{ $_SESSION['name'] = $inputFIELD['name']; $_SESSION['phone'] = $inputFIELD['phone']; $_SESSION['mail'] = $inputFIELD['mail']; header('Location: /test/acc.php'); exit(); } } Как по мне этот код аналогичен, выводит все ошибки сразу. А так не чем не отличается почти. @Valick так тебе нравиться больше? есть люди разные ты один и хочешь чтоб так было, я другой и хочу чтобы по моему было, а так спасибо, может как нибудь перейду на вывод всех ошибок. --- Добавлено --- @Valick Вопрос на засыпку а в MVC разве вывод сразу всех ошибок делаеться, я говорю вообще за любой MVC?
@_ne_scaju_ , я Вам желаю успехов роста в профессиональном плане, и при этом надеюсь Вы останетесь Человеком
@MouseZver Не хочу создавать тему, вопрос: хочу сделать систему ролей на сайте, но так вот как правильно организовать таблицы в бд? 1 таблица users в ней храниться id роли 2 таблица role в ней храниться именованные ролей (админ, юзер, модер и т.д.) я же правильно понимаю? Стоит ли создавать таблицу для хранения 4 полей ролей в бд?
Зачем, разложить всех юзеров по 4м полям отдельной таблицы? Можно одним полем статус в таблице юзеров обойтись.
Иногда для дополнений и прочее всяких плагинов, идут альтернативой как описано выше. В итоге стоит и правильно, создать доп таблицу, а не трогать основной таб лист с юзер данными.
@MouseZver, дело даже не в плагинах, всё гораздо банальнее. @keren, вы не поверите, но существуют правила грамотной организации структуры БД. И самое главное из них "одна сущность - одна таблица". Сущность юзер - таблица юзер, сущность роль - таблица роль. Дальше определяется их отношение. При отношении "многие к одному" (когда множество юзеров могут иметь одну и ту же роль), действительно в таблицу пользователей необходимо добавить поле где будет храниться идентификатор роли, а вся остальная информация в таблице ролей. При отношении "многие ко многим" (когда множество юзеров могут иметь множество ролей (а бывает и такое)) добавляем таблицу связи "идентификатор юзера - идентификатор роли". Далее нормализуем эти таблицы минимум до третьего закона нормализации. И садимся писать код. Как правило огрехи архитектуры БД проявляют себя не сразу, а когда становиться "поздно" и таблица забита данными. И потом начинается сарафанное радио, что MySQL стала узким местом проекта.
@Valick если в своем проекте более не будут добавляться в будущем новые фишки/задумки, то рентабельно сделать это в юзер табе (Other колонка). --- Добавлено --- Я же не просто так тому посту лайк поставил
@MouseZver, вы хотите сказать, что вы у юзера в таблице в отдельной колонке напишите "администратор", "модератор" и т.д. и это будет рентабельно?
Я напишу айди к ссылающей строке другого таба, где возможно будут 100500 изменений на счет "модыратора": Ид_должности / название должности --- Добавлено --- а с дополнениями и прочими плагинами + 1 еще табл ид_юзера / ид_должности --- Добавлено --- в табе юзера будут only данные юзера