[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите автоматизировать запрос
Lightt
Проблема такая... есть форма для запроса,
user posted image
по отдельности они в принципе работают.. но столкнулся с проблемой, запрос получается очень грамоздкий... я в нем путаюсь, и не совсем правильно работает...

Т.е. чтоб вывести текущие поручения, у меня вот такой запрос -

if 
($_POST['orders']=="flowing") //текущие поручения-----------------------
{
$Query = mysql_query($tQuery. ' WHERE Result LIKE ""'); //вывод текущих поручений
while ($all_order[] = mysql_fetch_assoc($Query)) {}
}

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

if  (($_POST['clien']=="avtor") AND ($_POST['orders']=="flowing")) //Текущие поручения по авторам-----------------------
{
$Query = mysql_query($tQuery. ' WHERE Result LIKE "" AND id_avtor LIKE "'.$_POST['client'].'" '); //вывод исполнителей
while ($all_order[] = mysql_fetch_assoc($Query)) {}
}


И так получается надо прописать всевозможные комбинации
Текущие поручения
Текущие поручения с таким то автором
Текущие поручения с таким то исполнителем
Текущие поручения с такой то датой
Текущие поручения с такой то датой и таким то исполнителем
Текущие поручения с такой то датой и таким то автором такого то приоритета...
И т.д.

Это можно как то уменьшить? Потому что нереально уже запутался...



Спустя 20 минут, 41 секунда (24.05.2011 - 15:54) T1grOK написал(а):
Это упрощается довольно легко:

//создаем массив полей, которые могут использоваться в запросе, собственно это и есть основной элемент универсальности
$_columns = array('column1'=>NULL,
'column2'=>NULL,
'column3'=>NULL);
$query_filter = '';//кусок запроса с условиями
$query_filter_array = array();
//собственно проверяем отправили ли форму
if ($_POST['submit']){
//смотрим что у нас пришло с поста
foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';
}
}
}

//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

//дальше собираем весь запрос и выполняем
$Query = mysql_query($tQuery.$query_filter);

По моему довольно универсально! Добавляй, убирай сколько угодно колонок в массив $_columns, а остальная часть останется неизменной.

Спустя 2 часа, 47 минут, 38 секунд (24.05.2011 - 18:41) Lightt написал(а):
Извини, пытался сейчас сделать как то говоришь, но что то запутался о_О
Получилось только вывести все данные, без какой либо сортировки, можно примерчик небольшой?

Что то я не то наверное делаю =) глянь пожалуйста...

require_once 'rq/otchet.php';	//подключение запроса
//создаем массив полей, которые могут использоваться в запросе, собственно это и есть основной элемент универсальности

$_columns = array('$_POST["orders"]'=>"all",
'column2'=>NULL,
'column3'=>NULL);

$query_filter = 'Result LIKE "YES"';//кусок запроса с условиями

$query_filter_array = array();
//собственно проверяем отправили ли форму
if ($_POST['vid']){
//смотрим что у нас пришло с поста
foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';
}
}
}

//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

//дальше собираем весь запрос и выполняем
$Query = mysql_query($tQuery.$query_filter);
while ($all_order[] = mysql_fetch_assoc($Query)) {}


rq/otchet.php - содержит -

 <?php 
$tQuery = 'select order_user.id,order_user.Percent,order_user.data_in_Result,
orders.data_order,orders.name_orders,
t1.FIO AS order_ispolnitel,
t2.FIO AS order_avtor,
degree_priority.name_Priority AS order_priority
from order_user
left join orders on orders.id = order_user.id_orders
left join degree_priority on degree_priority.id = orders.id_priority
LEFT JOIN client t1 ON t1.id = order_user.id_executors
LEFT JOIN client t2 ON t2.id = orders.id_autor'

?>


Сама форма добавления выглядит вот так


<form method="POST">
<table>

<tr>
<td
style="width: 260">
Поручения:
</td>

<td>

<select
name="orders" style="width : 155" >
<option
value=""> </option>
<option
value="flowing">Текущие </option>
<option
value="fulfilled">Выполненные </option>
<option
value="Notfulfilled">Не выполненные </option>
</select>
</td>
</tr>

<tr>
<td
style="width: 260">
сортировка по:
</td>

<td
style="width: 50">
<select
name="clien" style="width : 155" >
<option
value=""></option>
<option
value="avtor">Авторам</option>
<option
value="ispol">Исполнителям</option>
</select>
</td>


<td>
<select
name="client">
<?php
foreach($all_client AS $client): ?>
<?php
if(isset($client['id'])): ?>
<option
value="<?php echo $client['id']; ?>">
<?php
echo $client['FIO']; ?>
</option>
<?php
endif;?>
<?php
endforeach;?>
</select>
</td>
</tr>

<tr>
<td><input
type="submit" value="Вывести" name="vid"></td>
</tr>

</table>

Спустя 10 минут, 36 секунд (24.05.2011 - 18:52) ИНСИ написал(а):
T1grOK довольно таки не плохо :) Только вот я бы сделал небольшие корректировки:

Цитата
if ($_POST['submit']){

А что если у кнопки submit стоит значение 0 :) Тогда будет не гуд :) Лучше проверять с помощью:
if(isset($_POST['submit'])) {


Цитата
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';

Зачем экранировать? Если можно так:

$query_filter_array[] = " `".$_POST[$key]."` LIKE '".$_POST[$key]."' ";


Цитата
if(!empty($query_filter_array)){

я бы заменил на:
if(sizeof($query_filter_array) > 0)

Спустя 37 минут, 39 секунд (24.05.2011 - 19:30) Lightt написал(а):
А вообще странно, почему то не работает эта часть запроса -


require_once 'rq/otchet.php';
$query_filter = 'WHERE Result LIKE "YES"';//кусок запроса с условиями
//дальше собираем весь запрос и выполняем

$Query = mysql_query($tQuery.$query_filter);
while ($all_order[] = mysql_fetch_assoc($Query)) {}


Хотя вот такой вариант, вполне отлично все выводит, в чем причина?


require_once 'rq/otchet.php';
$Query = mysql_query($tQuery. ' WHERE Result LIKE "YES"'); //вывод выполненных поручений
while ($all_order[] = mysql_fetch_assoc($Query)) {}

Спустя 8 минут, 14 секунд (24.05.2011 - 19:38) Игорь_Vasinsky написал(а):
может вот это раздеить нужно:
$Query = mysql_query($tQuery.$query_filter);

вот так
$Query = mysql_query($tQuery." ".$query_filter);

Спустя 9 минут, 43 секунды (24.05.2011 - 19:48) Lightt написал(а):
о_О Нет...как ни странно это работает...

$Query = mysql_query($tQuery." ".$query_filter);


Спасибо =) буду разбираться дальше...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.