|
|
|
| возможно ли такое реализовать в операторе switch?
case (mysql_fetch_assoc(mysql_query("SELECT login FROM user WHERE login = '$_POST[login]'"))>0):
$_SESSION['login_error'] = 4;
break;
|
в приведенном выше коде неработает ((
выдает ошибку
[31-Mar-2009 00:10:05] PHP Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in S:\home\login\www\registration.php on line 38
|
| |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 00:03)
| | После ключевого слова case должна следовать константа .
Смысл оператора switch - это сравнение значения выражения switch с каждой из констант и выбор одной из ветвей выполнения. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2009 в 00:14)
| | теперь буду знать ))
я все равно решил
вынес запрос за пределы оператора
$login_query =mysql_fetch_assoc(mysql_query("SELECT login FROM user WHERE login='$_POST[login]' "));
|
а потом просто его проверил
case (isset($login_query['login'])):
$_SESSION['login_error'] = 4;
break;
|
вроде заработало )) | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 00:28)
| | корм явно не в коня... | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2009 в 01:03)
| | т.е. вы хотите сказать лучше использовать оператор if else? | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 01:09)
| | Я хочу сказать, что Вы опять написали нечто, не несущее никакой смысловой нагрузки.
После case должна быть константа. А у Вас - выражение, при этом никак не соотносящееся с выражением в заголовке switch. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2009 в 08:37)
| | полностью это так выглядит
$login_query =mysql_fetch_assoc(mysql_query("SELECT login FROM user WHERE login='$_POST[login]' "));
switch ($_POST['login'])
{
case (!preg_match("|^[-0-9a-z_\.]+$|i", $_POST['login'])):
$_SESSION['login_error'] = 2;
break;
case (!preg_match("|^[-0-9a-z_\.]{2,22}$|i", $_POST['login'])):
$_SESSION['login_error'] = 5;
break;
case (isset($login_query['login'])):
$_SESSION['login_error'] = 4;
break;
default:
$_SESSION['login_error'] = 0;
}
|
а это можно правильно реализовать? | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 09:44)
| | Я не понимаю смысла этого фрагмента... | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2009 в 09:52)
| | через заполненную форму поступают данные, например логин, данный фрагмент, делает
1. проверяет соответветсвует ли логин нужному формату
2. проверяет, чтоб он бы не меньше 2 и не больше 12 символов
3. проверяет наличей этого логина в бд | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 09:59)
| | Корректная , на мой взгляд , реализация выглядела бы как-то так:
<?
define('LOGIN_TooSmal', 1);
define('LOGIN_TooBig', 2);
define('LOGIN_InvalidChars', 4);
define('LOGIN_AlreadyRegistered', 8);
$login = $_POST['login'];
$login_error_set = 0;
$llen = strlen($login);
if($llen < 2 )
$login_error_set |= LOGIN_TooSmal;
if($llen > 22)
$login_error_set |= LOGIN_TooBig;
if(!preg_match('|^[-_0-9a-zA-Z\.]*$|'))
$login_error_set |= LOGIN_InvalidChars;
$e_login = mysql_escape_string($login);
if(mysql_result(mysql_query("SELECT COUNT(*) FROM user WHERE login='$e_login' "), 0) !== '0')
$login_error_set |= LOGIN_AlreadyRegistered;
$_SESSION['login_error_set'] = $login_error_set;
|
Заметьте, что одновременно может наличествовать несколько ошибочных ситуаций. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2009 в 10:12)
| | в том то и дело, почему я и прибегнул с switch, т.к. если брать конструкцию if else, то значение ошибки принимает последняя, а не первая, т.е это не работает, вернее некорректно работает.
if (!isset($_POST['login'])) $_SESSION['login_error'] = 1;
if (!preg_match("|^[-0-9a-z_\.]+$|i", $_POST['login'])) $_SESSION['login_error'] = 2;
if (!preg_match("|^[-0-9a-z_\.]{2,22}$|i", $_POST['login'])) $_SESSION['login_error'] = 5;
if (isset($login_query['login'])) $_SESSION['login_error'] = 4;
|
а есть ли оператор или функция, которая прекратила бы проверку при первом встретившимся истинном условии
кстати, а что это за оператор |= ? | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 10:44)
| | Смениете порядок, и в if получится. Вам совсем не в этом смысле указали. Если вы так будете выдавать сообщения об ошибках (последовательно), вы замордуете пользователя.
|= - переменной будет присвоено значение после операции логической функции ИЛИ | |
|
|
|
|
|
|
|
для: sim5
(31.03.2009 в 10:51)
| | согласен, правильнее будет собрать все ошибки и выдать пользователю сразу )) вышеприведенный пример может это, я и мею ввиду не мой ))
а для чего нужен |= | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 11:00)
| | Для того же, что и: +=, -=, ^=, .= и т.п.. | |
|
|
|
|
|
|
|
для: sim5
(31.03.2009 в 11:12)
| | разобрался, он суммирует все ошибки, тогда напрашивается еще один вопрос, а как разобрать
$_SESSION['login_error_set'], полученную из $_SESSION['login_error_set'] = $login_error_set;
чтоб выдать списком все ошибки? | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 11:21)
| | Вообще-то это не суммирование, строго говоря, а соединение по ИЛИ (дизъюнкция).
Поступить как? В вашем случае, мне так кажется, проще формировать переменную содержащую сообщения об ошибках, у вас ведь не так много полей. А можно и формируя маску ошибки, а затем выводить те сообщения, у которой бит маски установлен в 1. Но это когда полей много, или для универсального автомата делается. | |
|
|
|
|
|
|
|
для: sim5
(31.03.2009 в 11:32)
| | а можно сделать обратное, т.е. разделение?
мне предложеное выше решение очень понравилось, хотя вариантов$login_error_set; не так уж и много можно сделать и заготовки под каждую.
>В вашем случае, мне так кажется, проще формировать переменную содержащую сообщения об >ошибках, у вас ведь не так много полей.
а как это в виде кода будет выглядеть?
а можно все сообщения об ошибке сохранить в массив и потом передать через сессию и потом вывести, я просто не знаю можно ли массив передать таким образом? | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 11:50)
| | Если вы произведете логическое ИЛИ над двумя операндами, например, 2 и 5, то вы получите 7. Как вы можете узнать, что это были именно эти опреранды, а не 6 и 1, или 4 и 3?
Нет, в этом случае нужно работать с битами маски, которые будут иметь вес ошибки, который в свою очередь может определять индекс в массиве сообщений об ошибках. Когда-то я о таком здесь писал, давно, уже не помню где (а может это и приснилось мне :))).
$error = "";
if (.....) $error .= "Ошибка 1<br>";
if (.....) $error .= "Ошибка 2<br>";
if (.....) $error .= "Ошибка 3<br>";
if ($error) {
выводим форму и ошибки пользователю
}
PS. Можно ошибки (сообщения) формировать и передавать как массив для обработки. Это удобно в шаблоне будет, например, для Смарти. Можно и через сессию передать далее такой массив. | |
|
|
|
|
|
|
|
для: sim5
(31.03.2009 в 12:01)
| | в нашем случае заданы исходные варианты ошибок
define('LOGIN_TooSmal', 1);
define('LOGIN_TooBig', 2);
define('LOGIN_InvalidChars', 4);
define('LOGIN_AlreadyRegistered', 8);
|
ошибок может быть 1 или 2 и варианты их сочетания следующие, т.е. $login_error_set может быть
1 - меньше 2 корректных символов
2 - больше 22 символов
4 - от 2 до 22 некорректных символов
5 - поле пустое или один некорректный символ
6 - больше 22 некорректных символов
8 - такой пользователь уже существует
|
следовательно выводить ошибки можно предложенным Вами способом
$error = "";
if (.....) $error = "Ошибка 1<br>";
if (.....) $error = "Ошибка 2<br>";
if (.....) $error = "Ошибка 3<br>";
if ($error) {
выводим форму и ошибки пользователю
}
|
возможно я Вас не до конца понимаю, например мне непонятно, что такое
>нужно работать с битами маски
а как массив сформировать ? | |
|
|
|
|
|
|
|
для: Bvz
(31.03.2009 в 12:32)
| |
<?
define('LOGIN_TooSmal', 1);
define('LOGIN_TooBig', 2);
define('LOGIN_InvalidChars', 4);
define('LOGIN_AlreadyRegistered', 8);
$login_msgset = array(
LOGIN_TooSmal => 'Логин короче двух символов',
LOGIN_TooBig => 'Логин длиннее 22 символов',
LOGIN_InvalidChars => 'Логин содержит недопустимые символы',
LOGIN_AlreadyRegistered => 'Логин же используется');
$login_error_set = $_SESSION['login_error_set'];
if($login_error_set )
{
$msg = '';
foreach($login_msgset as $errcode =>$errmsg)
if($login_error_set & $errcode)
$msg .= "<p>$errmsg</p>";
echo $msg;
}
|
| |
|
|
|
|
|
|
|
для: sim5
(31.03.2009 в 12:01)
| | >Когда-то я о таком здесь писал, давно, уже не помню где (а может это и приснилось мне :))).
Писали-писали, не приснилось - http://softtime.ru/forum/read.php?id_forum=1&id_theme=55842
Может, автору поста поможет. Я сама на этом примере училась. | |
|
|
|
|
|
|
|
для: Лена
(31.03.2009 в 13:29)
| | спасибо! | |
|
|
|