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

Форум PHP

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

 

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

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

тема: Как вывести несколько сообщений о незаполненности поля?
 
 автор: TrEK   (24.02.2011 в 12:24)   письмо автору
 
 

<?php
..
..
..
if (empty($
1) && empty($2) && empty($3) && empty($4) && empty($5) && empty($6))
{echo 
"Ошибка! Пусто везде!";}
elseif (empty($
1)) {echo "пусто в 1<br>";}
elseif (empty($
2)) {echo "пусто в 2<br>";}
elseif (empty($
3)) {echo "пусто в 3<br>";}
elseif (empty($
4)) {echo "пусто в 4<br>";}
elseif (empty($
5)) {echo "пусто в 5<br>";}
elseif (empty($
6)) {echo "пусто в 6<br>";}
..
..
..
?>


Даный код выполняет следующе:
Если в полях формы не введено нигде ничего вообще, тогда пишет это..
Но если где-либо пропущено еще одно поле.. тогда пишет что пропущено только то, которое самое первое в ходе проверки...
Как сделать , если пропущено 3 и 5 поле формы, чтоб вывело, что пропущено 3 и 5, а не только 3?

  Ответить  
 
 автор: sim5   (24.02.2011 в 12:40)   письмо автору
 
   для: TrEK   (24.02.2011 в 12:24)
 

Это от формы такие значения получены? А поля формы это массив значений, а массив значений это удобно, ибо позволяет все это прописать компактно, без кучи empty и elseif.

  Ответить  
 
 автор: psychomc   (24.02.2011 в 12:51)   письмо автору
 
   для: TrEK   (24.02.2011 в 12:24)
 

не может он ничего выполнять с такими именами переменных

  Ответить  
 
 автор: kvins   (24.02.2011 в 13:01)   письмо автору
 
   для: psychomc   (24.02.2011 в 12:51)
 

а это ответ почему

не может он ничего выполнять с такими именами переменных


Переменные в PHP представляются в виде строки, которая начинается знаком доллара, а за ним следует имя переменной. Имя переменной может состоять из латинских букв, обычных цифр и некоторых символов или комбинаций букв, цифр и символов. Оно чувствительно к регистру и не может начинаться с цифры.

Пример названия переменной:
$4mysite = 'держи курс'; // неправильно: начинается с цифры
$my_site = 'hello'; // правильно: символ "_" допускается
$big4_1 = 'раздел 4.1.'; // правильно: допустимая комбинация

  Ответить  
 
 автор: TrEK   (24.02.2011 в 13:20)   письмо автору
 
   для: psychomc   (24.02.2011 в 12:51)
 

Да заменил я все свои переменные, и все ЕХО на цифры.. чтоб было минимум текста, чтоб максимум читабельность была.
Ну если я спрашиваю о возможности объединения условий - значит условия по отдельности работают.

  Ответить  
 
 автор: kvins   (24.02.2011 в 13:35)   письмо автору
 
   для: TrEK   (24.02.2011 в 13:20)
 

я думаю тут вообще не else if надо а цикл , тогда он пройдется по всему списку и покажет все несоответствия

  Ответить  
 
 автор: TrEK   (24.02.2011 в 13:46)   письмо автору
 
   для: kvins   (24.02.2011 в 13:35)
 

ага...

а как правильно цикл создать?

while .... do ?

или

for i .... do.

  Ответить  
 
 автор: sim5   (24.02.2011 в 13:58)   письмо автору
 
   для: TrEK   (24.02.2011 в 13:20)
 

С чем вы постоянно будете сталкиваться, так это с массивами, а посему разработчики РНР нехилый инструментарий прикрутили к языку своему для работы с ними. Коли речь о полях, значит форма, коли форма значит массив. Значит и надо в этом разделе искать в первую очередь инструменты.

Для чего применяете к переменным trim()? Для того, чтобы убрать пустоты. Задайте себе вопрос, а есть ли среди этого набора функции, которая бы смогла убрать эти пробелы сразу в массиве, не перебирая каждый его элемент циклом, а тем, более не прописывая явно, строка за строкой. То есть, нужна функция, которой можно указать стандартную функцию РНР и массив, элементы которого обработать этой функцией. И такая функция есть - array_map().

Если из вашего массива удалить пустые элементы, то по количеству оставшихся элементов можно было бы судить, пуст ли ваш массив и на сколько.

Можно поступить и обратным способом – наоборот получить пустые элементы массива, и по числу элементов исходного и полученного массива уже ответить на вопрос.

Вычесть пустые элементы из массива проще простого, не прибегая к циклу, и позволяет это сделать функция array_diff(). Но, удобнее поступить вторым способом, так как вы хотите вывести номера пустых элементов массива, то есть лучше получить пустые элементы, и уже по ним принимать решение. И для этого случая есть функция - array_intersect().

Вот собственно и все решение задачи. А если еще из набора функций воспользоваться функцией array_keys() или array_flip(), а потом implode(), то без всяких ifelse и цикла вы выведите информацию вас интересующую.

