Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Динамический фильтр, склейка запроса из $_GET
Igon  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43430
На форуме: 2 месяца, 6 дней
Карма:




Имеется массив, который я получаю с ссылки вида site.com/?cpu=1,2&brand=2,3&ram=2,3 методом $_GET

    array(3) {
["cpu"]=>
string(3) "1,2"
["brand"]=>
string(3) "2,3"
["ram"]=>
string(3) "2,3"
}

Как мне из данного массива склеить запрос следующего содержания?

SELECT * FROM table WHERE cpu=1 OR cpu=2 AND brand=2 OR brand=3 AND ram=2 OR ram=3


Пытался как-то сделать вот так, но видимо имею неправильное представление о реализации.

foreach($request->all() as $name => $value) {
$valuesArray = explode(',', $value);
foreach($valuesArray as $row) {
$sql[] = 'WHERE ' . $name . '=' . $row;
}
}


P.S Делаю динамический фильтр, который выдает найденные позиции запрос у которого генерируется через $_GET
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 5 дней
Карма: 77




// входные данные
$_GET = [
'cpu' => '1,2',
'brand' => '2,3',
'ram' => '2,3',
];


$where = [];
// смотрим только эти значения
$array = ['cpu', 'brand', 'ram'];

foreach ($array AS $value){
if (isset($_GET[$value]) ) {
$_temp = [];
foreach (explode(',', $_GET[$value]) AS $val){
// проверяем что имеем именно число
if (is_numeric($val))
$_temp[] = $val;
}

// Если есть значения
if (count($_temp))
$where[] = '`'. $value .'` IN (' .implode(',', $_temp). ')';
}
}

$where = count($where) ? implode(' AND ', $where) : 1;
echo $where; // `cpu` IN (1,2) AND `brand` IN (2,3) AND `ram` IN (2,3)

кое что исправил

Это сообщение отредактировал Kusss - 11.10.2016 - 00:09
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Igon  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43430
На форуме: 2 месяца, 6 дней
Карма:




Немного обновил вопрос, изначально вопрос составил неправильно.

Имеется массив, который я получаю с ссылки вида site.com/?cpu=1,2&brand=2,3&ram=2,3 методом $_GET

    array(3) {
["cpu"]=>
string(3) "1,2"
["brand"]=>
string(3) "2,3"
["ram"]=>
string(3) "2,3"
}

Как мне из данного массива склеить запрос следующего содержания?
P.S Возможно имею неправильное видение составления запроса, если где то ошибся логикой запроса просьба поправить.


SELECT * FROM table
WHERE slug = cpu AND name = 1 OR slug = cpu AND name = 2
WHERE slug = brand AND name = 2 OR slug = brand AND name = 3
WHERE slug = ram AND name = 2 OR slug = ram AND name = 3



Пытался как-то сделать вот так, но видимо имею неправильное представление о реализации.

foreach($request->all() as $name => $value) {
$valuesArray = explode(',', $value);
foreach($valuesArray as $row) {
$sql[] = 'WHERE ' . $name . '=' . $row;
}
}


P.S Делаю динамический фильтр, который выдает найденные позиции запрос у которого генерируется через $_GET
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 5 дней
Карма: 77




    SELECT * FROM table
WHERE
slug = cpu AND name = 1 OR slug = cpu AND name = 2
WHERE slug = brand AND name = 2 OR slug = brand AND name = 3
WHERE slug = ram AND name = 2 OR slug = ram AND name = 3

таких запросов не существует
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 5 дней
Карма: 77




$where[] = '(`slug` = '. $value .' AND  `name` IN (' .implode(',',  $_temp). ') )';
....

$where = count($where) ? implode(' OR ', $where) : 1;
$sql = "SELECT * FROM table WHERE $where ";
Если не то , то завтра

Это сообщение отредактировал Kusss - 11.10.2016 - 00:19
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Igon  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43430
На форуме: 2 месяца, 6 дней
Карма:




Цитата (Kusss @ 11.10.2016 - 00:01)
// входные данные
$_GET = [
'cpu' => '1,2',
'brand' => '2,3',
'ram' => '2,3',
];


$where = [];
// смотрим только эти значения
$array = ['cpu', 'brand', 'ram'];

foreach ($array AS $value){
if (isset($_GET[$value]) ) {
$_temp = [];
foreach (explode(',', $_GET[$value]) AS $val){
// проверяем что имеем именно число
if (is_numeric($val))
$_temp[] = $val;
}

// Если есть значения
if (count($_temp))
$where[] = '`'. $value .'` IN (' .implode(',', $_temp). ')';
}
}

$where = count($where) ? implode(' AND ', $where) : 1;
echo $where; // `cpu` IN (1,2) AND `brand` IN (2,3) AND `ram` IN (2,3)

кое что исправил

Цитата (Kusss @ 11.10.2016 - 00:01)
// входные данные
$_GET = [
    'cpu' => '1,2',
    'brand' => '2,3',
    'ram' => '2,3',   
];


$where = [];
// смотрим только эти значения
$array = ['cpu', 'brand', 'ram'];

foreach ($array AS $value){
    if (isset($_GET[$value]) ) {
        $_temp = [];
        foreach (explode(',', $_GET[$value]) AS $val){
            // проверяем что имеем именно число
            if (is_numeric($val))
                $_temp[] = $val;
        }
           
        // Если есть значения
        if (count($_temp))
            $where[] = '`'. $value .'` IN (' .implode(',',  $_temp). ')';
    }
}

$where = count($where) ? implode(' AND ', $where) : 1;
echo $where; // `cpu` IN (1,2) AND `brand` IN (2,3) AND `ram` IN (2,3)

кое что исправил

Примерно то что нужно) А можно как то cpu, ram, brand привязать к slug?
Структура таблицы выглядит вот так:
http://clip2net.com/s/3D8TccQ
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Igon  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43430
На форуме: 2 месяца, 6 дней
Карма:




Цитата (Kusss @ 11.10.2016 - 00:18)
$where[] = '(`slug` = '. $value .' AND  `name` IN (' .implode(',',  $_temp). ') )';
....

$where = count($where) ? implode(' OR ', $where) : 1;
$sql = "SELECT * FROM table WHERE $where ";
Если не то , то завтра

Кажется это то что нужно)) Спасибо!!!!
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Igon  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43430
На форуме: 2 месяца, 6 дней
Карма:




Составил такой запрос:
$t = \DB::select('SELECT * FROM attributes_properties WHERE ' . $where);

Выдает такую ошибку:
Column not found: 1054 Unknown column 'cpu' in 'where clause' (SQL: SELECT * FROM attributes_properties WHERE slug = cpu AND id IN (1))

Подскажите как решить?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 5 дней
Карма: 77




$where[] = "(`slug` = '$value' AND  `id` IN (" .implode(',',  $_temp). ") )"
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса