SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.01.2012 00:32:53

Bayko
Участник
Зарегистрирован: 25.01.2012
Сообщений: 7

Запрос с условиями

Здравствуйте. Есть такая проблема.
Есть три переменные.
Передаются как параметры полей таблицы БД.
То есть в таблице с приложениями есть столбцы
"совместимость"(цифра) --- "категория"(текст) ----- Юзер(текст+цифры)
Вот. Три переменные передаются в запрос в виде $sovm---$cat---$user соответственно.
Выбор происходит таким образом:
Постоянно есть только 2 из 3 переменных, то есть третья (любая) переменная не объявлена.
Как построить запрос, чтобы, исходя из условия (есть 2 из 3 переменных) происходил корректный выбор из БД?
Подтолкните, в какую сторону копать?
Спасибо.

Неактивен

 

#2 25.01.2012 00:39:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос с условиями

Здравствуйте. Плохо понял ваш сабж, если честно. Приведите пожалуйста конкретную таблицу (с конкретными значениями), и какие переменные (к слову, о какой технологии программирования речь вообще идёт? php? c/c++? функции mysql?) приходят (опять же с конкретным примерами значений) - и то, какой результат Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 25.01.2012 00:48:21

Bayko
Участник
Зарегистрирован: 25.01.2012
Сообщений: 7

Re: Запрос с условиями

Чтобы не углубляться далеко - это фильтр по запросу в адресной строке такого вида:
http//:........&acc=10&sovm=2&cat=Sports     , где соответственно аккаунт юзера = 10, совместимость = 2 и категория = "Спортс". Это что касается запроса.
Все эти параметры принимаются как переменные, описанные выше.
Язык php.
Так вот, объявлены в запрос приходят только 2 из трех переменных. Как мне построить запрос на выбор данных из таблицы с учетом того, что есть только 2 переменные (какие -  не известно, то есть либо $sovm+$cat, либо $cat+$user, либо $sovm+$user)
Пробовал через if isset() - не выбирает. Через !empty() тоже не хочет.
Вот к чему пришел, но не работает (там еще много кода, весь не буду позориться выкладывать)
        $category = JRequest::getWord('cat');
        $sovmest = JRequest::getWord('sovm');
        $accoun = JRequest::getWord('acc');
        if (!empty($category)&&!empty($accoun)){
                        $query = ("SELECT * FROM #__..... WHERE published=1 AND UPPER (category) LIKE '%".$category."%' AND UPPER (account) LIKE '".$accoun."'");
                }
        elseif (!empty($category)&&!empty($sovmest)){
                        $query = ("SELECT * FROM #__..... WHERE published=1 AND UPPER (category) LIKE '%".$category."%' AND sovm = '".$sovmest."'");
                }
        elseif (!empty($sovmest)&&!empty($accoun)){
                        $query = ("SELECT * FROM #__...... WHERE published=1 AND UPPER (account) LIKE '".$accoun."' AND sovm = '".$sovmest."'");
                }
      return $query;

Отредактированно Bayko (25.01.2012 00:49:07)

Неактивен

 

#4 25.01.2012 01:00:56

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос с условиями

Ну, давайте отделим зерна от плевел - то есть стоит два вопроса
1) Как определить, пришёл ли параметр в $_GET-строке
2) Как исходя из параметров построить запрос.

1) Вообще работает такая проверка:
if ( isset($_GET['sovm']) ) { /* здесь могла быть Ваша реклама */ }
else { /* и здесь тоже могла быть Ваша реклама */ }

2) По-моему тут проще запрос по частям склеить. Как-то так:

$query = "SELECT * FROM t WHERE published = 1 ";

if ( isset($_GET['acc']) ) { // acc пришёл через $_GET-строку
$query.=" AND UPPER (account) LIKE '" . $_GET['acc'] . "' ";
}

if ( isset($_GET['sovm']) ) { // sovm пришёл через $_GET-строку
$query.=" AND sovm = '" . $_GET['sovm'] . "' ";
}


и так далее


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 25.01.2012 01:08:54

Bayko
Участник
Зарегистрирован: 25.01.2012
Сообщений: 7

Re: Запрос с условиями

Спасибо за оперативность.
У меня переменные приходят не через ГЕТ, но все равно не в этом дело. А дело в том, что мне как раз нужно вести выборку по двум переменным сразу...
И сразу, соответственно, приходится проверять на существование две переменные. Вот в этой проверке (сразу две штуки) и загвоздка. Не могу придумать, как ее осуществить.
Вложенные почему-то не работают. Вот типа такого:
elseif (isset($accoun)){
            if (isset($sovmest)){
                if ($sovmest == 1) {
                    $query->where( "published = 1 AND sovm = 1 AND UPPER (account) LIKE '".$accoun."'");
                } elseif ($sovmest == 2){
                    $query->where( "published = 1 AND sovm = 2 AND UPPER (account) LIKE '".$accoun."'");
                } elseif ($sovmest == 3){
                    $query->where( "published = 1 AND UPPER (account) LIKE '".$accoun."'");
                }
            }
        }

