|
|
|
|
<?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? | |
|
|
|
|
|
|
|
для: TrEK
(24.02.2011 в 12:24)
| | Это от формы такие значения получены? А поля формы это массив значений, а массив значений это удобно, ибо позволяет все это прописать компактно, без кучи empty и elseif. | |
|
|
|
|
|
|
|
для: TrEK
(24.02.2011 в 12:24)
| | не может он ничего выполнять с такими именами переменных | |
|
|
|
|
|
|
|
для: psychomc
(24.02.2011 в 12:51)
| | а это ответ почему
не может он ничего выполнять с такими именами переменных
Переменные в PHP представляются в виде строки, которая начинается знаком доллара, а за ним следует имя переменной. Имя переменной может состоять из латинских букв, обычных цифр и некоторых символов или комбинаций букв, цифр и символов. Оно чувствительно к регистру и не может начинаться с цифры.
Пример названия переменной:
$4mysite = 'держи курс'; // неправильно: начинается с цифры
$my_site = 'hello'; // правильно: символ "_" допускается
$big4_1 = 'раздел 4.1.'; // правильно: допустимая комбинация | |
|
|
|
|
|
|
|
для: psychomc
(24.02.2011 в 12:51)
| | Да заменил я все свои переменные, и все ЕХО на цифры.. чтоб было минимум текста, чтоб максимум читабельность была.
Ну если я спрашиваю о возможности объединения условий - значит условия по отдельности работают. | |
|
|
|
|
|
|
|
для: TrEK
(24.02.2011 в 13:20)
| | я думаю тут вообще не else if надо а цикл , тогда он пройдется по всему списку и покажет все несоответствия | |
|
|
|
|
|
|
|
для: kvins
(24.02.2011 в 13:35)
| | ага...
а как правильно цикл создать?
while .... do ?
или
for i .... do. | |
|
|
|
|
|
|
|
для: TrEK
(24.02.2011 в 13:20)
| | С чем вы постоянно будете сталкиваться, так это с массивами, а посему разработчики РНР нехилый инструментарий прикрутили к языку своему для работы с ними. Коли речь о полях, значит форма, коли форма значит массив. Значит и надо в этом разделе искать в первую очередь инструменты.
Для чего применяете к переменным trim()? Для того, чтобы убрать пустоты. Задайте себе вопрос, а есть ли среди этого набора функции, которая бы смогла убрать эти пробелы сразу в массиве, не перебирая каждый его элемент циклом, а тем, более не прописывая явно, строка за строкой. То есть, нужна функция, которой можно указать стандартную функцию РНР и массив, элементы которого обработать этой функцией. И такая функция есть - array_map().
Если из вашего массива удалить пустые элементы, то по количеству оставшихся элементов можно было бы судить, пуст ли ваш массив и на сколько.
Можно поступить и обратным способом – наоборот получить пустые элементы массива, и по числу элементов исходного и полученного массива уже ответить на вопрос.
Вычесть пустые элементы из массива проще простого, не прибегая к циклу, и позволяет это сделать функция array_diff(). Но, удобнее поступить вторым способом, так как вы хотите вывести номера пустых элементов массива, то есть лучше получить пустые элементы, и уже по ним принимать решение. И для этого случая есть функция - array_intersect().
Вот собственно и все решение задачи. А если еще из набора функций воспользоваться функцией array_keys() или array_flip(), а потом implode(), то без всяких ifelse и цикла вы выведите информацию вас интересующую.
Попробуйте по этим словам написать код. А для этого достаточно будет в мануал заглянуть, ну приучайте вы себя к этому в конце то концов. | |
|
|
|
|
|
|
|
для: sim5
(24.02.2011 в 13:58)
| | sim5 спс интересно надо будет поучить
согласен с циклом там бы очень сложно писать , так наверно быстрей и легче. не зря же их придумали для масивов =) | |
|
|
|
|
|
|
|
для: kvins
(24.02.2011 в 14:24)
| | Почему сложно с циклом, нет, что может быть сложного, прошлись и дело в шляпе. Но зачем это делать, коли существуют готовые функции, которым интерпретировать то ничего не надо будет, как то многочисленные строки условий и прочая. | |
|
|
|
|
|
|
|
для: 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];
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(24.02.2011 в 13:56)
| | Хорошо, ну а если массив состоит из $to , $from, $name, $message, $sub
Тогда как задать for($i .... | |
|
|
|
|
|
|
|
для: TrEK
(24.02.2011 в 15:34)
| | >Хорошо, ну а если массив состоит из $to , $from, $name, $message, $sub
>Тогда как задать for($i ....
тогда циклом будет foreach(...) | |
|
|
|
|
|
|
|
для: 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( ? | |
|
|
|
|
|
|
|
для: TrEK
(24.02.2011 в 16:02)
| | В таком варианте не обязательно. | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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));
| А теперь можете запустить в меня кирпичом, если это действительно так сложно.
Знания ваши будут пополняться в процессе работы, но и привычки тоже укореняются в процессе ее, и их зачастую "выковырять" гораздо сложнее, чем получить новые знания. Посему лучше не привыкать к нежелательному сразу, в самом начале. | |
|
|
|
|
|
|
|
для: sim5
(25.02.2011 в 03:12)
| | >А теперь можете запустить в меня кирпичом, если это действительно так сложно.
Ловите кирпич :))). Массив $error, если нет ошибок даже не возникает, у вас же по меньшей мере 4 вызова функций, две из которых не самые широкоиспользуемые. Описание логики потребовала около 30 строк комментариев - код хитрый. Никогда бы так делать не стал, чтобы потом не тратить время на разбор, пусть лучше будет массив, который видно откуда появляется и обходится циклом, который известен программисту любого уровня.
>а бесполезном расходовании ресурсов, как то создание дополнительного массива со
>значениями
Вы его тоже создаете, только более неочевидным способом. | |
|
|
|
|
|
|
|
для: cheops
(25.02.2011 в 10:47)
| | Ну нет так сильно и в глаз то зачем? :))
Написано много лишь потому, чтобы "разъснить" почему это взято. И в данном случае вообще ничего не создается, лишь массив пустых значений, а не 'to'=>'значение', и для всех остальных то же самое, что во втором случае вообще появляется только при выводе. Ну а вызов функций, так они оптимизированы, думаю. Это благо что мал размер данных, и еще можно столько "дров" заготавливать, но если большой, то какой смысл.
Львиная доля типов данных в специфике веб, это строки и массивы, и я приверженец того, что разделы мануала работы с этими типами данных должны быть священными. ) | |
|
|
|
|
|
|
|
для: sim5
(25.02.2011 в 18:41)
| | >Львиная доля типов данных в специфике веб, это строки и массивы, и я приверженец того, что
>разделы мануала работы с этими типами данных должны быть священными. )
Не претензии ради, а ворчанья для: PHP очень далек от идеала и еще более далек от чего-то святого, сами же видите, что язык на коленке сделан, интерфейсы не продуманы. Собственно половина проблем из-за того, что он провоцирует небрежный код. В качестве священных писаний лучше использовать какие-нибудь другие языки, например, C++ или если нужно поближе к PHP - Python. | |
|
|
|
|
|
|
|
для: cheops
(25.02.2011 в 22:36)
| | Так я не о языке, а о разделах. ) | |
|
|
|
|
|
|
|
для: cheops
(25.02.2011 в 22:36)
| | Все бы ничего, но ограничивать себя бейсик-подмножеством языка лишь потому, что он продуман неидеально, а рядом предполагается недалекий коллега, это ... своего рода мазохизм чтоли...
Понятно, что грань тонкая. И что под влиянием озарения можно из неочевидных инструментов языка такое кружево понавертеть, что сам через месяц-другой не поймешь. И нужно себя в этом направлении окорачивать иногда почти физически. Но ведь и в аскетизме меру знать надо... | |
|
|
|
|
|
|
|
для: TrEK
(24.02.2011 в 12:24)
| | Почему бы не использовать QuickForm? | |
|
|
|
|