|
vasa_c ↓
|
 |
|
09 Январь, 2008, 12:02:27
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Вопрос: как, после неверного ввода данных в форму, вывести сообщение об ошибке и отобразить форму, в которой остались правильно введенные значения.
Ответ: разберите следующий код
<?php
$selectValues = Array(
0 => '[Выберите что-нибудь]',
1 => 'Раз',
2 => 'Два',
3 => 'Три',
15 => 'Пятнадцать',
);
if ((isSet($_POST['add'])) && (is_array($_POST['add']))) {
$add = $_POST['add'];
$errorMessages = Array();
$add['name'] = isSet($add['name']) ? trim($add['name']) : '';
if (strLen($add['name']) == 0) {
$errorMessages[] = 'Вы не ввели имя';
}
$add['email'] = isSet($add['email']) ? trim($add['email']) : '';
if (strLen($add['email']) == 0) {
$errorMessages[] = 'Вы не ввели e-mail';
} elseif (! preg_match('/^[^\s@]+@[^\s@]+$/', $add['email'])) {
$errorMessages[] = 'e-mail имеет неверный формат';
$add['email'] = '';
}
$add['ta'] = isSet($add['ta']) ? $add['ta'] : '';
if (strLen($add['ta']) > 1000) {
$errorMessages[] = 'Что-то вы слишком много понаписали';
$add['ta'] = '';
}
$add['select'] = isSet($add['select']) ? intVal($add['select']) : 0;
if (! isSet($selectValues[$add['select']])) {
$add['select'] = 0;
}
if ($add['select'] == 0) {
$errorMessages[] = 'Вы ничего не выбрали из селекта';
}
$add['enable'] = isSet($add['enable']);
$add['site'] = isSet($add['site']) ? trim($add['site']) : '';
if (sizeOf($errorMessages) == 0) {
/* Выполнение нужных действий с формой */
header('Location: http://'. $_SERVER['HTTP_HOST']. $_SERVER['REQUEST_URI']);
exit();
}
} else {
$add = Array(
'name' => '',
'email' => '',
'ta' => '',
'select' => 0,
'enable' => false,
'site' => 'http://',
);
}
?>
<html>
<head>
<title>Отправка формы</title>
<meta http-equiv= "content-type" content= "text/html; charset=windows-1251" />
<style type= "text/css">
ul.error {
width: 500px;
border: 2px solid #990000;
background-color: #ffbbbb;
padding-left: 20px;
}
</style>
</head>
<body>
<h1>Отправка формы</h1>
<?php
if (isSet($errorMessages)) {
print '<ul class="error">';
foreach ($errorMessages as $message) {
print '<li>'. $message. '</li>';
}
print "</ul>\r\n";
}
?>
<form method= "post">
<table border= "0">
<tr>
<td>Ваше имя*:</td>
<td><input type= "text" name= "add[name]" value= "<?php print htmlSpecialChars($add['name']); ?>" style= "width:500px" /></td>
</tr>
<tr>
<td>E- mail*:</td>
<td><input type= "text" name= "add[email]" value= "<?php print htmlSpecialChars($add['email']); ?>" style= "width:500px" /></td>
</tr>
<tr valign= "top">
<td>Необязательная писанина:</td>
<td><textarea name= "add[ta]" rows= "5" style= "width:500px"><?php print htmlSpecialChars($add['ta']); ?></textarea></td>
</tr>
<tr>
<td>Выберите что-нибудь*:</td>
<td>
<select name= "add[select]">
<?php
foreach ($selectValues as $value => $text) {
print '<option value="'. $value. '"'. (($value == $add['select']) ? ' selected="selected"' : ''). '>'. $text. "</option>\r\n";
}
?>
</select>
</td>
</tr>
<tr>
<td>Вкл/выкл:</td>
<td><input type= "checkbox" name= "add[enable]" value= "1"<?php if ($add['enable']) print ' checked="checked"'; ?> /></td>
</tr>
<tr>
<td>Сайт:</td>
<td><input type= "text" name= "add[site]" value= "<?php print htmlSpecialChars($add['site']); ?>" style= "width:500px" /></td>
</tr>
<tr>
<td> </td>
<td><input type= "submit" value= "Отправить данные" /></td>
</tr>
</table>
</form>
<p>* — поля обязательны для заполнения.</p>
</body>
</html>
|
|
|
|
« Последнее редактирование: 23 Февраль, 2008, 01:14:23 от vasa_c »
|
Записан
|
|
|
|
|
KENDO ↓
|
 |
|
09 Январь, 2008, 04:14:40 , спустя 4 часа 12 минут 13 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 10
Сообщений: 444 Сила слова: 2.25
|
Я обычно делаю так (прошу прощения, что на своем примере, некогда в Ваш вникать).
примерно такой код обработчика:
<?php
$error= 0;
if (check_login ($_POST['login'])) $check+= 1;
if (check_password ($_POST['password'])) $check+= 2;
if (check_info ($_POST['info'])) $check+= 4;
// и т.д.
// В итоге у нас будет число, где каждый бит означает какую-либо ошибку
?>
а вот это код страницы
<html>
<body>
<form>
<input type= "text" name= "login" <?php print ($check& 1)? ("value='". $_POST['login]."'"):(NULL) ?> />
<input type="text " name="password " <?php print ($check&2)?("value= '".$_POST['password ']."'"):(NULL) ?> />
<textarea name='info'>
<?php print ($check&4)?($_POST['info']):(NULL) ?>
</textarea>
</form>
</body>
</html>
Сделано с помощью тернарных операторов. Конечно, пример корявый получился, но красиво оформлять времени нет... если интересно будет, потом покрасивее пример напиуш ;)
|
|
|
|
« Последнее редактирование: 09 Январь, 2008, 04:20:33 от KENDO »
|
Записан
|
|
|
|
|
adw0rd ↓
|
 |
|
09 Январь, 2008, 05:22:51 , спустя 1 час 8 минут 11 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
эдво
Группа: в ухо Карма: не нужна
Сообщений: 17623 Сила слова: 1.67
|
KENDO, а что за "check_login", "check_password" и т.д.???
|
|
|
|
|
Записан
|
|
|
|
|
adw0rd ↓
|
 |
|
09 Январь, 2008, 05:26:20 , спустя 3 минуты 29 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
эдво
Группа: в ухо Карма: не нужна
Сообщений: 17623 Сила слова: 1.67
|
vasa_c, я примерно также делаю.
Но ИМХО такое:
$add['ta'] = isSet($add['ta']) ? $add['ta'] : '';
if (strLen($add['ta']) > 1000) {
$errorMessages[] = 'Что-то вы слишком много понаписали';
$add['ta'] = '';
}
надо предварительно проверять на JavaScipt (юзабильнее), естественно проверять надо и на стороне серверной части, чтобы всякие умники не подменяли значения.
|
|
|
|
|
Записан
|
|
|
|
|
adw0rd ↓
|
 |
|
09 Январь, 2008, 05:27:40 , спустя 1 минуту 20 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
эдво
Группа: в ухо Карма: не нужна
Сообщений: 17623 Сила слова: 1.67
|
А вот так я не делал еще... Но это мы уже обсуждали :)
if (sizeOf($errorMessages) == 0) {
/* Выполнение нужных действий с формой */
header('Location: http://'. $_SERVER['HTTP_HOST']. $_SERVER['REQUEST_URI']);
exit();
}
|
|
|
|
|
Записан
|
|
|
|
|
KENDO ↓
|
 |
|
10 Январь, 2008, 12:52:03 , спустя 19 часов 24 минуты 23 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 10
Сообщений: 444 Сила слова: 2.25
|
Мне кажется, или пропало сообщение г-на vasa_c? =)
А check_login(), check_passw() - функции, которыми проверяем логин, пароль и сообщение. Впринципе можно было сразу в условии проверять длинну, через регулялку прогонять и т.п., просто писать некогда было :)
Что по поводу ява-скрипта, то согласен сокращает время для пользователей, хотя я уже не раз встречал кривые сайты, где надеются только на яву =)
И еще, можно я немного попридираюсь? =)
$add['ta'] = isSet($add['ta']) ? $add['ta'] : '';
// на мой взгляд корректнее бы было написать вот так:
(! isset($add['ta'])? ($add['ta']= ''): (NULL);
// ибо в Вашем примере просто делается пустая операция - присвоение значения переменной самой себе
|
|
|
|
|
Записан
|
|
|
|
|
vasa_c ↓
|
 |
|
10 Январь, 2008, 12:57:39 , спустя 5 минут 36 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Тернарный оператор, это всё-таки операция имеющая результат и он удобен при вычислении выражений, как простая же замена ифу он несколько кривоват, тогда уж лучше:
if (! isSet($add['ta'])) $add['ta'] = '';
Однако у меня при такой форме в других местах происходит первоначальное приведение к нужному виду (trim, intVal) и для однообразия и здесь оставил такую.
Хотя это не столь существенно.
Что пропало то, куда?
|
|
|
|
|
Записан
|
|
|
|
|
KENDO ↓
|
 |
|
11 Январь, 2008, 01:15:51 , спустя 1 день 18 минут 12 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 10
Сообщений: 444 Сила слова: 2.25
|
По поводу пропажи, прошу прощения. Недопонял =)
|
|
|
|
|
Записан
|
|
|
|
|
Pasha ↓
|
 |
|
11 Январь, 2008, 08:23:29 , спустя 7 часов 7 минут 38 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 7
Сообщений: 1028 Сила слова: 0.68
|
Ну вот мой способ...возможно старый...но проверенный (:
if(! empty($_POST['go'])){
if(strlen($_POST['name']) < 3){
$value_name = '';
$error = '» Вы забыли указать имя имя<br />';
}else{
$value_name = $_POST['name'];
}
if(! preg_match('|([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is', $_POST['email'])){
$value_mail = '';
$error .= '» Вы забыли указать E-mail, или указали его неверно<br />';
}else{
$value_mail = $_POST['email'];
}
if(! preg_match('([0-9])', $_POST['phone'])){
$value_phone = '';
$error .= '» Вы забыли указать телефон, или указали его неверно<br />';
}else{
$value_phone = $_POST['phone'];
}
if(strlen($_POST['text']) < 3){
$value_text = '';
$error .= '» Вы забыли заполнить текст<br />';
}else{
$value_text = $_POST['text'];
}
if(! $error){
$a = 1;
}else{
print 'Допущены ошибки : '. $error. '<br />';
}
}
if(! $a){
print '<form action="contacts.html" method="post"><table width=400 cellpadding="0" cellspacing="0" id="formcontact">
<tr>
<td width="79" height="30" >Имя</td>
<td width="691" style="padding-left:20px"><input type="text" name="name" value="'. $value_name. '" class="inputwhite" ></td>
</tr>
<tr>
<td height="30" >E-mail</td>
<td style="padding-left:20px" ><input type="text" name="email" value="'. $value_mail. '" class="inputwhite" ></td>
</tr>
<tr>
<td height="30" >Телефон</td>
<td style="padding-left:20px" ><input type="text" name="phone" value="'. $value_phone. '" class="inputwhite" ></td>
</tr>
<tr>
<td valign="top" height="150" style="padding: 6px 0px 0px 0px;">Вопрос</td>
<td style="padding: 6px 20px 11px 20px;"><textarea name="text" rows="5" cols="35" class="inputwhite" >'. htmlspecialchars($value_text). '</textarea></td>
</tr>
<tr>
<td height="50" ></td>
<td style="padding-left:20px"><input type="submit" name="go" value="Отправить" style="width:120px" class="button">
<input type="reset" class="button" style="width:120px" value="Очистить" ></td>
</tr>
</table></form>';
}else{
/* Отправляем */
}
|
|
|
|
|
Записан
|
r.i.p. puppy
|
|
|
|
NRG ↓
|
 |
|
11 Январь, 2008, 08:48:40 , спустя 25 минут 11 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Headshot!MultiKill!
Группа: нинзя Карма: 777
Сообщений: 4700 Сила слова: 16.81
|
Лично я придерживаюсь того же мнения, что и adw0rd.
Потому что сам так делаю... =)
Написать джаваскриптовую ф-ию и проверять валидность всех данных у клиента (естессно на сервере тоже проверять).
Просто таким способом чуть уменьшится трафик, а на сервер в основном будут поступать только валидные даныые.
И еще один "минус" выполнения всех проверок сервером, это то, что пользователям с низкоскоросным инетом приходится неизвестно сколько ожидать, а в ответ получить (к примеру) месаг, о том что не совпали введенные им пароли.
т.е. таким простым ходом убиваецо несколько зайцев. =)
|
|
|
|
|
Записан
|
Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть

|
|
|
|
vasa_c ↓
|
 |
|
11 Январь, 2008, 08:51:01 , спустя 2 минуты 21 секунду
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Проверка на JS нисколько не отменяет всего вышесказанного.
Тем более многое на JS по простому не проверишь. Уникальность имени, например.
|
|
|
|
|
Записан
|
|
|
|
|
NRG ↓
|
 |
|
11 Январь, 2008, 09:04:18 , спустя 13 минут 17 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Headshot!MultiKill!
Группа: нинзя Карма: 777
Сообщений: 4700 Сила слова: 16.81
|
Тем более многое на JS по простому не проверишь. Уникальность имени, например.
можно.
в фоновом режиме делать запрос к серверу...
правда это АЯКСом называецо....
но все равно ж JS.
|
|
|
|
|
Записан
|
Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть

|
|
|
|
vasa_c ↓
|
 |
|
11 Январь, 2008, 09:06:51 , спустя 2 минуты 33 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
ключевое словосочетание "по простому".
|
|
|
|
|
Записан
|
|
|
|
|
NRG ↓
|
 |
|
11 Январь, 2008, 09:09:31 , спустя 2 минуты 40 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Headshot!MultiKill!
Группа: нинзя Карма: 777
Сообщений: 4700 Сила слова: 16.81
|
согласен, не слишком просто...
но и не сложно...
|
|
|
|
|
Записан
|
Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть

|
|
|
|
NRG ↓
|
 |
|
11 Январь, 2008, 09:30:06 , спустя 20 минут 35 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Headshot!MultiKill!
Группа: нинзя Карма: 777
Сообщений: 4700 Сила слова: 16.81
|
кстати вот пример регистрации которую использую я.
давно уже хотел выложить , но чето никак руки не доходили...
кому интересно, гляньте...
критика приветствуется. =)
|
my.zip (9.12 Кб - загружено 171 раз.)
|
|
|
Записан
|
Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть

|
|
|
|