Попробуйте по этим словам написать код. А для этого достаточно будет в мануал заглянуть, ну приучайте вы себя к этому в конце то концов.

  Ответить  
 
 автор: kvins   (24.02.2011 в 14:24)   письмо автору
 
   для: sim5   (24.02.2011 в 13:58)
 

sim5 спс интересно надо будет поучить

согласен с циклом там бы очень сложно писать , так наверно быстрей и легче. не зря же их придумали для масивов =)

  Ответить  
 
 автор: sim5   (24.02.2011 в 14:34)   письмо автору
 
   для: kvins   (24.02.2011 в 14:24)
 

Почему сложно с циклом, нет, что может быть сложного, прошлись и дело в шляпе. Но зачем это делать, коли существуют готовые функции, которым интерпретировать то ничего не надо будет, как то многочисленные строки условий и прочая.

  Ответить  
 
 автор: cheops   (24.02.2011 в 13:56)   письмо автору
 
   для: TrEK   (24.02.2011 в 12:24)
 

А вы сформируйте массив
<?php
  $error 
= array();
  if(empty($
1)) $error[] = "пусто в 1<br>";
  ...
  if(empty($
6)) $error[] = "пусто в 6<br>";
  
// Если есть ошибки - выводим
  
if(!empty($error))
  {
    for(
$i 0$i count($error); $i++) echo $error[$i];
  }
?>

  Ответить  
 
 автор: TrEK   (24.02.2011 в 15:34)   письмо автору
 
   для: cheops   (24.02.2011 в 13:56)
 

Хорошо, ну а если массив состоит из $to , $from, $name, $message, $sub
Тогда как задать for($i ....

  Ответить  
 
 автор: Trianon   (24.02.2011 в 15:37)   письмо автору
 
   для: TrEK   (24.02.2011 в 15:34)
 

>Хорошо, ну а если массив состоит из $to , $from, $name, $message, $sub
>Тогда как задать for($i ....

тогда циклом будет foreach(...)

  Ответить  
 
 автор: TrEK   (24.02.2011 в 16:02)   письмо автору
 
   для: Trianon   (24.02.2011 в 15:37)
 

Хотя я сделал так :
<?php
  $error 
= array();
  if(empty(
$to)) $error[] = "пусто в to<br>";
  if(empty(
$from)) $error[] = "пусто в from<br>";
  if(empty(
$name)) $error[] = "пусто в name<br>";
  if(empty(
$subj)) $error[] = "пусто в subj<br>";
  if(empty(
$from_to)) $error[] = "пусто в from_to<br>";
  if(empty(
$message)) $error[] = "пусто в message<br>";
  
// Если есть ошибки - выводим
  
if(!empty($error))
  {
    for(
$i 0$i count($error); $i++) echo $error[$i];
  } 
?>

И все работает, все равно надо заменить for( на foreach( ?

  Ответить  
 
 автор: cheops   (24.02.2011 в 17:04)   письмо автору
 
   для: TrEK   (24.02.2011 в 16:02)
 

В таком варианте не обязательно.

  Ответить  
 
 автор: Trianon   (24.02.2011 в 17:29)   письмо автору
 
   для: TrEK   (24.02.2011 в 16:02)
 

нет, необязательно, хотя и можно.
Можно также обойтись вообще без цикла, и даже без if - написав echo implode('', $error);

Просто Вы написали ну а если массив состоит из $to , $from, $name, $message, $sub

Я могу представить это так, что отдельных переменных $to , $from, $name, $message, $sub нет, а вместо них есть массив $fields с ключами to, from, name, message, sub .
И тогда foreach вполне осмысленен:
<?

  $keys 
= array('to''from''name''message''sub');
  foreach(
$keys as $key)  $fields[$key] = @$_GET[$key];

  
$error = array();
  foreach(
$fields as $key => $value)   if(empty($value)) $error[] = "пусто в $key<br>";

  echo 
implode(''$error);

  Ответить  
 
 автор: sim5   (25.02.2011 в 03:12)   письмо автору
 
   для: TrEK   (24.02.2011 в 16:02)
 

То есть все таки "страшно" да? :)
Знаете что плохо в таком подходе? Не в цикле как таковом, а бесполезном расходовании ресурсов, как то создание дополнительного массива со значениями и затрачиваемого времени для его обхода, и чем больше массивы, тем большее расходование русурсов впустую.
А выполнить надо всего то ничего, и менее бескровно. Смотрите как все "шутя" можно сделать стандартными средствами РНР (я пишу точно по тем словам, которые вас видимо испугали;-)):
<?
//пусть это массив входной
$in = array('to'=>'текст  ''from'=>'текст''name'=>' ''subj'=>'   ''from_to'=>'  текст  ''message'=>' ');

//перед использованием данных уберем ненужные пробелы,
//используя для этого функцию trim(), вкупе с функцией array_map(),
//а так как данные могут быть и корректными, и мы сможем их использовать,
//то сделаем эту операцию отдельной, присвоив ее результат входному массиву:
$in array_map('trim'$in); //очистка, начальник очистки Шариков :) 
//проверьте результат с различными комбинациями значений входного массива,
//с помощью var_dump($in), дабы убедиться, 
//что удаляются не только пробелы по краям значений,
//но что самое важное для нас, это то, 
//что "пустые" значения, в мысле состоящие только из пробелов,
//превращаются именно в "пустые", и во вех! элементах массива,
//что важно и как раз нужно для последующей операции

//операция проверки, основана на получении только пустых значений из входного массива,
//с последующим сравнением количества его элементов, с количеством элементов входного
//потенциальные "пустые" значения мы уже ранее превратили в пустые,
//а теперь получим их, если они есть, сранив входной массив
//с массивом пустых значений, то есть вот с таким: array('')
$two array_intersect($in, array('')); //получаем пустые элементы из входного массива
//проверьте, выведя этот массив с помощью print_r($two),
//что в случае наличия пустых элементов во входном массиве,
//массив $two будет содержать эти элементы, 
//и что важно, под теми же ключами, что и во входном массиве,
//что как раз и требуется для вывода результатов

//Последний этап - проверка и вывод результатов:
//если полученный массив пуст, значит пустых значений нет 
if(!$two) echo 'Все заполнено';
//иначе, если число элементов входного и полученного массива совпадают, то все пусто
elseif(count($two)==count($in)) echo 'Все пусто';
//иначе выводим ключи только пустых значений,
//получив их  как массив из массива, и объеденив этот массив в необходимую, для вывода сообщения, строку
else echo 'Пусто в ' implode('<br>Пусто в 'array_keys($two));
А теперь можете запустить в меня кирпичом, если это действительно так сложно.

Знания ваши будут пополняться в процессе работы, но и привычки тоже укореняются в процессе ее, и их зачастую "выковырять" гораздо сложнее, чем получить новые знания. Посему лучше не привыкать к нежелательному сразу, в самом начале.

  Ответить  
 
 автор: cheops   (25.02.2011 в 10:47)   письмо автору
 
   для: sim5   (25.02.2011 в 03:12)
 

>А теперь можете запустить в меня кирпичом, если это действительно так сложно.
Ловите кирпич :))). Массив $error, если нет ошибок даже не возникает, у вас же по меньшей мере 4 вызова функций, две из которых не самые широкоиспользуемые. Описание логики потребовала около 30 строк комментариев - код хитрый. Никогда бы так делать не стал, чтобы потом не тратить время на разбор, пусть лучше будет массив, который видно откуда появляется и обходится циклом, который известен программисту любого уровня.

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

  Ответить  
 
 автор: sim5   (25.02.2011 в 18:41)   письмо автору
 
   для: cheops   (25.02.2011 в 10:47)
 

Ну нет так сильно и в глаз то зачем? :))
Написано много лишь потому, чтобы "разъснить" почему это взято. И в данном случае вообще ничего не создается, лишь массив пустых значений, а не 'to'=>'значение', и для всех остальных то же самое, что во втором случае вообще появляется только при выводе. Ну а вызов функций, так они оптимизированы, думаю. Это благо что мал размер данных, и еще можно столько "дров" заготавливать, но если большой, то какой смысл.
Львиная доля типов данных в специфике веб, это строки и массивы, и я приверженец того, что разделы мануала работы с этими типами данных должны быть священными. )

  Ответить  
 
 автор: cheops   (25.02.2011 в 22:36)   письмо автору
 
   для: sim5   (25.02.2011 в 18:41)
 

>Львиная доля типов данных в специфике веб, это строки и массивы, и я приверженец того, что
>разделы мануала работы с этими типами данных должны быть священными. )
Не претензии ради, а ворчанья для: PHP очень далек от идеала и еще более далек от чего-то святого, сами же видите, что язык на коленке сделан, интерфейсы не продуманы. Собственно половина проблем из-за того, что он провоцирует небрежный код. В качестве священных писаний лучше использовать какие-нибудь другие языки, например, C++ или если нужно поближе к PHP - Python.

  Ответить  
 
 автор: sim5   (25.02.2011 в 22:49)   письмо автору
 
   для: cheops   (25.02.2011 в 22:36)
 

Так я не о языке, а о разделах. )

  Ответить  
 
 автор: Trianon   (25.02.2011 в 23:20)   письмо автору
 
   для: cheops   (25.02.2011 в 22:36)
 

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

Понятно, что грань тонкая. И что под влиянием озарения можно из неочевидных инструментов языка такое кружево понавертеть, что сам через месяц-другой не поймешь. И нужно себя в этом направлении окорачивать иногда почти физически. Но ведь и в аскетизме меру знать надо...

  Ответить  
 
 автор: alexander95   (25.02.2011 в 19:24)   письмо автору
 
   для: TrEK   (24.02.2011 в 12:24)
 

Почему бы не использовать QuickForm?

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

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