Фильтрация запроса

Главные вкладки

Аватар пользователя AndreyL AndreyL 2 июня 2010 в 1:50

Вот, еще один вопрос назрел.
Нужно организовать фильтрацию вывода запроса.
Пока получается такой код:

<form method='post'>
 <select name="clinic"> <!--выпадающий список-->
 <option value="Клиника1">Клиника2</option>
 <option value="Клиника2">Клиника2</option>
 <option value="Клиника3">Клиника3</option>
 </select>
 <input name="Submit" type='submit' value='Отправить'>
</form>

<?php
 print $body;
if (!empty($_POST['clinic'])) { echo $_POST['clinic']; };
  if(!($node = menu_get_object()))
    return;
 
  $count_per_page = 10;
  $sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic' ORDER BY Фирма";
  $sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic'";
  $result = pager_query($sql,$count_per_page, 0, $sql_count, $node->title);
 
  $rows = array();
  while($row = db_fetch_object($result)){
  $header = array('Название по прайсу', 'Мед. компания', 'Цена услуги');
    $rows[] = array($row->Название, $row->Фирма, $row->Цена);
  }
 
  $output = theme('table', $header, $rows, array());
  $output .= theme('pager', NULL, $count_per_page, 0);
  print $output;
?>

Я так понимаю, что параметр $clinic или не передается, или передается неправильно. Помогите, пожалуйста. Знаю, что уже злоупотребляю, но за пару недель sql мне не осилить, тем более, что это не единственная задача...

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 2 июня 2010 в 9:07

Вам его не надо "силить" есть визуальный "создатель" такой страницы с фильтрами и "решатель" этой задачи views
По нему могу ответить Вам на вопросы. Если Вы его поставите и начнете создавать свою страницу.

Аватар пользователя AndreyL AndreyL 2 июня 2010 в 10:41

В настоящее время уже 1300 страниц на сайте. Может, я не прав, но, вроде, при использовании views придется "перенабирать" их, вносить изменения в каждую? Я недавно пробовал, но не нашел: где там можно sql-запрос вставить? Сейчас запрос в content templates - он сразу на все распространяется (ну, почти: на все типы материалов, на которые написан запрос).

Аватар пользователя sas@drupal.org sas@drupal.org 2 июня 2010 в 18:42

"AndreyL" wrote:
В настоящее время уже 1300 страниц на сайте. Может, я не прав, но, вроде, при использовании views придется "перенабирать" их

Не придется - это данные которые использует views
"AndreyL" wrote:
может, можно как-то все-таки передать параметр в запрос?

Не надо !

Аватар пользователя AndreyL AndreyL 2 июня 2010 в 20:39

Так, понял. Views есть; подскажите где там запрос вставляется? Я никак не могу найти ему применение. Пейджинг, сортировку - все это легко нашел. А что делать с запросом?

SELECT Название, Фирма, Цена
FROM Таблица
WHERE Имя='%s'
ORDER BY Фирма

А еще я не знаю как сделать так, чтобы 1 настройка views распространялась на все страницы одного типа (на node, например).

Аватар пользователя sas@drupal.org sas@drupal.org 2 июня 2010 в 21:20

1) Запрос Вам не виден и не нужен - "визуальный конструктор". (вернее внизу при отладке виден результирующий запрос)
2) Вы выбираете "что" выводите, в фильтрах что отбирает - если поставить "раскрывать" фильтр - то он появиться на странице Views Вашего, то что Вам надо - просто посмотрите уже готовые views страницы - все поймете.

Аватар пользователя AndreyL AndreyL 2 июня 2010 в 21:54

а как вывести значения таблицы, ячейки первого столбца которой = названию страницы (ноды, страницы подшивок и др.)?

Аватар пользователя AndreyL AndreyL 10 ноября 2015 в 11:46

У меня все на английском. И совсем не так все выглядит.
Может, версия другая? У меня 6.x-2.10.
Хотя, от версии, наверное, мало что зависит.
Где можно почитать о принципе работы views?
Не понятна схема работы:
1. Как указать таблицу базы данных, столбцы из которых будут отбираться записи?
2. Как указать, что записи должны быть отобраны по критерию "Столбец1=Названию_Страницы"? Столбец1 при этом отображатся не должен (это важно для внешнего вида таблицы).
3. Как определить, что фильтр должен строиться по данным, содержащихся в отобранных столбцах? Т.е. если после отбора записей на выходе имеем три столбца (Столбец2,3,4 из исходной, хранящейся в базе данных) - в Столбце2: а, б, в, г, д; в Столбце3: a, b, c, d; в Столбце4: 1, 2, 3 (каждое значение каждого столбца может повторяться сколько угодно раз) - как отсеить "лишние" записи, если нам нужны только те, где стоит "3" в Столбце4 или "б" в Столбце2?

В общем, отдельные какие-то элементы я настроить, вроде, уже могу (это, в основном, касается раздела Basic Settings); а вот Relationships, Arguments, Sort Criteria (тут и с фильтрами суть ясна, конечно - настройка сортировки и, собственно, фильтра, который мне и нужен), Фильтры - тут уже сложнее. Тем более, не понятно, как они между собой связаны.

Аватар пользователя sas@drupal.org sas@drupal.org 3 июня 2010 в 17:31

"AndreyL" wrote:
Где можно почитать о принципе работы views?

Если вы установите модуль Advanced help (см. http://drupal.org/project/advanced_help), то вы получите более удобную справку
"AndreyL" wrote:
2. Как указать, что записи должны быть отобраны по критерию "Столбец1=Названию_Страницы"? Столбец1 при этом отображатся не должен (это важно для внешнего вида таблицы).

Создать фильтр для "Столбец1" и не делать его расширенным - он не будет отображаться при использовании для изменения "Названию_Страницы"
"AndreyL" wrote:
Как определить, что фильтр должен строиться по данным, содержащихся в отобранных столбцах

В фильтрах только данные не из отобранных а из базы беруться
"AndreyL" wrote:
как отсеить "лишние" записи, если нам нужны только те, где стоит "3" в Столбце4 или "б" в Столбце2?

В фильтре есть галочка "только уникальные"
"AndreyL" wrote:
В общем, отдельные какие-то элементы я настроить, вроде, уже могу (это, в основном, касается раздела Basic Settings);

Советую посмотреть уже настроенные views - многие моменты станут понятны.

Аватар пользователя AndreyL AndreyL 6 июня 2010 в 0:25

С views пока тяжело. Разбираюсь. Но вот, на форуме phpforum.ru предложили проверить передаваемые параметры на соответстивие. Почему-то выводится "не найдено соответствие". Решение, вроде, где-то рядом...
Пытался убирать одинарные кавычки; если убрать все, то сообщение о соответствии не выводится вообще. Добиться "найдено соответствие" не получилось...

<?php<form method='post'>
 <select name="clinic"> <!--выпадающий список-->
 <option value="Клиника1">Клиника2</option>
 <option value="Клиника2">Клиника2</option>
 <option value="Клиника3">Клиника3</option>
 </select>
 <input name="Submit" type='submit' value='Отправить'>
</form>

<?php
$and 
'';
if (!empty(
$_POST['clinic']))
  {
  echo 
$_POST['clinic'];
  
$and " AND Фирма='$clinic' ";
  
$clinic=$_POST['clinic'];

   

/* Проверка на соответствие префикс CH */
  
$CHcheck mysql_query("SELECT DISTINCT Фирма FROM Таблица WHERE Имя='%s'",$CHdb); // Запрос
  
$CHfirms mysql_fetch_assoc($CHcheck);

  if(

in_array($clinic$CHfirms))
    echo 
"Найдено соответствие";
  else
    echo 
"Не найдено соответствие";
  
///////////////////////////////////
  
}
  if(!(
$node menu_get_object()))
    return;

  

$count_per_page 10;
  
/* $sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic' ORDER BY Фирма";   */
  
$sql "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s'".$and." ORDER BY Фирма";
  
/* $sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic'"; */
  
$sql_count "SELECT COUNT(*) FROM Таблица WHERE Имя='%s'".$and;

  

$result pager_query($sql,$count_per_page0$sql_count$node->title);

  

$rows = array();
  while(
$row db_fetch_object($result)){
  
$header = array('Название по прайсу''Мед. компания''Цена услуги');
    
$rows[] = array($row->Название$row->Фирма$row->Цена);
  }

  

$output theme('table'$header$rows, array());
  
$output .= theme('pager'NULL$count_per_page0);
  print 
$output;
?>
Аватар пользователя AndreyL AndreyL 6 июня 2010 в 9:27

Мне кажется, с views не получится: нет возможности выбрать не связанную с другими таблицами таблицу БД, в которой хранятся данные; и, соответственно, поля из нее для вывода. Может, конечно, я что-то не понял или понял не так.

Аватар пользователя sas@drupal.org sas@drupal.org 6 июня 2010 в 11:43

"AndreyL" wrote:
Мне кажется, с views не получится: нет возможности выбрать не связанную с другими таблицами таблицу БД, в которой хранятся данные; и, соответственно, поля из нее для вывода.

Views эти и занимается - выбирает данные из таблиц - весь вопрос в конкретной задаче ?!

Аватар пользователя AndreyL AndreyL 6 июня 2010 в 20:55

Да, я не могу запросить данные из конкретной таблицы. Она находится в той же базе данных.
Из нее надо "вытащить" значения трех столбцов (это, насколько я понял, можно было бы сделать с помощью блока "Поля" в настройках views). Далее, их надо отсортировать: тут я не определился что лучше или надо использовать: в описании сказано, что Аргументы (Arguments) выполняют функции, схожие с Фильтрами. Но использовать и те, и другие я пока не могу, т.к. саму таблицу (вообще ни одну таблицу из базы данных) выбрать не могу. Уже всю справку перечитал...

Аватар пользователя AndreyL AndreyL 6 июня 2010 в 20:31

В процессе обсуждения кода на одном из форумов (phpforum) код несколько преобразовался. Проблема в том, что передача параметра clinic в post осуществляется (выводтся нужный текст после выбора нужной клиники/лаборатории); также осуществляется "фильтарция", если напрямую указать какая лаборатория должна быть выбрана. А вот через данные, которые содержатся в post это осуществить не удается. Единственное предположение, что, возможно, данные в post хранятся в какой-то другой кодировке: таблица в базе данных сохранена в utf-8, сравнение в базе данных - тоже. А передачи - нет.
Views, я конечно, разберу, в любом случае - слишком много в нем возможностей, чтобы упускать его. Но на настоящем этапе решения пока нет - ни views (пока не "сдается"), ни запрос не обрабатывается как нужно.

<?php
<form method='post'>
 <
select name="clinic"> <!--выпадающий список-->
 <
option value="Клиника1">Клиника2</option>
 <
option value="Клиника2">Клиника2</option>
 <
option value="Клиника3">Клиника3</option>
 </
select>
 <
input name="Submit" type='submit' value='Отправить'>
</
form>

<?

php
$and 
'';
if (!empty(
$_POST['clinic']))
  {
  
$clinic=trim($_POST['clinic']);
  echo 
$clinic;
  
$and " AND Фирма='$clinic' ";  

   

/* Проверка на соответствие префикс CH */
  
$CHcheck mysql_query("SELECT DISTINCT Фирма FROM Таблица WHERE Имя='%s'",$CHdb); // Запрос

  

$CHfirms mysql_fetch_assoc($CHcheck);
  
print_r($CHfirms);

  if(

in_array($clinic$CHfirms))
    echo 
"Найдено соответствие";
  else
    echo 
"Не найдено соответствие";
  
///////////////////////////////////
  
}
  if(!(
$node menu_get_object()))
    return;

  

$count_per_page 10;
  
/* $sql = "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic' ORDER BY Фирма";   */
  
$sql "SELECT Название, Фирма, Цена FROM Таблица WHERE Имя='%s'".$and." ORDER BY Фирма";
  
/* $sql_count = "SELECT COUNT(*) FROM Таблица WHERE Имя='%s' and WHERE Фирма='$clinic'"; */
  
$sql_count "SELECT COUNT(*) FROM Таблица WHERE Имя='%s'".$and;

  

$result pager_query($sql,$count_per_page0$sql_count$node->title);

  

$rows = array();
  while(
$row db_fetch_object($result)){
  
$header = array('Название по прайсу''Мед. компания''Цена услуги');
    
$rows[] = array($row->Название$row->Фирма$row->Цена);
  }

  

$output theme('table'$header$rows, array());
  
$output .= theme('pager'NULL$count_per_page0);
  print 
$output;
?>
Аватар пользователя AndreyL AndreyL 7 июня 2010 в 11:21

заголовки разобрался как делать. там же и сортировка может настраиваться. а где указать откуда извлекать данные, т.е. из какой таблицы?

Аватар пользователя penexe penexe 7 июня 2010 в 14:03

я так понял у вас чисто "своя таблица" никаким боком к друпалу отношения не имеет, тогда юзайте модуль Table Wizard там через конструктор интегрируюете таблицу с views а потом в полях будете выбирать нужные данные.

Аватар пользователя AndreyL AndreyL 7 июня 2010 в 14:26

чтобы задать соответствие одного поля моей таблицы таблице из БД drupal нужно определить ключ моей таблицы (ключ должен быть тем полем, которое я хочу связать с другими данными)?

Аватар пользователя penexe penexe 7 июня 2010 в 16:29

AndreyL, при создании view идет выбор "базовой таблицы", user, node, comment и тд вот там должна выбираться "таблица"

Аватар пользователя AndreyL AndreyL 7 июня 2010 в 20:17

Вроде, готово.
Фильтр должен так выглядеть?
Таблица: Столбец1 = Node: title
Т.е. нужно, чтобы показывались записи, в которых Столбец1 содержит данные, совпадающие с названием страницы.

Только еще не понятно где можно указать, на которых страницах этот views должен показываться?

Аватар пользователя penexe penexe 7 июня 2010 в 20:57

блок нужен? тогда надо указывать аргумент

Таблица: Столбец1 -> Provide default argument -> PHP Code

if (($node = menu_get_object('node')) && !arg(2)) {
return $node->title;
}

Аватар пользователя AndreyL AndreyL 7 июня 2010 в 21:19

не, блок не нужен нужно только сопоставить данные столбца1 и название страницы. вывод - в основной части страницы (content).
и указать в которых типах материалов этот views будет использоваться; пока не отображается нигде.

Аватар пользователя AndreyL AndreyL 7 июня 2010 в 22:18

Таблица: Столбец1 = Node: title - наверное, неправильно написано.
Да, сделал блоком. Но отображается только заголовок.
А еще внизу, под результатом вывода views отображается:

/* */

Отчего так? Я такого не писал нигде.