Отредактированно Bayko (25.01.2012 01:09:38)

Неактивен

 

#6 25.01.2012 01:12:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос с условиями

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

Посмотрите в кишки функции JRequest::getWord('cat'), наверное там есть какой-то критерий того, что функция не вернула значения. Может быть там NULL в этом случае возвращается, тогда проверять надо if ($myvar == NULL).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 25.01.2012 01:23:05

Bayko
Участник
Зарегистрирован: 25.01.2012
Сообщений: 7

Re: Запрос с условиями

Дык переменные приходят исправно, не в этом дело...
Вот запрос с предыдущей страницы, он работает на ура:
        if (isset($accoun)) {
            $query->where( "published = 1 AND UPPER (account) LIKE '".$accoun."'");
        } elseif (isset($sovmest)){
            if ($sovmest == 1) {
            $query->where( 'published = 1 AND sovm = 1');
            } elseif ($sovmest == 2){
            $query->where( 'published = 1 AND sovm = 2');
            } elseif ($sovmest == 3){
            $query->where( 'published = 1 ');
            }
        }elseif (isset($category)){
            $query->where( "published = 1 AND UPPER(category) LIKE '%".$category."%'");
        }
Просто вся загвоздка в том, как проверить на существование сразу двух переменных...

Неактивен

 

#8 25.01.2012 01:30:01

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос с условиями

Ок, тогда проверьте так:

if ( isset( $category ) && isset( $accoun) ) {
    print "category and accoun";
} else if ( isset( $category ) && isset( $sovmest) ) {
    print "category and sovmest";
} else if ( isset( $accoun ) && isset( $sovmest) ) {
    print "accoun and sovmest";
}


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


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 25.01.2012 01:33:28

Bayko
Участник
Зарегистрирован: 25.01.2012
Сообщений: 7

Re: Запрос с условиями

Спасибо. Сейчас и попробую. Отпишусь о результате)

Неактивен

 

#10 25.01.2012 01:39:22

Bayko
Участник
Зарегистрирован: 25.01.2012
Сообщений: 7

Re: Запрос с условиями

Ага. Тут такой прикол вылазит:
category and sovmestcategory and sovmest
То есть выбор проходит хорошо, но выводит сразу по 2 раза. Видимо, поэтому и не ищет по БД...

$accoun = JRequest::getWord('acc');
заменил на
$accoun = JRequest::getVar('acc');
Так лучше
Адресная строка имеет вид: &view=appff&cat=Sports&sovm=2


Закралась шальная мысль: может, этим переменным сначала нулл приписать?

Отредактированно Bayko (25.01.2012 01:41:05)

Неактивен

 

#11 25.01.2012 01:47:56

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос с условиями

Bayko написал:

Ага. Тут такой прикол вылазит:
category and sovmestcategory and sovmest

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

Bayko написал:

То есть выбор проходит хорошо, но выводит сразу по 2 раза. Видимо, поэтому и не ищет по БД...

Говорю же, забудьте пока про БД, разберитесь с переменными сперва.

Bayko написал:

$accoun = JRequest::getWord('acc');
заменил на
$accoun = JRequest::getVar('acc');

К сожалению, мне эти классы и функции ни о чем не говорят, тут Вам виднее smile.

Bayko написал:

Адресная строка имеет вид: &view=appff&cat=Sports&sovm=2

В таком случае должно выводиться category and sovmest. Собственно, оно и вывелось. Разберитесь, почему два раза.

Bayko написал:

Закралась шальная мысль: может, этим переменным сначала нулл приписать?

Не думаю, что это что-то даст, вы Всё равно присваиваете этим переменные значения, которые возвращает getWord или getVar.

Отредактированно deadka (25.01.2012 01:48:46)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#12 25.01.2012 02:37:47

Bayko
Участник
Зарегистрирован: 25.01.2012
Сообщений: 7

Re: Запрос с условиями

Спасибо Вам огромное, что подтолкнули в верном направлении)
Но все же интересно мне, почему выводится 2 раза. Уже весь файл закомментил, оставил только эти строки. И все равно выводит 2 раза...
Если не вызывать эти переменные - вообще никаких нет, так что это только тут происходит...

Неактивен

 

#13 25.01.2012 03:10:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос с условиями

Рад бы подсказать, но не знаю. Однако наша дискуссия вышла за рамки тематики форума wink, этот вопрос уже скорее чисто php-шный, его можно задать в соответствующем разделе на webew.ru или других ресурсах, посвящённых php. А когда вопрос дойдёт до формирования sql-запросов - добро пожаловать обратно в тред smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson