Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вывод ошибок в форме
 
 автор: Лена   (28.11.2008 в 00:02)   письмо автору
 
 


<?php
//если форма отправлена и нет ошибок, обрабатываем ее
if (isset($_POST['send'])){
    if(!
$error){
    
$img_alt = isset($_POST['img_alt']) ? $_POST['img_alt'] : 0;
    
$mod = isset($_POST['modul']) ? $_POST['modul'] : 0;
    
$page = isset($_POST['page']) ? $_POST['page'] : 0;
    
$menu = isset($_POST['menu']) ? $_POST['menu'] : 0;
    
        if(!
$mod$error 5;
        if(!
$page$error 6;
        
//вызов функции загрузки текста и картинок, создание уменьшенной копии
    
echo upload($mod,$page$img_alt,$menu);
    }else{
    
//если есть ошибки, формируем массив ошибок
        
$outerror ""
        switch (
$error){
        case 
1$outerror .= "<div class='d_foto' id='d_foto'>Файл картинки не удалось загрузить<br></div>";
        break; 
        case 
2$outerror .= "<div class='d_text' id='d_text'>Текстовый файл не удалось загрузить<br></div>";
        break;
//другие случаи ошибок
        
}
    }
}

if (!isset(
$_POST['send']) || $error){
//выводим форму, напротив каждого поля формы - ошибка если есть
include("upload_img.php");
//выводим ошибки, связанные с загрузкой файлов
print $outerror;
}
?>


В файле формы прописываем место вывода ошибок:

<div id="father"> 
<div id="d_text"></div> 
<div id="d_foto"></div> 
<div id="d_modul"></div>
<div id="d_page"></div>


Делаем стили, чтобы напротив поля формы выводилась ошибка, если она есть:

<style> 
#father {position: relative;} 
#d_text, #d_foto, #d_modul, #d_page { 
  position: absolute; 
  left: 270 px; 

#d_text {top: 35px;} 
#d_foto {top: 70px;} 
#d_modul {top: 234px;} 
#d_page {top: 275px;} 
</style>


Ошибки не выводятся. Что не так?

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

  Ответить  
 
 автор: BinLaden   (28.11.2008 в 00:09)   письмо автору
 
   для: Лена   (28.11.2008 в 00:02)
 

Ммм, а где же определяется $error?

  Ответить  
 
 автор: Лена   (28.11.2008 в 10:25)   письмо автору
5.4 Кб
 
   для: BinLaden   (28.11.2008 в 00:09)
 

$error определяется в 115 строке (см. аттач)

  Ответить  
 
 автор: sim5   (28.11.2008 в 06:42)   письмо автору
 
   для: Лена   (28.11.2008 в 00:02)
 

Вы не внимательно прочитали пример, а в нем описывалась ситуация, когда поле может иметь несколько ошибок. Поэтому в сообщения добавлялся разделитель <br>. У вас одна ошибка на поле, поэтому он совсем не нужен.
Форма у вас выводится сама по себе (include("upload_img.php")), а ошибки сами по себе (print $outerror), а ведь в примере и форма, и элементы DIV ошибок принадлежат одному родителю - элементу DIV id="father".
Что-то у вас несостыковка получается. Нужно, чтобы $outerror получал и обрабатывал файл upload_img.php, и print $outerror совсем не нужен.

PS. В вашем случае можно обойтись без div и стилей позиционирования. Два поля по одной ошибке в каждом, это таблица 2х2, в правых ячейках которой будут отображаться ошибки (при наличии), при этом $outerror отдавать в файл upload_img.php лучше массивом.

PPS. Ваш код никак не сможет передать пользователю ошибки для двух полей, так как ее тип определяется переменной $error, которая может иметь только одно значение. Следовательно, если пользователь допустил ошибки в двух полях формы, то он увидит только второе сообщение.

  Ответить  
 
 автор: Лена   (28.11.2008 в 10:38)   письмо автору
2.7 Кб
 
   для: sim5   (28.11.2008 в 06:42)
 

У меня действительно на поле идет одна ошибка.
Но кроме ошибок заполнения формы у меня есть ошибки, связанные с загрузкой файлов. Вот поэтому я и делаю. так: ошибки, связанные с заполнением формы, я вывожу в самой форме в DIV id="father":

<div id="father"> 
<div id="d_text"></div> 
<div id="d_foto"></div> 
<div id="d_modul"></div>
<div id="d_page"></div>

//вот здесь выводятся все поля формы

</div>


а ошибки, связанные с загрузкой файлов, я вывожу уже в файле, который загружает данные формы в папки и базу.
В форме у меня не два поля - четыре, просто код свой я сократила, форму прикрепляю.
У меня же был вывод ошибок отдельно. По каждой ошибке - отдельный вывод, тогда ясно было видно, что относится к форме, а что к загрузке файлов, вы же сказали выводить массивом. Вывожу. Только теперь не могу разобраться. Если все ошибки - один массив, как же их разграничить, какие относятся к ошибкам формы, а какие - к ошибкам, связаным с загрузкой файлов?
От абсолютного позиционирования, наверное, откажусь. Лучше действительно таблицей выводить.

>PPS. Ваш код никак не сможет передать пользователю ошибки для двух полей,
Вот это я вообще не поняла.

  Ответить  
 
 автор: sim5   (28.11.2008 в 11:18)   письмо автору
 
   для: Лена   (28.11.2008 в 10:38)
 

if(!$mod) $error = 5; 
if(!$page) $error = 6;

То есть, если у вас идет проверка четырех полей (кроме этих двух), то значение переменной $error постоянно переопределяется, и если все поля имеют ошибки, то эта переменная последовательно примет все эти значения, например, от 1 до 4. Но в итоге она будет иметь не четыре состояния, а одно! То есть пользователю будет передано сообщение о последней обнаруженной ошибке. Case извлекет номер ошибки, и выдаст соответствующее сообщение. Понятно почему?
Перед проверкой формы определите переменную ошибок, например: $error = array(). Далее, во время проверки полей, если есть ошибка в поле text, добавляем этому массиву сообщение:
$error['text'] = "Error text!";
Есть ошибка в поле page, добавляем:
$error['page'] = "Error page!";
И так для всех. Теперь, передав этот массив ошибок в скрипт вывода формы, не сложно будет вывести ошибки в нужном месте по ключам.
В примере главное не суть позиционирования, а определение ошибок и передача их пользователю. А как их отобразить, это уже дело второе. Например, у вас во время загрузки файла, например, изображения, может возникать не одна ошибка, а несколько. Например, превышение лимита по размеру, превышение лимита по разрешению, неверный тип файла, и последнее, что файл не загружен. Это 4 ошибки. Если определена первая из них, как вы поступите - вернете пользователю фому с ошибкой? Определили вторую, опять возврат? Ошибки можно проверять комплексно, но по ранжиру. Например, нет необходимости выдавать ошибки о размере и разрешении, если тип файла не соответствует. Нет смысла говорить пользователю, что длина выбранного логина или пароля менее 4 символов, если поле вообще не заполнено, и т.п.. Ну это, думаю, вам понятно.

  Ответить  
 
 автор: Лена   (28.11.2008 в 14:48)   письмо автору
 
   для: sim5   (28.11.2008 в 11:18)
 

>Понятно почему?
Понятно.
В обработчике определяю ошибки:

<?php
$error 
= array();
//если форма отправлена и нет ошибок, обрабатываем ее
if (isset($_POST['send'])){
    
$img_alt = isset($_POST['img_alt']) ? $_POST['img_alt'] : 0;
    
$mod = isset($_POST['modul']) ? $_POST['modul'] : 0;
    
$page = isset($_POST['page']) ? $_POST['page'] : 0;
    
$menu = isset($_POST['menu']) ? $_POST['menu'] : 0;
    
    
$max_img_size 20000000;
    
        if(!
$mod$error['d_modul'] = "<div class='error'>Вы не выбрали нужную папку!</div>";
        if(!
$page$error['d_page'] = "<div class='error'>Выберите страницу!</div>";
        
//вызов функции загрузки текста и картинок, создание уменьшенной копии
    
echo upload($mod,$page$img_alt,$menu); //в функции в соответствующих местах тоже определяю ошибки загрузки файлов
}

if (!isset(
$_POST['send']) || $error){
//форма
include("upload_img.php");
}
?>


В форме вывожу их вот так(привожу пример одного из полей):

    <tr>
    <td>
    Выбрать текст, к которому относится фото:<br>
<input type='file' name='text'><br>
    </td>
<td>
<?php print $error['text'];?>
</td>
</tr>

  Ответить  
 
 автор: sim5   (28.11.2008 в 15:21)   письмо автору
 
   для: Лена   (28.11.2008 в 14:48)
 

Ну если выводить в ячейку таблицы, то div не к чему, ячейка и без них выведет, а стили можно и ячейке указать.
$max_img_size = 20000000. 2 МБ (что по умолчанию на хосте), это будет не 20000000 байт.

  Ответить  
 
 автор: devzorg   (29.11.2008 в 01:15)   письмо автору
 
   для: Лена   (28.11.2008 в 00:02)
 

юзайте jquery validator и будет вам счастье :)

  Ответить  
 
 автор: sim5   (29.11.2008 в 04:22)   письмо автору
 
   для: devzorg   (29.11.2008 в 01:15)
 

При загрузке изображений, от jquery validator проку нет.

  Ответить  
 
 автор: Николай2357   (29.11.2008 в 04:59)   письмо автору
 
   для: sim5   (29.11.2008 в 04:22)
 

Полностью разделяю. От него имхо вообще проку мало. Все тоже самое можно сделать намного легче. Таскать такой груз из-за лени написать пары собственных строчек, какое же это счастье?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования