Пыха всегда с тобой

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 24 Май, 2012, 10:13:52

Страниц: [1]
Печать
Автор Тема: Сохранение введенных полей формы  (Прочитано 6857 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vasa_c    ↓ 
09 Январь, 2008, 12:02:27
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

Вопрос: как, после неверного ввода данных в форму, вывести сообщение об ошибке и отобразить форму, в которой остались правильно введенные значения.
Ответ: разберите следующий код
 
PHP

<?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

примерно такой код обработчика:
<?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" и т.д.???
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
adw0rd    ↓ 
09 Январь, 2008, 05:26:20 , спустя 3 минуты 29 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17623
Сила слова: 1.67

vasa_c, я примерно также делаю.
 
Но ИМХО такое:
 
PHP
    $add['ta'] = isSet($add['ta']) ? $add['ta'] : '';
    if (strLen($add['ta']) > 1000) {
        $errorMessages[] = 'Что-то вы слишком много понаписали';
        $add['ta'] = '';
    }

надо предварительно проверять на JavaScipt (юзабильнее), естественно проверять надо и на стороне серверной части, чтобы всякие умники не подменяли значения.
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
adw0rd    ↓ 
09 Январь, 2008, 05:27:40 , спустя 1 минуту 20 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17623
Сила слова: 1.67

А вот так я не делал еще... Но это мы уже обсуждали :)
 
PHP
    if (sizeOf($errorMessages) == 0) {
        /* Выполнение нужных действий с формой */
        header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
        exit();
    }
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
KENDO    ↓ 
10 Январь, 2008, 12:52:03 , спустя 19 часов 24 минуты 23 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 10
Сообщений: 444
Сила слова: 2.25

Мне кажется, или пропало сообщение г-на vasa_c? =)
А check_login(), check_passw() - функции, которыми проверяем логин, пароль и сообщение. Впринципе можно было сразу в условии проверять длинну, через регулялку прогонять и т.п., просто писать некогда было :)
Что по поводу ява-скрипта, то согласен сокращает время для пользователей, хотя я уже не раз встречал кривые сайты, где надеются только на яву =)
И еще, можно я немного попридираюсь? =)
PHP

$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

Тернарный оператор, это всё-таки операция имеющая результат и он удобен при вычислении выражений, как простая же замена ифу он несколько кривоват, тогда уж лучше:
PHP
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

Ну вот мой способ...возможно старый...но проверенный (:
 
PHP
if(!empty($_POST['go'])){
 

if(strlen($_POST['name']) < 3){
 $value_name = '';
 $error = '&raquo; Вы забыли указать имя имя<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 .= '&raquo; Вы забыли указать E-mail, или указали его неверно<br />';
  }else{
  $value_mail = $_POST['email'];
  }
 
if(!preg_match('([0-9])',$_POST['phone'])){
 $value_phone = '';
 $error .= '&raquo; Вы забыли указать телефон, или указали его неверно<br />';
 }else{
 $value_phone = $_POST['phone'];
 }
 
if(strlen($_POST['text']) < 3){
 $value_text = '';
 $error .= '&raquo; Вы забыли заполнить текст<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">
 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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 это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть
Страниц: [1]
Печать
 

Перейти в: