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

> Сложный фильтр базы данных, Множественная фильтрации
rusline  
 ۩  [x] Дата
Цитировать сообщение

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




Не могу понять как сделать множественную фильтрацию, есть много способов фильтров, по которым пользователь может выбирать. Допустим пример: пользователь хочет видеть все операции по определенному периоду, а также чтобы это был по одному счету и под определенным типом операции(например, расходы).
function addWhere($where, $add, $and=true)
{
if ($where) {
if ($and) $where .= " AND $add";
else $where .= " OR $add";
}
else $where = $add;
return $where;
}
function filter($dateStart, $dateEnd, $typ, $categ, $account, $organ = null)
{
session_start();
$idUser=$_SESSION['id'];
$dateStart= htmlspecialchars($_POST['fromDate']);
$dateEnd= htmlspecialchars($_POST['beforeDate']);
$typ= htmlspecialchars($_POST['filterTyp']);
$categ= htmlspecialchars($_POST['filterCateg']);
$account= htmlspecialchars($_POST['filterAccpunt']);
$organ= htmlspecialchars($_POST['filterOrganiz']);
if (empty($_POST['filter'])) {
if($_POST['fromDate']) $where=addWhere($where, "transactions.data >='$fromDate'");
else $where=addWhere($where, "transactions.data >='".date('Y-m-01')."'");
if($_POST['beforeDate']) $where=addWhere($where, "transactions.data <'$beforeDate'");
if($_POST['filerTyp']) $where=addWhere($where, "transactions.typ = '$typ'");
if($_POST['filerCateg']) $where=addWhere($where, "transactions.category = '$categ'");
if($_POST['filterAccpunt']) $where=addWhere($where, "score.score = '$account'");
if($_POST['filterOrganiz']) $where=addWhere($where, "organization.organization = '$organ'");
$sqlTrans="SELECT transactions.typ, transactions.data, transactions.Sum,transactions.comment, score.score, Categoria.category, subcategory.subcategory, organization.organization
FROM transactions
LEFT JOIN score ON score.idScore = transactions.idScore
LEFT JOIN Categoria ON Categoria.idCateg = transactions.idCateg
LEFT JOIN subcategory ON subcategory.idSubCat = transactions.idSubCat
LEFT JOIN organization ON organization.idOrg = transactions.idOrg
WHERE
transactions.idUser='
$idUser'";
$second=" ORDER BY transactions.data ASC";
if ($where) $sqlTrans .= " $where".$second;
else $sqlTrans .= " ".$second;
$queryTrans=mysql_query($sqlTrans) or die(mysql_error());
$transactions=array();
while($rowTrans = mysql_fetch_array($queryTrans))
{
$transactions[]=$rowTrans;
}
mysql_close();
return $transactions;
}


И где сам клиент делает эту фильтрацию
<div id="controls">
<
form id="form1" method="POST" action="transactions.php">
<!--
Фильтр-->
<?php
$transactions = filter($dateStart, $dateEnd, $typ, $categ, $account, $organ);
print_r($_POST);
?>
<div id="filter">
<
div>
<
input type="submit" name="filter" id="filterButtom" value="Фильтровать">
<
label for="fromDate">От </label><input type="date" name="fromDate" id="fromDate">
<
label for="beforeDate">До </label><input type="date" name="beforeDate" id="beforeDate">
</
div>
<
div id="filterExtended">
<
div id="filterTyp">
<
select name="filterTyp">
<
option selected>Тип операции</option>
<
option value="Доход">Доход</option>
<
option value="Расход">Расход</option>
<
option value="Перевод">Перевод</option>
</
select>
</
div>
<
div>
<
select id="filterCateg" name="filterCateg" class="filterCateg">
<
option selected>Категорию</option>
<?php foreach ($categoria as $categ): ?>
<option value="<?=$categ['idCateg']?>"><?=$categ['category']?></option>
<?php endforeach; ?>
</select>
</
div>
<
select name="filterAccount" id="filterAccount">
<
option selected>
Счет</option>
<?php foreach ($score as $scores): ?>
<option value="<?=$scores['idScore']?>"><?=$scores['score']?></option>
<?php endforeach; ?>
</select>
<
input type="text" name="filterOrganiz" id="filterOrganiz" list="organList" placeholder="Организация">
<
datalist id="organList">
<?php foreach ($organization as $organ): ?>
<option value="<?=$organ['organization']?>"></option>
<?php endforeach; ?>
</datalist>
</
div>
<
div id="dataView">
<?php dateView();?>
</div>
</
div>
<
table cellpadding="2" cellspacing="0" border="0" id="table_id" class="display">
<
thead>
<
tr>
<
th><input type="checkbox" name="cb_all"></th>
<
th>Дата</th>
<
th>Тип</th>
<
th>Счет</th>
<
th>Категория</th>
<
th>Подкатегория</th>
<
th>Организация</th>
<
th>Сумма</th>
<
th>Комментарий</th>
</
tr>
</
thead>
<
tbody>
<?php foreach ($transactions as $transact): ?>
<tr>
<
td><input type="checkbox" name="cb" class ="qwe"></td>
<
td><?=date('d.m', strtotime($transact['data']))?></td>
<
td><?=$transact['typ']?></td>
<
td><?=$transact['score']?></td>
<
td><?=$transact['category']?></td>
<
td><?=$transact['subcategory']?></td>
<
td><?=$transact['organization']?></td>
<
td><?=$transact['Sum']?></td>
<
td><?=$transact['comment']?></td>
</
tr>
<?php endforeach; ?>
</tbody>
</
table>
</
form>
<
script>
allCheckbox()
sorter()
</
script>
</
div>
</
div>
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

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



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

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




	$where = [];
$where[] = isset($_POST['fromDate']) ? "t.data >='$fromDate'" : "t.data >='".date('Y-m-01')."'" ;

switch(key($_POST)){
case 'beforeDate':
$where[] = "t.data <'$beforeDate'";
case 'filerTyp':
$where[] = "t.typ = '$typ'";
case 'filerCateg':
$where[] = "t.category = '$categ'";
case 'filterAccpunt':
$where[] = "score.score = '$account'";
case 'filterOrganiz':
$where[] = "organization.organization = '$organ'";
}

$sqlTrans = "
SELECT
t.typ, t.data, t.Sum, t.comment,
score.score,
Categoria.category,
subcategory.subcategory,
organization.organization
FROM
`transactions` AS t
LEFT JOIN
`score` ON score.idScore = t.idScore
LEFT JOIN
`Categoria` ON Categoria.idCateg = t.idCateg
LEFT JOIN
`subcategory` ON subcategory.idSubCat = t.idSubCat
LEFT JOIN
`organization` ON organization.idOrg = t.idOrg
WHERE
t.idUser='
$idUser' AND
( "
. implode(' OR ', $where) . " )
ORDER BY
t.data ASC
"
;


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

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




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

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




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

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




Вот исходник исходник
в каких случаях применяются key

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

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



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

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




rusline
занимайтесь отладкой .
выводите сформированные запрос, и ошибки mysql

echo '<pre>' . $sqlTrans . '</pre>';
$queryTrans=mysql_query($sqlTrans) or die(mysql_error());
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

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



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15383
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 20 дней
Карма: 470




Цитата (rusline @ 25.12.2016 - 20:51)
У меня почему то с t обычно не идет, так что использовал обычное название таблицы.

Это называется "алиас". И если с ним не идёт, то надо просто разобраться, что именно ты делаешь не правильно. Алиасы - штука полезная. А в некоторых случая без них вообще никак не обойтись.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
rusline  
 ۩  Дата
Цитировать сообщение

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




sergeiss
У меня выводит ошибка
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''transactions' AS t LEFT JOIN score ON score.idScore = t.idScore LEFT JOIN' at line 2
Это если переписать так таблицу, как на примере
Из-за кавычек неработало

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

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




Kusss
У меня выходит такое сообщение, как понимаю, switch надо снести так как он не показывает программе какие данные отображатть?
SELECT transactions.typ, transactions.data, transactions.Sum,transactions.comment, score.score, Categoria.category, subcategory.subcategory, organization.organization
FROM transactions
LEFT JOIN score ON score.idScore = transactions.idScore
LEFT JOIN Categoria ON Categoria.idCateg = transactions.idCateg
LEFT JOIN subcategory ON subcategory.idSubCat = transactions.idSubCat
LEFT JOIN organization ON organization.idOrg = transactions.idOrg
WHERE
transactions.idUser='6' AND
( transactions.data >='2016-12-01' )
ORDER BY transactions.data ASC

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

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



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

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




мда, со swith - это я лапухнулся конечно, не будет такое работать.
сделал вот такую штуку
	$array = [
'beforeDate' => "t.data < 'value'",
'filerTyp' => "t.typ = 'value'",
'filerCateg' => "t.category = 'value'",
'filterAccpunt' => "score.score = 'value'",
'filterOrganiz' => "organization.organization = 'value'",
];

foreach ($_POST AS $key=>$value){
if (array_key_exists($key, $array))
$where[] = str_replace("value" , $value, $array[$key]);
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

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



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

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




	foreach ($_POST AS $key=>$value){
switch($key){
case 'beforeDate':
$where[] = "t.data <'$value'";
break;
case 'filerTyp':
$where[] = "t.typ = '$value'";
break;
case 'filerCateg':
$where[] = "t.category = '$value'";
break;
case 'filterAccpunt':
$where[] = "score.score = '$value'";
break;
case 'filterOrganiz':
$where[] = "organization.organization = '$value'";
break;
}
}

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

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




Kusss
ТАк тоже не работает. Если писать примерно так
$where[] = !empty($_POST['beforeDate']) ? "t.data <'$dateEnd'": "t.data < '".date('Y-m-31')."'";
if(!empty($_POST['filterTyp'])) $where[]="t.typ ='$typ'";
if(!empty($_POST['filterCateg'])) $where[]="t.idCateg ='$categ'";
if(!empty($_POST['filterAccount'])) $where[]="t.idScore ='$account'";
if(!empty($_POST['filterOrganiz'])) $where[]="t.idOrg ='$organ'";


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

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

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



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

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




Цитата (rusline @ 25.12.2016 - 23:42)
ТАк тоже не работает.

Вы что-то не то делаете , я у себя проверил - работает.

Цитата (rusline @ 25.12.2016 - 23:42)
то из селектора все равно приходят данные

они приходят, потому что в массиве по любому есть данные.
$where[] = !empty($_POST['beforeDate']) ? "t.data <'$dateEnd'": "t.data < '".date('Y-m-31')."'";
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
rusline  
 ۩  [x] Дата
Цитировать сообщение

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




Все так примерно работает
$where = [];
$where[] = isset($_POST['fromDate']) ? "t.data >='$dateStart'" : "t.data >= '".date('Y-m-01')."'";
$where[] = isset($_POST['fromDate']) ? "t.data <'$dateEnd'" : "t.data < '".date('Y-m-31')."'";
if(!empty($_POST['filterTyp'])) $where[]="t.typ ='$typ'";
if(!empty($_POST['filterCateg'])) $where[]="t.idCateg ='$categ'";
if(!empty($_POST['filterAccount'])) $where[]="t.idScore ='$account'";
if(!empty($_POST['filterOrganiz'])) $where[]="t.idOrg ='$organ'";

я в sekect добавил value=""; и практически выводит. Но есть еще одна проблема, когда ничего не указываешь, то выводит пустую таблицу
И второй момент, как сделать так чтобы когда сделал фильтрацию по дате, то дальше если я захочу сделать по типу операции, то предыдущий запрос он пропадает и все больше ничего не выводится, потому что даты нет, т.е мне необходимо чтобы она сохраняла запрос и не обнуляло его и всегда помнила его пока сам пользователь не перезагрузит страницу
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
rusline  
 ۩  Дата
Цитировать сообщение

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



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 66
Пользователь №: 43413
На форуме: 9 месяцев, 1 день
Карма:




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

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

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса