|
|
|
|
|
для: pautina
(24.07.2008 в 16:42)
| | Вы должны делать так, чтобы было удобно пользователю, а не так как вам хорошо. Вы же не хотите, чтобы вас материли?)) Впрочем, дело хозяйское. | |
|
|
|
|
|
|
|
для: sim5
(24.07.2008 в 15:59)
| | Извините, с проверкой на выбор сейчас всё нормально, согласен с Вами, лучше выводить сообщение на страницу один раз для всех ошибок, просто мне там не всё понятно, позднее обязательно ещё подумаю как это реализовать.
И большое Вам спасибо за информацию о том что значение radio хранится в базе, я вообще не по тому пути шёл. | |
|
|
|
|
|
|
|
для: pautina
(24.07.2008 в 12:21)
| | Не надо кода, его тут уже предастаточно, да еще без картинок, а я не люблю читать книжки без картинок.))
А если серьезно, то я так и не понял - что же вы хотите сделать? Если судить по новой созданной вами теме, то вы все пытаесь скрестить ежика со змеей, и зачем вам метры колючей проволоки? Ну скажите мне - зачем вы по поводу каждой ошибки выводите на страницу код с ошибкой да еще со ссылкой на хистори браузера? Ну что за бред?
Я уже устал много говорить, у меня уже мозоль на языке.) Пвоторяю последний раз - забудьте вы весь этот "ужас", который у вас сейчас в коде. Проверяйте все поля формы сразу, по всем условиям нужных вам проверок, и все отчеты об ошибках в одну переменную и ее выводить на страницу один раз для всех ошибок - не мучайте своего пользователя. Далее, сразу после проверки полей, прверяете:
Если переменная ошибок пуста (это значит что нет ошибок ввода), то сейчас и только сечас можно записать полученные данные в базу!!! А у вас что? Если вы делаете так, как это у вас в новой теме, то чему вы удивляетесь, что у вас "проскочила проверка"? | |
|
|
|
|
|
|
|
для: sim5
(24.07.2008 в 11:12)
| | Странно почему то проскочил условие и всё равно зарегистрировал пользователя,
условие должно работать, могу я Вам дать весь код. | |
|
|
|
|
|
|
|
для: pautina
(24.07.2008 в 09:59)
| | $vubor = isset( $_POST['vubor'] ) ? intval($_POST['vubor']) : 0;
Все будет зависить от того, как у вас организованы таблицы. Например, у вас есть таблица юзеров, статус которых определяется как 1 и 2, соответственно продавец и покупатель. Каждый юзер имеет естественно свой id. По этому id связана другая таблица, например, неких предложений. После входа зарегистрированного пользователя, вы считываете и его статус из базы, уставливая в соотвествии ему переменную в сессии, например, $_SESSION['type']. Проверяя эту переменную, вы можете определить, например, для статуса 1 (продавец) разрешено выводить форму для редактирования записей таблицы предложений, но только записй этого юзера, которые определяете по его id. А для статуса 2 (покупатель), эта форма не доступна, и он может только просматривать записи таблицы предложений. Ну и т.п.. Если это примерно так, то вам нужно знать при получении выбора радиокнопки:
1. Если значение равно 0, то выдаем ошибку о невыбранном типе.
2. Если значение меньше 1 или больше 2, то вам кто-то "липу" шлет.
Если же соответствует вашему условию, пишите это значение в таблицу юзеров. Более вам об этих радиокнопках ничего знать и не надо.
То есть, повторяю, все зависит от того, что и как вы делаете. А вообще по базам - как лучше, что и чего, в разделе MySQL. | |
|
|
|
|
|
|
|
для: sim5
(24.07.2008 в 09:42)
| | А Вы ни скажете как записать условие если пользователь не выбрал ничего для radio? | |
|
|
|
|
|
|
|
для: pautina
(24.07.2008 в 09:22)
| | Интересно - как вы вообще в дальнейшем определяете кто продавец, а кто покупатель? Эти значения (1 и 2) пишутся в базу? | |
|
|
|
|
|
|
|
для: sim5
(23.07.2008 в 20:01)
| | Да на самом деле круто. Спасибо Вам за участки кода.
Хотел Вас спросить про условие
В форме есть элемент radio
echo "<CENTER>
<TABLE border = '0' width = '90%' cellpadding = '4' class = 'screen'>
<TR valign = 'top' align = 'left'>
...
<TD>
<input type = 'radio' name = 'vubor' value = '1'>
<font size = '2' face = 'Tahoma'>Продавец</font>
<input type = 'radio' name = 'vubor' value = '2'>
<font size = '2' face = 'Tahoma'>Покупатель</font>
</TD>
...
</TR>
</TABLE>
</CENTER>
<p>";
|
У меня не получается сделать чтобы это условие заработало
$vubor = isset( $_POST['vubor'] ) ? $_POST['vubor'] : 0;
if( $vubor == 1 )
{ регистрация продавца }
else if( $vubor == 2 )
{ регистрация покупателя }
|
В чём может быть ошибка? Как только я описываю if для radio форма регистрации вообще не выводится на странице. | |
|
|
|
|
|
|
|
для: pautina
(23.07.2008 в 12:22)
| | Ну, если вы решили воспользоваться элементами DIV с позиционированием у соответствующих полей формы, то тут сам вывод элементов DIV решается таким образом. Форму ввода и элементы DIV с сообщениями ошибок помещаем в родительский элемент DIV. В стилях (CSS) этому элементу укажем позиционирование как relative, а элементы DIV содержащие сообщения ошибок, будут иметь абсолютное позиционирование. В простейшем случае, это выглядит так:
<style>
#father {position: relative;}
#d_name, #d_login {
position: absolute;
left: 160px;
}
#d_name {top: 0px}
#d_login {top: 24px}
</style>
<div id="father">
<div id="d_name">text</div>
<div id="d_login">text</div>
<form action="">
<input type="text" name="name"><br>
<input type="text" name="login">
</form>
</div>
|
Здесь элемент <div id="father"> является родителем для формы и элементов с сообщениями. При этом, при выводе формы также выводится и переменная $error. Если ошибок нет (она пуста), то будет выведена только форма, если ошибки есть, то будут выведены соответствующие ошибки у соответствующих полей. Вам нужно будет подобрать стили для элементов формы, сообщений и прочее, так, чтобы у поля формы могло поместиться столько сообщений одновременно, сколько это определяется условием проверки. За более подробной информацией по этому поводу лучше в раздел HTML, а здесь будем решать несколько иную задачу, связанную с таким способом вывода.
Если бы мы выводили сообщения "кучей", то можно было бы поступить просто, проверяя значения поля, и при ошибках, мы добавляли бы переменной соответствующее сообщение как:
$error .= "Сообщение 1<br>"
Затем, если на очередном шаге опять ошибка, то
$error .= "Сообщение 2<br>"
и т.д.
|
Затем, обрамили бы эту переменную тегом параграфа, например, и выдали на страницу. Было бы просто, но нам охота "круто".) В этом случае мы не можем так поступить, так как у нас разные поля могут содержать разное количество сообщений, а они должны помещаться в один для них определенный элемент DIV. То есть, мы не можем при каждой ошибке в поле, переменной ошибок добавлять: <div id="d_name">Сообщение 1</div>, <div id="d_name">Сообщение 2</div> и т.д., а должны добавить для поля так: <div id="d_name">Сообщение 1<br>Сообщение 2...</div>.
Можно, конечно, устроить все с помощью условий и прочая, но давайте попробуем написать некий цифровой автомат, который хоть и будет работать по жесткой программе, но достаточно ему изменить значения нескольких переменных, и он будет обрабатывать и выдавать ошибки для различного числа полей, с различным числом сообщений. Во как! )
Собственно задача не так сложна. Здесь только одно условие соблюсти надо, хотя это условие всего лишь для того, чтобы не сбиться, так как эту часть я не автоматизировал.) Хотя, если подумать, то может быть...
И так, в чем заключается это условие - будем проводить проверку полей формы строго по порядку, по всем условиям. Например, если поле имени может содержать два условия проверки - на длину и допустимые символы, следующее поле логина уже три условия (дополнительно - есть ли такой пользователь уже), а все остальные поля по два условия (кроме поля капчи, у него всего одно условие), то проверяем последовательно все, от поля к полю. При этом максимальное число условий у нас будет равно 3, и максимальное число ошибок на поле также равно 3. Это нам нужно будет в дальнейшем, и мы (для неавтоматизированной части) держим в уме, что:
0 - первое условие проверки поля имени
1 - второе условие проверки поля имени
2 - нет условия проверки для поля имени
3 - первое условие проверки поля логина
4 - второе условие проверки поля логина
5 - третье условие проверки поля логина
6 - первое условие проверки поля пароля
7 - второе условие проверки поля пароля
8 - нет условия проверки для поля пароля
и т.д..
Жирным отмечено то, что нам не нужно, и мы будем использовать, для данного в описании примера, только 0, 1, 3 - 7, 9. Для чего это нам нужно будет? Мы не будем при каждой проверке условия писать в переменную сообщение, а вместо этого используем переменную $mask, в которой будем формировать маску ошибок. Установленный бит (равно 1) этой маски укажет нам, что это условие не прошло проверку, и какое сообщение мы будем брать из массива ошибок $mess для этого условия. Как будем формировать маску? В примере я определил, что максимальное число ошибок (условий проверки) для поля равно 3, значит мы отдаем по три бита для ошибок в этой маске на одно поле формы, то есть так:
000.000.000.000
где правый крайний бит маски - младший ее разряд, и правые три крайних бита, это маска определяющая ошибки поля name. Следующим полем идет поле логина, и следующие три бита справа, это биты маски ошибок для поля login. Следующие для пароля, и последние три для капчи.
Если при проверке поля имени, у нас будут ошибки как на длину значения, так и на запрещенные символы, то мы должны установить в маске два крайних бита:
000.000.000.011
И так далее для других полей. При этом третий бит маски поля имени всегда будет сброшен, так как у этого поля всего два условия проверки. Если установленные биты перевести в десятичное значение, то можно заметить, что мы должны будем заносить в маску, при ошибках, следующие значения: 1, 2, 8, 16, 32 и т.д.. То есть 2 в степени N, где N будет равна шагу проверки полей (весу условий), которые я описал выше. То есть, для нашего примера, это будет так: pow(2,0), pow(2,1), pow(2,3), (pow(2,2) у нас отсутствует, так как для поля имени есть "пустое" условие), pow(2,4)... Можно, конечно, непосредственно заносить в маску 1, 2, 8, 16, 32... при проверке, но я использовал такое, а вдруг взбредет в голову и это автоматизировать.;-) Да и легче держать "в уме" вес условия, чем конкретные числа.
И так, переходим к самому автомату:
<?
//Этот массив будет определять id для элементов div,
//но можно использовать и указания класса
$id = array("d_name","d_login","d_pass","d_secr");
//Это массив ошибок
$mess = array(
array("Поле имя должно быть не менее 6 символов!<br>",
"В поле имя разрешается только символы и цифры!"),
array("Поле логин должно быть не менее 10 символов!<br>",
"В поле логин разрешается только латинские символы и цифры!<br>",
"Такой пользователь уже существует!"),
array("Поле пароля должно быть не менее 6 символов!<br>",
"Поля пороля и проверки не совпадают!"),
array("Не верно указан код проверки!"));
$error = ""; //признак ошибки
$mask = 0; //маска ошибок
$n = 3; //макс. число ошибок на поле (условий проверки)
$p = 4; //число проверяемых полей
//Проверяем значение полей и при наличии ошибок
//устанавливаем в маске бит ошибки,
//который соответствует весу условия (ошибки).
//Делаем это с помошью логической битовой операции ИЛИ:
//$mask |= pow(2,М), где М должна соответствовать
//шагу проверки - весу условия.
//Например, при проверке поля логина на длину значения
//вес условия равен 3
if (strlen($login < 10)) $mask |= pow(2,3);
//После выполнения всех условий проверки для всех полей,
//проверяем значение маски ошибок,
//и, если хотя бы один бит ее установлен,
//то начинаем заполнять переменную $error сообщениями
if ($mask) {
for ($i=0; $i<$p; $i++) {
//Формируем маску для проверки,
//сдвигая маску ошибок вправо на младшие разряды
$msk = $mask >> $n * $i;
//Проверяем, если хотя бы один из трех младших битов
//маски установлен, то получаем текст ошибки
if ($msk & 7) {
//Открываем div, получая его соответствующий id для CSS
$error .= "<div id=\"". $id[$i] ."\">";
//Теперь, будем сдвигать единицу влево
//по макс. числу ошибок, сравнивая ее
//по лог. И с маской
for ($k=0; $k<$n; $k++) {
//Если бит маски установлен, то получаем текст ошибки
if ($msk & 1 << $k) $error .= $mess[$i][$k];
}
//Закрываем элемент div
$error .= "</div>\n";
}
}
}
?>
|
После работы нашего "умного автомата"), переменная $error будет содержать соответствующие сообщения. Теперь, проверив, что она не пуста (а в нашем случае теперь удобнее по $mask), выводим форму пользователю, в которой он их и получит. Все.
PS. Договорились написать автомат, а получился полуавтомат.) Дело в том, что запись:
if ($msk & 7)
для автомата не годится. Нам нужно менять только переменные задающие работу автомата, а тут придеться записывать "ручками" новое значение маски, для разного максимального числа условий проверки поля. Исправим это. Если у нас максимальное число условий на поле равно 1, то маска должна быть равна 1. Для 2 условий маска равна 3, для 3 равна 7 и т.д.. То есть, опять тоже самое - 2 в степени N, но за минусом 1. Привязываем это к переменной, которая определяет у нас максимальное число условий на поле - $n. В итоге получаем:
<?
if ($msk & pow(2,$n)-1)
?>
|
| |
|
|
|
|
|
|
|
для: sim5
(23.07.2008 в 11:18)
| | А вы ни скажете как мне вывести сообщение о ошибке поля (<4 символов например для логина) на странице формы,
как описать error
<?php
// логин продавца
if (empty($login_pr)) $error .= "<div class=\"login_pr\"
id=\"login_pr\">Поле логин осталось пустым. Это недопустимо.</div>";
else
if (preg_match('/[^-a-z\d]/i', $login_pr)) $error .= "<div class=\"login_pr\"
id=\"login_pr\">поле логин использует запрещённый символ! Это недопустимо.</div>";
else
if
(strlen($login_pr) < 4) $error .= "<div class=\"login_pr\"
id=\"login_pr\">Поле логин должно содержать не менее 4 символов!</div>";
// Поле логина дожно быть не менее 4 символов
else
if
(strlen($login_pr) > 20) $error .= "<div class=\"login_pr\"
id=\"login_pr\">Поле логин должно содержать не более 20 символов!</div>";
// Поле логина дожно быть не более 20 символов
// else
// if
// ((strlen($login_pr) < 4) or (strlen($login_pr) > 20)) $error .= "div class\"login_pr\" id=\"login_pr\">Поле логина должно содержать не менее 4 и не болеее 20 символов</div>";
?>
|
| |
|
|
| |
|