@theroker

Не корректно работает код, поможете?

Суть его работы: есть такой код который фильтрует результат, мол есть результат с тегом "Тег1" то по ссылке "index.php?filter=Тег1" Высветится только он, а нужно чтобы он рботал с несколькими тегами то бишь пишешь "index.php?filter=Тег1-Тег2-Тег3-Тег4 и т. д." то высвечивается результат с этими тегами.

Но он почему-то не работает, сможет кто поправить? Буду благодарен!
Пишу "index.php?filter=Тег1-Тег2" Почему-то не фильтруется `banner` с `country` и c "category_id" а по отдельности всё работает...

Я только учусь, так что если не сложно поправьте код, и скажите что не правильно сделал.

$filter = NULL; 
if(isset($_GET['filter'])){ 
$_GET['filter'] = sanitize($_GET['filter']); 

if(preg_match('#[0-9]#',$_GET['filter'])) $filter = "AND `banner` = '" . $_GET['filter'] . "'"; 
elseif(strlen($_GET['filter']) == 2) $filter = "AND `country` = '" . $_GET['filter'] . "'"; 
else { 
$arr = array_map(function($v){return str_replace("'", "", $v);}, explode('-', $_GET['filter']));
$names = implode("' , '", $arr);
$filter = "AND `category_id` in (SELECT `category_id` FROM `categories` WHERE `name` IN ('$names'))";
} 
}


Пример:
index.php?filter=1.5.2 - это banner
index.php?filter=RU - это country
index.php?filter=Тег1-Тег2 - это список тэгов

Как по сути должно работать:
index.php?filter=1.5.2-RU
index.php?filter=Тег1-RU-1.5.2
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 3
@Arik
Нужно разные переменные использовать или собирать очень сложные значения, потом их парсить/разбирать по частям.
Сейчас у вас тут может работать что-то только одно
Ответ написан
sanek_os9
@sanek_os9
Работаю с Laravel, Vue, Vuetify, AWS Amazon, Linux
$_GET['filter'] = '1.5.2'; # AND `banner` = '1.5.2'
$_GET['filter'] = 'RU'; # AND `country` = 'RU'
$_GET['filter'] = 'Тег-Тег'; #AND `category_id` in (SELECT `category_id` FROM `categories` WHERE `name` IN ('Тег' , 'Тег'))
$_GET['filter'] = '1.5.2_RU_Тег-Тег'; # AND `banner` = '1.5.2' AND `country` = 'RU' AND `category_id` in (SELECT `category_id` FROM `categories` WHERE `name` IN ('Тег' , 'Тег'))
$_GET['filter'] = '1.5.2_RU'; # AND `banner` = '1.5.2' AND `country` = 'RU'

$sql = [];
if(isset($_GET['filter'])) {
    $filter = sanitize($_GET['filter']); 
    $filter = explode('_', $filter);

    for ($i = 0; $i < count($filter); $i++) {
        if (preg_match('#^[0-9|\.]+$#', $filter[$i]))
            $sql[] = "AND `banner` = '{$filter[$i]}'"; 
        elseif (preg_match('#^[A-Z]{2}$#', $filter[$i]))
            $sql[] = "AND `country` = '{$filter[$i]}'"; 
        else {
            $tags = array_map(function($v) {
                return str_replace("'", "", $v);
            }, explode('-', $filter[$i]));
            $names = implode("' , '", $tags);
            $sql[] = "AND `category_id` in (SELECT `category_id` FROM `categories` WHERE `name` IN ('{$names}'))";
        }
    }
}
$sql = implode(' ', $sql);
echo $sql; // это пихать в запрос к БД

Вверху определены $_GET['filter'], это примеры запросов и их результат
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега PHP
♬♬
Для фильтрации ввода хорошо использовать функцию filter_input().
Для работы с БД использовать PDO.

$param = filter_input(INPUT_GET, 'filter', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
$filters = explode('-', $param);

$banner = $country = NULL;
$tags = [];

if( count($filters)) {
	foreach($filters AS $filter) {
		if( preg_match('/^[0-9\.]+$/', $filter)) { // 1.5.9
			$banner = $filter;
		} elseif( preg_match('/^(RU|EN)$/', $filter) { //  RU
			$country = $filter;
		} else { // tag
			array_push($tags, $filter);
		}
	}
}

$conditions = [];
$params = [];
if($banner) {
	array_push($conditions, "`banner` = ?");
	array_push($params, $banner);
}

if($country) {
	array_push($conditions, "`country` = ?");
	array_push($params, $country);
}

if(count($tags)) {
	foreach($tags AS $tag) array_push($params, $tag);
	
	array_push($conditions, sprintf(
		"`category_id` IN (SELECT `category_id` FROM `categories` WHERE `name` IN (%s)",
		implode(',', str_split( str_repeat('?', count($tags))))
	));
}

$query = 'SELECT * FROM sometable';
if( count($conditions)) $query = $query . ' WHERE ' . implode(' AND ', $conditions);

$stmt = $dbh->prepare($query);
if( $stmt->execute($params)) {
	while ($row = $stmt->fetch()) {
		print_r($row);
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 12:23
2500 руб./за проект
25 апр. 2024, в 12:21
10000 руб./за проект