Я пытаюсь найти базу данных MYSQL, используя несколько списков распада на моей странице.
Однако в этой функции поиска есть небольшой поворот.
В принципе, мне нужно убедиться, что все критерии (все значения множественного выбора dropdonw) соответствуют элементам, и если они совпадают, то покажите результат!
На данный момент мой код показывает результаты, даже если одно из выпадающих значений соответствует элементам, которые не то, что я пытаюсь сделать.
Это мой код:
$searchList = ""; $clause = " WHERE ";//Initial clause $sql="SELECT * FROM `product_details` INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id";//Query stub if(isset($_POST['keyword']) && !empty($_POST['keyword'])){ foreach($_POST['keyword'] as $c){ if(!empty($c)){ $currentproduct = $_POST['product']; $cat = $_POST['cat']; ##NOPE##$sql .= $clause."`".$c."` LIKE '%{$c}%'"; $sql .= $clause . " (ATTRIBUTES.attr LIKE BINARY '$c') AND ATTRIBUTES.sub_cat_name='$currentproduct'"; $clause = " OR ";//Change to OR after 1st WHERE } } $sql .= " GROUP BY product_details.id"; //print "SQL Query: $sql<br />"; //<-- Debug SQl syntax. // Run query outside of foreach loop so it only runs one time. $query = mysqli_query($db_conx, $sql);
Я даже попытался удалить isset
и сделал if(!empty($_POST['keyword'])){
но я все равно получаю результаты, даже если одно из значений выпадающих списков соответствует учетным данным элементов.
Я не уверен, что я делаю неправильно здесь, поскольку я думал использовать if(!empty($_POST['keyword'])){
должен решить эту проблему, но это не так.
Может ли кто-нибудь проконсультироваться по этому вопросу?
любая помощь будет оценена по достоинству.
EDIT: я изменил CODE на следующий, и он ничего не отображает:
$clause = " WHERE ";//Initial clause $sql="SELECT * FROM `product_details` INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id";//Query stub $currentproduct = $_POST['product']; $cat = $_POST['cat']; if(!empty($_POST['keyword'])){ foreach($_POST['keyword'] as $c){ if(!empty($c)){ ##NOPE##$sql .= $clause."`".$c."` LIKE '%{$c}%'"; $sql .= $clause . " (ATTRIBUTES.attr LIKE BINARY '$c') AND ATTRIBUTES.sub_cat_name='$currentproduct'"; $clause = " AND ";//Change to OR after 1st WHERE } } $sql .= " GROUP BY product_details.id"; //print "SQL Query: $sql<br />"; //<-- Debug SQl syntax. // Run query outside of foreach loop so it only runs one time. $query = mysqli_query($db_conx, $sql); //var_dump($query); //<-- Debug query results. // Check that the query ran fine. if (!$query) { print "ERROR: " . mysqli_error($db_conx); }
$clause = " OR ";//Change to OR after 1st WHERE
Вышеуказанный оператор OR приведет к тому, что критерии выбора записи будут выбраны, даже если 1 ключевое слово соответствует полю attr. Измените его на «И», чтобы ожидать, что все ключевые слова будут применяться.
Кроме того, критерий … AND ATTRIBUTES.sub_cat_name = '$ currentproduct', похоже, применим ко всем ключевым словам, поэтому этот критерий следует добавлять один раз, а не на каждой итерации цикла. $ Currentproduct = $ _POST ['product']; строка также должна перемещаться в петле цикла.
РЕДАКТИРОВАТЬ: отразить изменение имени оператора И и не возвращать строки.
...ATTRIBUTES.attr LIKE BINARY '$c'...
Если в $ c нет никаких подстановочных знаков, то указанный выше критерий потребует, чтобы слово соответствовало полю attr, как если бы использовался = operator, что вряд ли произойдет. В поиск должны быть включены подстановочные знаки: «% $ c%»
Кроме того, некоторая защита от SQL-инъекции также будет приятной.
EDIT2: Если каждый атрибут хранится в собственной записи, это немного усложняет ситуацию, так как критерии, которые оцениваются по одной записи, а не их набор.
Я дам вам команду выбора образца, но вам придется включить ее в свой PHP-код.
select product_details.* FROM product_details INNER JOIN (select product_details.id, count(ATTRIBUTES.id) as total FROM `product_details` INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id WHERE ATTRIBUTES.attr in (...) GROUP BY product_details.id HAVING total=...) as t on t.id=product_details.id
Подзапрос подсчитывает, сколько атрибутов было сопоставлено для продукта, и исключает те, где счетчик не равен количеству параметров, представленных через форму. Внешний запрос получает детали продукта для тех, где счетчик соответствует.
Для … в предложении in () вам нужно предоставить разделенный запятыми «закрытый список ключевых слов, например:« «компьютер», «яблоко» ». Используйте функцию implode () в конкатенации php и sztring для получения результатов.
Для … в предложении having вместо числа ключевых слов в массиве $ _POST ['keyword'] (вы должны проверить код, если это массив или только одно значение).
Тем не менее, вы должны учитывать влияние внедрения sql на ваш код.