2017-02-09 6 views
0

В настоящее время у меня есть системный набор, который отображает продукты из базы данных на основе того, какие фильтры установлены на панели управления.Looping пользовательские фильтры для вытаскивания продуктов MYSQL

Это петли, как это:

1. Begin loop 
2. Pick Filter 
3. Search product database for product matching the filter AND search term 
4. Return a table row of products matching these terms 
5. End Loop 

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

Мой вопрос: есть ли меньший способ писать в каком-либо массиве фильтров в один оператор mysql? как это:

SELECT FROM products Where A line matches one of the array of filters AND search term? 

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

В настоящее время используется этот код. Если кто-то может предложить какие-либо предложения относительно того, как лучший способ сделать это, я все уши.

//connect and fetch all entries from the filter table 

$filterproducts = $dbh->prepare("SELECT * FROM table_filter_selection ORDER BY filter ASC"); 
$filterproducts->execute(); 
$filterselect = $filterproducts->fetchAll(); 
//for each entry found loop through a second loop 

foreach($filterselect as $rows){ 
$wildcard = "%" . $rows['filter'] . "%"; 
//make a variable into a regex of the row 

$query = "PRODUCT_NAME LIKE '%" . implode("%' AND PRODUCT_NAME LIKE '%", $breakdown) . "%'"; 
$sqlstring= "SELECT * FROM product_list WHERE PRODUCT_NAME LIKE :filterfind AND " . $query; 
$searchproducts = $dbh->prepare($sqlstring); 
$searchproducts->bindParam(":filterfind", $wildcard, PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$searchproducts->execute(); 

//search for all products that match the wildcard AND the current filter 

foreach($searchproducts as $rows2){ 

//for every one found, make a row. 
echo "<tr><td>" . $rows2['SKU'] ." <strong style='font-style: italic;'>". $rows2['COMMENTS'] . "</strong><td/><td>". $rows2['PRODUCT_NAME'] ."</td><td>". $rows2['QTY'] . "</td></tr>"; 
    } 
} 

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

+0

Ну, вы можете начать с того, чтобы показать нам, как выглядит ваш код. Трудно сказать, что есть лучший способ сделать что-то, иначе. –

+0

Вы можете попробовать «где в»: выберите * из таблицы, где id в (1,2,3,4); – rescobar

+0

Я добавил код, как было задано. У меня не было времени раньше, так как я был в спешке. Для этого @MagnusEriksson –

ответ

0

сохранить фильтры в массиве. затем используйте цикл, чтобы сделать sql stament. например:

$query= "SELECT * FROM products "; 
$filters= 'Where '; //Sets a varible for fileters. 
foreach($filters as $key=$value) //Loop threw each filter 
{ 
    $filters.= $key . '= ' . $value . 'AND '; 
} 
rtrim('AND '); //Remove extra 'AND' from end of filters string 
$query.= $filters; 

Теперь вам нужно будет отрегулировать код в зависимости от того, как хранятся ваши фильтры. и rtrim() может потребоваться tweeking.

Смежные вопросы