Начала изучать PHP и в первом же задании столкнулась со сложностью. Нужно создать форму, в которой бы проверялось наличие записи в первых 3-х полях и выдавалась ошибка в случае их незаполнения. Если хотя бы одно поле забито, то соответственно оно остается заполнено. Ошибки не должны выдаваться при первом посещении страницы, то есть до исполнения отправки данных. Я написала следующее PHP: <? if (isset($_POST['nick'])) $nick=$_POST['nick']; else $nick=""; if (isset($_POST['mail'])) $mail=$_POST['mail']; else $mail=""; if (isset($_POST['date'])) $date=$_POST['date']; else $date=""; if (isset($_POST['nick'])) echo ''; else echo 'Ne ukazan nick <br>'; if (isset($_POST['mail'])) echo ''; else echo 'Ne ukazan mail <br>'; if (isset($_POST['date'])) echo ''; else echo 'Ne ukazan data rozdenija <br>'; ?> <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> Nickname: <input type="text" name="nick" value="<?=htmlspecialchars($nick)?>"><br> E-Mail: <input type="text" name="mail" value="<?=htmlspecialchars($mail)?>"><br> Birthday: <input type="text" name="date" value="<?=htmlspecialchars($date)?>"><br> Text: <textarea name="content" rows="10" cols="30"><?=htmlspecialchars($content)?></textarea><br> <input type="submit" value="send"><br></form> </body> </html> Оштбка в том, что во первых ошибки выводятся сразу, а во вторых не выводятся когда нужно... Буду очень признательна за вашу помощь начинающей С уважением Катрин
Нашла одну ошибку, но ошибки все равно выводятся сразу, еще до отправки формы: PHP: <? if (isset($_POST['nick'])) $nick=$_POST['nick']; else $nick=""; if (isset($_POST['mail'])) $mail=$_POST['mail']; else $mail=""; if (isset($_POST['date'])) $date=$_POST['date']; else $date=""; if ($nick==null) echo 'Ne ukazan nick <br>'; else echo ''; if ($mail==null) echo 'Ne ukazan mail <br>'; else echo ''; if ($date==null) echo 'Ne ukazan data rozdenija <br>'; else echo ''; ?> <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> Nickname: <input type="text" name="nick" value="<?=htmlspecialchars($nick)?>"><br> E-Mail: <input type="text" name="mail" value="<?=htmlspecialchars($mail)?>"><br> Birthday: <input type="text" name="date" value="<?=htmlspecialchars($date)?>"><br> Text: <textarea name="content" rows="10" cols="30"><?=htmlspecialchars($content)?></textarea><br> <input type="submit" value="send"><br></form> </body> </html>
Переменные из массива $_POST будут неопределенны при первом вызове, и могут быть определенны, НО пусты, во время обработки (последующий вызов) Кроме того == null и проверка isset() - это одно и то же. В вашем случае, правильней сделать так: PHP: <?php // берем все значения, создаем переменные, и сразу их обрабатываем, или задаем им пустое значение $nick = isset($_POST['nick'])?htmlspecialchars($_POST['nick']):''; $mail = isset($_POST['mail'])?htmlspecialchars($_POST['mail']):''; $date = isset($_POST['date'])?htmlspecialchars($_POST['date']):''; $content = isset($_POST['content'])?htmlspecialchars($_POST['content']):''; if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') // проверка на то, что метод вызова = POST, т.е. получение данных из формы. { // Блок проверок на пустоту значений if (empty($nick)) echo 'Укажите ник!<br/>'; if (empty($mail)) echo 'Укажите почту!<br/>'; if (empty($date)) echo 'Укажите дату!<br/>'; if (empty($content)) echo 'Укажите текст!<br/>'; } // Дальше текст формы ?> <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> Nickname: <input type="text" name="nick" value="<?=$nick?>"><br> E-Mail: <input type="text" name="mail" value="<?=$mail?>"><br> Birthday: <input type="text" name="date" value="<?=$date?>"><br> Text: <textarea name="content" rows="10" cols="30"><?=$content?></textarea><br> <input type="submit" value="send"><br></form> </body> </html>
Потому что у Вас скрипт сначала присваивает несуществующей переменной значение пустой строки, а потом проверяет, является ли она нулем. И это вне зависимости от того, отправлена форма или нет. Поэтому и выдает ошибку. Сделайте проверку "отправлена ли форма?": PHP: if (isset($_POST["submit"])) { //Форма отправлена, проверяем на пустоту. Вставляйте код со строк 2-30 } else { //Форма не отправлена, вставляем код формы, но кнопке sumbit надо дать name="submit" } P.S. null, "" (пустая строка), false - это разные вещи. P.S.S. А почему Вы сразу не сделали так: PHP: if (isset($_POST['date'])) $date=$_POST['date']; else echo 'Ne ukazan data rozdenija <br>'; UPD: Горбунов Олег Вгонишь её в ступор
Ага, я уже разобралась сама Неужели сама нашла все ошибки... Сделала вот так: PHP: <? if (isset($_POST['nick'])) $nick=$_POST['nick']; else $nick=""; if (isset($_POST['mail'])) $mail=$_POST['mail']; else $mail=""; if (isset($_POST['date'])) $date=$_POST['date']; else $date=""; if (isset($_POST['nick'])) { if ($nick == null) { echo 'ne ukazan nick'; } } if (isset($_POST['mail'])) { if ($mail == null) { echo 'ne ukazan mail'; } } if (isset($_POST['date'])) { if ($date == null) { echo 'ne ukazan date'; } } ?> <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> Nickname: <input type="text" name="nick" value="<?=htmlspecialchars($nick)?>"><br> E-Mail: <input type="text" name="mail" value="<?=htmlspecialchars($mail)?>"><br> Birthday: <input type="text" name="date" value="<?=htmlspecialchars($date)?>"><br> Text: <textarea name="content" rows="10" cols="30"><?=htmlspecialchars($content)?></textarea><br> <input type="submit" value="send"><br></form> </body> </html> Но все равно огромное спасибки за помощь...
возможны несколько вариантов: 1. переменная не определена (будет до отправки формы) 2. определена, но пуста (если ничего не ввели в поле и отправили форму) 3. переменная определена и содержит значение (поле заполнили, форму отправили) вот эти возможности и надо предусматривать
все. Теперь все поняла, и поняла почему последний мой код все же заработал... Всем огромное спасибо. Думаю что это будет не последний мой вопрос.
Горбунов Олег Анализировала Ваш код и возник вопрос. Зачем вы используете функцию strtoupper. Она же вроде как выводит маленькие буквы заглавными? Или я что-то путаю. Разве нельзя проверить так? Код (Text): if( ($_SERVER['REQUEST_METHOD'])=='POST')
Да и еще вопрос. Допустим я захотела записать все эти данные в базу данных, но только в том случае если все поля заполнены. Каким образом мне обьеденить условие для заполнение базы? Я имею в виду на базе кода Олега.
PHP: <?php $err=array(); // берем все значения, создаем переменные, и сразу их обрабатываем, или задаем им пустое значение $nick = isset($_POST['nick'])?htmlspecialchars($_POST['nick']):''; $mail = isset($_POST['mail'])?htmlspecialchars($_POST['mail']):''; $date = isset($_POST['date'])?htmlspecialchars($_POST['date']):''; $content = isset($_POST['content'])?htmlspecialchars($_POST['content']):''; if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') // проверка на то, что метод вызова = POST, т.е. получение данных из формы. { // Блок проверок на пустоту значений if (empty($nick)) {echo 'Укажите ник!<br/>'; $err[0]="<b>!</b>";} if (empty($mail)) {echo 'Укажите почту!<br/>'; $err[1]="<b>!</b>";} if (empty($date)) {echo 'Укажите дату!<br/>'; $err[2]="<b>!</b>";} if (empty($content)) {echo 'Укажите текст!<br/>'; $err[3]="<b>!</b>";} } if (empty($err)) { // код записи в базу } else { // Дальше текст формы ?> <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> Nickname: <input type="text" name="nick" value="<?=$nick?>" /><?=$err[0]?><br /> E-Mail: <input type="text" name="mail" value="<?=$mail?>" /><?=$err[1]?><br /> Birthday: <input type="text" name="date" value="<?=$date?>" /><?=$err[2]?><br /> Text: <textarea name="content" rows="10" cols="30"><?=$content?></textarea><?=$err[3]?><br /> <input type="submit" value="send"><br></form> </body> </html> <?}?>
Снова справилась сама, только код очень громоздкий получился... PHP: <? include 'config.php'; include 'russian.php'; $poststable = "posts"; $nick = isset($_POST['nick'])?htmlspecialchars($_POST['nick']):''; $mail = isset($_POST['mail'])?htmlspecialchars($_POST['mail']):''; $date = isset($_POST['date'])?htmlspecialchars($_POST['date']):''; $content = isset($_POST['content'])?htmlspecialchars($_POST['content']):''; if (($_SERVER['REQUEST_METHOD'])=='POST') { if (empty($nick)) { $error="on"; echo ERROR_1 . '<br/>'; } if (empty($mail)) { $error="on"; echo ERROR_2 . '<br/>'; } if (empty($date)) { $error="on"; echo ERROR_3 . '<br/>'; } if (empty($content)) { $error="on"; echo ERROR_4 . '<br/>'; } } if (($_SERVER['REQUEST_METHOD'])=='POST') { if ($error=="on") { include 'form.php'; } else { $query = "INSERT INTO $poststable VALUES('$nick','$mail', '$date', '$content')"; mysql_query($query) or die(mysql_error()); echo "Информация о вас занесена в базу данных."; mysql_close(); } } else include 'form.php'; ?>
Потому что я сравниваю со словом POST набранным заглавными буквами. =) А нет гарантий, что он окажется заранее большими ) Я поужинаю, и покажу как еще проще ЗЫ. Не думайте, это все пойдет в статью, да)
Буду ждать с нетерпением Вашего варианта... Но честно говоря обеспокоена какой-то статьей. Не просвятите меня?
http://nicecode.org PHP: <?php $fields = array('nick','mail','date','content',); $error_text = array('nick'=>'Не указан ник!','mail'=>'Не указан почтовый адрес!','date'=>'Не указана дата!','content'=>'Не указан текст сообщения!',); $values = array(); $errors = array(); if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') // проверка на то, что метод вызова = POST, т.е. получение данных из формы. { foreach ($fields as $field) { if (!empty($_POST[$field])) { $values[$field] = htmlspecialchars($_POST[$field]); } else { $values[$field]=''; $errors[] = $field; } } foreach ($errors as $error) echo $error_text[$error].'<br>'; } // Дальше текст формы ?> <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> Nickname: <input style="background-color:<?=in_array('nick', $errors)?'red':'white'?>" type="text" name="nick" value="<?=$values['nick']?>"><br> E-Mail: <input style="background-color:<?=in_array('mail', $errors)?'red':'white'?>" type="text" name="mail" value="<?=$values['mail']?>"><br> Birthday: <input style="background-color:<?=in_array('date', $errors)?'red':'white'?>" type="text" name="date" value="<?=$values['date']?>"><br> Text: <textarea style="background-color:<?=in_array('content', $errors)?'red':'white'?>" name="content" rows="10" cols="30"><?=$values['content']?></textarea><br> <input type="submit" value="send"><br></form> </body> </html>
Горбунов Олег, выскакивающие нотисы при первом вызове нам не нужны, верно? в твоём варианте либо в форму просится «собака» PHP: <?php Nickname: <input style="background-color:<?=in_array('nick', $errors)?'red':'white'?>" type="text" name="nick" value="<?=@$values['nick']?>"><br> E-Mail: <input style="background-color:<?=in_array('mail', $errors)?'red':'white'?>" type="text" name="mail" value="<?=@$values['mail']?>"><br> Birthday: <input style="background-color:<?=in_array('date', $errors)?'red':'white'?>" type="text" name="date" value="<?=@$values['date']?>"><br> Text: <textarea style="background-color:<?=in_array('content', $errors)?'red':'white'?>" name="content" rows="10" cols="30"><?=@$values['content']?></textarea><br> ?> но мы ведь все типа за «чистый» код либо массив PHP: <?php $fields = array('nick','mail','date','content',); ?> здесь как таковой не нужен, легко замещается на PHP: <?php $values = array('nick'=>'','mail'=>'','date'=>'','content'=>''); ?> таким образом $values[индекс] в форме и при первом одращении имеет значение PHP: <?php $error_text = array('nick'=>'Не указан ник!','mail'=>'Не указан почтовый адрес!','date'=>'Не указана дата!','content'=>'Не указан текст сообщения!',); $values = array('nick'=>'','mail'=>'','date'=>'','content'=>''); $errors = array(); if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') // проверка на то, что метод вызова = POST, т.е. получение данных из формы. { foreach ($values as $field => $val) { if (!empty($_POST[$field])) { $values[$field] = htmlspecialchars($_POST[$field]); } else { $values[$field]=''; $errors[] = $field; } } foreach ($errors as $error) echo $error_text[$error].'<br>'; } // Дальше текст формы ?> <form method="POST" action="<?=$_SERVER['PHP_SELF']?>"> Nickname: <input style="background-color:<?=in_array('nick', $errors)?'red':'white'?>" type="text" name="nick" value="<?=$values['nick']?>"><br> E-Mail: <input style="background-color:<?=in_array('mail', $errors)?'red':'white'?>" type="text" name="mail" value="<?=$values['mail']?>"><br> Birthday: <input style="background-color:<?=in_array('date', $errors)?'red':'white'?>" type="text" name="date" value="<?=$values['date']?>"><br> Text: <textarea style="background-color:<?=in_array('content', $errors)?'red':'white'?>" name="content" rows="10" cols="30"><?=$values['content']?></textarea><br> <input type="submit" value="send"><br></form> </body> </html> В принципе, скрипт достаточно мелок, чтобы думать о его расширяемости и повторном использовании, но почему-то тянет сюда ещё array_map прикрутить…
До чего обычную формочку довели.. Вы ей ещё классы прикрутите.. )) А вообще, шучу, конечно. Очень познавательно, спасибо.
можно неизменяя код, проверять любое количество полей. Т.е. добавить имя поля в массив $fields и текст ошибки - d $error_text и все будет работать верно.
Столкнулась с следующей проблемой. После выполнения отсылки формы, при нажатии refresh форма отсылается заново. Как решить эту проблему? Код (Text): <?php include "avtoriz.php"; include "config.php"; $date=date("Y,m,d,G,i,s"); $category = isset($_POST['category'])?htmlspecialchars($_POST['category']):''; $product = isset($_POST['product'])?htmlspecialchars($_POST['product']):''; $barcode = isset($_POST['barcode'])?htmlspecialchars($_POST['barcode']):''; $cena = isset($_POST['cena'])?htmlspecialchars($_POST['cena']):''; if (($_SERVER['REQUEST_METHOD'])=='POST') { if (empty($category)) { $error="on"; echo ERROR_1 . '<br/>'; } if (empty($product)) { $error="on"; echo ERROR_2 . '<br/>'; } if (empty($barcode)) { $error="on"; echo ERROR_3 . '<br/>'; } if (empty($cena)) { $error="on"; echo ERROR_4 . '<br/>'; } } if (($_SERVER['REQUEST_METHOD'])=='POST') { if ($error=="on") { include 'form.php'; } else { $query = "INSERT INTO kassa VALUES('', '$date' , '$category','$product', '$barcode', '$cena')"; mysql_query($query) or die(mysql_error()); mysql_close(); echo "Информация о вас занесена в базу данных.<br>"; echo "<a href=index.php>Новый ввод</a>"; } } else include 'form.php'; ?>