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

Форум PHP

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

 

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

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

тема: оператор switch возможно ли такое
 
 автор: Bvz   (31.03.2009 в 00:03)   письмо автору
 
 

возможно ли такое реализовать в операторе 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

  Ответить  
 
 автор: Trianon   (31.03.2009 в 00:14)   письмо автору
 
   для: Bvz   (31.03.2009 в 00:03)
 

После ключевого слова case должна следовать константа .
Смысл оператора switch - это сравнение значения выражения switch с каждой из констант и выбор одной из ветвей выполнения.

  Ответить  
 
 автор: Bvz   (31.03.2009 в 00:28)   письмо автору
 
   для: 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;


вроде заработало ))

  Ответить  
 
 автор: Trianon   (31.03.2009 в 01:03)   письмо автору
 
   для: Bvz   (31.03.2009 в 00:28)
 

корм явно не в коня...

  Ответить  
 
 автор: Bvz   (31.03.2009 в 01:09)   письмо автору
 
   для: Trianon   (31.03.2009 в 01:03)
 

т.е. вы хотите сказать лучше использовать оператор if else?

  Ответить  
 
 автор: Trianon   (31.03.2009 в 08:37)   письмо автору
 
   для: Bvz   (31.03.2009 в 01:09)
 

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

  Ответить  
 
 автор: Bvz   (31.03.2009 в 09:44)   письмо автору
 
   для: 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;
        }


а это можно правильно реализовать?

  Ответить  
 
 автор: Trianon   (31.03.2009 в 09:52)   письмо автору
 
   для: Bvz   (31.03.2009 в 09:44)
 

Я не понимаю смысла этого фрагмента...

  Ответить  
 
 автор: Bvz   (31.03.2009 в 09:59)   письмо автору
 
   для: Trianon   (31.03.2009 в 09:52)
 

через заполненную форму поступают данные, например логин, данный фрагмент, делает
1. проверяет соответветсвует ли логин нужному формату
2. проверяет, чтоб он бы не меньше 2 и не больше 12 символов
3. проверяет наличей этого логина в бд

  Ответить  
 
 автор: Trianon   (31.03.2009 в 10:12)   письмо автору
 
   для: 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 
    
$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;


Заметьте, что одновременно может наличествовать несколько ошибочных ситуаций.

  Ответить  
 
 автор: Bvz   (31.03.2009 в 10:44)   письмо автору
 
   для: 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;


а есть ли оператор или функция, которая прекратила бы проверку при первом встретившимся истинном условии

кстати, а что это за оператор |= ?

  Ответить  
 
 автор: sim5   (31.03.2009 в 10:51)   письмо автору
 
   для: Bvz   (31.03.2009 в 10:44)
 

Смениете порядок, и в if получится. Вам совсем не в этом смысле указали. Если вы так будете выдавать сообщения об ошибках (последовательно), вы замордуете пользователя.
|= - переменной будет присвоено значение после операции логической функции ИЛИ

  Ответить  
 
 автор: Bvz   (31.03.2009 в 11:00)   письмо автору
 
   для: sim5   (31.03.2009 в 10:51)
 

согласен, правильнее будет собрать все ошибки и выдать пользователю сразу )) вышеприведенный пример может это, я и мею ввиду не мой ))
а для чего нужен |=

  Ответить  
 
 автор: sim5   (31.03.2009 в 11:12)   письмо автору
 
   для: Bvz   (31.03.2009 в 11:00)
 

Для того же, что и: +=, -=, ^=, .= и т.п..

  Ответить  
 
 автор: Bvz   (31.03.2009 в 11:21)   письмо автору
 
   для: sim5   (31.03.2009 в 11:12)
 

разобрался, он суммирует все ошибки, тогда напрашивается еще один вопрос, а как разобрать
$_SESSION['login_error_set'], полученную из $_SESSION['login_error_set'] = $login_error_set;
чтоб выдать списком все ошибки?

  Ответить  
 
 автор: sim5   (31.03.2009 в 11:32)   письмо автору
 
   для: Bvz   (31.03.2009 в 11:21)
 

Вообще-то это не суммирование, строго говоря, а соединение по ИЛИ (дизъюнкция).
Поступить как? В вашем случае, мне так кажется, проще формировать переменную содержащую сообщения об ошибках, у вас ведь не так много полей. А можно и формируя маску ошибки, а затем выводить те сообщения, у которой бит маски установлен в 1. Но это когда полей много, или для универсального автомата делается.

  Ответить  
 
 автор: Bvz   (31.03.2009 в 11:50)   письмо автору
 
   для: sim5   (31.03.2009 в 11:32)
 

а можно сделать обратное, т.е. разделение?
мне предложеное выше решение очень понравилось, хотя вариантов$login_error_set; не так уж и много можно сделать и заготовки под каждую.

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

а как это в виде кода будет выглядеть?

а можно все сообщения об ошибке сохранить в массив и потом передать через сессию и потом вывести, я просто не знаю можно ли массив передать таким образом?

  Ответить  
 
 автор: sim5   (31.03.2009 в 12:01)   письмо автору
 
   для: 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. Можно ошибки (сообщения) формировать и передавать как массив для обработки. Это удобно в шаблоне будет, например, для Смарти. Можно и через сессию передать далее такой массив.

  Ответить  
 
 автор: Bvz   (31.03.2009 в 12:32)   письмо автору
 
   для: 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) {
выводим форму и ошибки пользователю
}


возможно я Вас не до конца понимаю, например мне непонятно, что такое
>нужно работать с битами маски
а как массив сформировать ?

  Ответить  
 
 автор: Trianon   (31.03.2009 в 13:30)   письмо автору
 
   для: 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;
}

  Ответить  
 
 автор: Лена   (31.03.2009 в 13:29)   письмо автору
 
   для: sim5   (31.03.2009 в 12:01)
 

>Когда-то я о таком здесь писал, давно, уже не помню где (а может это и приснилось мне :))).
Писали-писали, не приснилось - http://softtime.ru/forum/read.php?id_forum=1&id_theme=55842
Может, автору поста поможет. Я сама на этом примере училась.

  Ответить  
 
 автор: Bvz   (31.03.2009 в 13:39)   письмо автору
 
   для: Лена   (31.03.2009 в 13:29)
 

спасибо!

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

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