Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Многотабличный запрос для поиска
 
 автор: JIyKaBbIu   (28.03.2008 в 08:02)   письмо автору
 
 

Здравствуйте, у меня такая ситуация:
есть база, в ней 14 таблиц
в 13 таблицах хранятся данные примерно в таком виде:
id, nomer_vagona
все остальные таблицы примерно такого же содержания, записи этих таблиц в браузере выводятся в виде выпадающих списков, все это сделано для того, чтобы вести учет операций с вагонами.
14 таблица содержит записи, значения которых это id остальных таблиц, надеюсь, что объяснил понятно.
Вообщем пытаюсь сделать поиск по записям, причем поиск осуществляется в виде фильтра, т.е. опять же есть несколько критериев по которым надо выполнит поиск по базе, эти критерии выполнены через выпадающие списки (значения первых 13 таблиц).
Т.е. несколько выпадающих списков, мы выбрали значения из тех которые нам необходимы, и далее если есть совпадения по выбранным элементам списков в базе выводим результат, но не получается реализовать этот поиск.

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

   
 
 автор: JIyKaBbIu   (28.03.2008 в 09:43)   письмо автору
 
   для: JIyKaBbIu   (28.03.2008 в 08:02)
 

Хочу внести немного ясности:
в скрипте есть форма добавления новой записи в базу
В этой форме много разных переменных, большинство их реализовано через списки, каждый список - отдельная таблица, так вот 14 таблица хранит в себе результирующие записи по каждой операции с вагоном, каждая запись представляет собой id элементов, выбранных из списков для каждой конкретной записи.
Поиск должен выполняться путем выбора элементов из определенного набора списков (таблиц), и далее результирующий запрос к базе, а точнее к 14 (главной) таблице строится на основе сравнения, всех выбранных id элементов списка, т.е. есть ли совпадения, уже честно говоря сам запутался пытаясь объяснить, но я думаю кто захочет мне помочь, посмотрев прикрепленный архив в первом посте, разберет что к чему, надеюсь на вашу помощь!

   
 
 автор: JIyKaBbIu   (28.03.2008 в 10:11)   письмо автору
 
   для: JIyKaBbIu   (28.03.2008 в 09:43)
 

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

   
 
 автор: JIyKaBbIu   (28.03.2008 в 10:25)   письмо автору
 
   для: JIyKaBbIu   (28.03.2008 в 10:11)
 

Люди, помогите, срочно нужна помощь.

   
 
 автор: cheops   (28.03.2008 в 12:56)   письмо автору
 
   для: JIyKaBbIu   (28.03.2008 в 08:02)
 

Так вы ничего не найдёте, у вас получается запрос вида
 SELECT * FROM otpravka WHERE id_kvitotpr='' AND 
id_stan_otpr='' AND 
id_stan_naznach='' AND 
id_otprav='' AND 
id_vagon='' AND 
id_sobstvennik='' AND 
id_gruz='' AND 
id_platil=''

Т.е. если хотя бы одно условие не указано, сравнение идёт с пустой строкой, которую параметр id_platil принимать не может. Используйте конструкции вида
<?php
 
...
  if(!empty(
$_POST['platil']))
  {
    ...
    
$where[] = " id_platil='$id_platil' ";
  }
  if(
is_array($where))
  {
    
$query="SELECT * FROM otpravka WHERE ".implode(" AND "$where);
  }
?>

Тогда если условие отсутствует - оно вообще не попадёт в WHERE-конструкцию.

   
 
 автор: JIyKaBbIu   (31.03.2008 в 10:44)   письмо автору
 
   для: cheops   (28.03.2008 в 12:56)
 

Спасибо, за ваш совет, все получилось.
У меня есть еще один вопрос, правда к данной теме относится только тем, что относится к одному проекту.

<td><select name="sobstvennik">
     <option value=""></option>
     <?
        $get_list 
= @mysql_query("SELECT id_sobstvennik, sobstvennik FROM sobstvennik");
        while (
$elem = @mysql_fetch_array($get_list))
            echo 
"<option value='$elem[id_sobstvennik]'>$elem[sobstvennik]\n";
     
?>
     <option value="-1">Другой</option>
</select>
<input type="text" name="sobstvennik1">
<?
if($_POST['sobstvennik']='-1')
{
        
$query="SELECT * FROM sobstvennik WHERE sobstvennik='".$_POST['sobstvennik1']."'";
        
$dev=mysql_query($query);
        if(
mysql_num_rows($dev)>0)
        {
            
$nomer=mysql_fetch_array($dev);
            
$id_sobstvenik=$nomer['id_sobstvennik'];
            
$errorsobst="<b>данная запись уже есть в базе</b>";
        }
        else
        {
            
$getmaxid=mysql_query("SELECT MAX(id_sobstvennik) AS id_sobstvennik FROM sobstvennik");
            
$maxid=mysql_fetch_array($getmaxid);
            
$id_sobstvenik=$maxid['id_sobstvennik']+1;
            if(!empty(
$_POST['sobstvennik1']))
            {
                
$sql=mysql_query("INSERT INTO sobstvennik VALUES ('".$id_sobstvenik."', '".$_POST['sobstvennik1']."')");
                
$sobstvennik=$id_sobstvenik;
                
$errorsobst='';
            }
        }
}
else
    {
     
$sobstvennik=$_POST['sobstvennik'];
     
$errorsobst='';
    }
    echo 
$sobstvennik;
echo 
$errorsobst;
?></td></tr>

Эта конструкция необходима, чтобы в главную таблицу базы передавался либо id вновь созданного элемента, либо id созданного элемента, в зависимости от того, что выбранного в списке.
Так вот, в случае если элемента нет в списке (выбран элемент списка "другой"), все работает замечательно, запись добавляется в базу, но если выбран любой другой элемент, то $sobstvennik=$_POST['sobstvennik']; не работает, т.е. переменной $sobstvennik не присваивается никакое значение. Не могу понять в чем ошибка, вроде все правильно.
Заранее благодарен за помощь.

   
 
 автор: cheops   (31.03.2008 в 11:14)   письмо автору
 
   для: JIyKaBbIu   (31.03.2008 в 10:44)
 

>$_POST['sobstvennik']='-1'
Вероятно вы имели в виду
$_POST['sobstvennik'] == '-1'

   
 
 автор: JIyKaBbIu   (31.03.2008 в 16:22)   письмо автору
 
   для: cheops   (31.03.2008 в 11:14)
 

Спасибо за оперативную помощь, действительно, вместо сравнения, использовал присваивание.
Еще раз спасибо.

   
 
 автор: JIyKaBbIu   (01.04.2008 в 09:41)   письмо автору
 
   для: JIyKaBbIu   (31.03.2008 в 16:22)
 

Здравствуйте, у меня возникла еще одна проблема:
Поиск я организовал так, как вы мне подсказали, все замечательно работает, не получается сделать выдачу результата поиска.
Т.е. id записей из главной таблицы, которые удовлетворяют заданному фильтру при поиске я получаю, теперь из каждой записи вместо id вспомогательных таблиц, мне надо получить соответствующие этим id данные.
Я попробовал сделать, вот как пример:
 <? if(is_array($where))
  {
    
$query="SELECT * FROM otpravka WHERE ".implode(" AND "$where);
    
$result=mysql_query($query);
    if(
mysql_num_rows($result)>0)
      {
        
?>
        <table width=100% class=bodytable border=1 align=center cellpadding=5 cellspacing=0 bordercolorlight=gray bordercolordark=white>
         <tr class=tableheadercat align="center">
          <td width=120><p class=zagtable>Дата отправления</p></td>
          <td width=150><p class=zagtable>Станция отправления</p></td>
          <td width=150><p class=zagtable>Станция назначения</p></td>
          <td width=150><p class=zagtable>Отправитель</p></td>
          <td width=150><p class=zagtable>Плательщик</p></td>
          <td width=150><p class=zagtable>Наим. груза/код</p></td>
          <td width=150><p class=zagtable>Номер вагона</p></td>
          <td width=150><p class=zagtable>Собственник</p></td>
          <td width=150><p class=zagtable>Действия</p></td>
        </tr>
       <?php
       
while ($filter mysql_fetch_array($result)){
         
$query="SELECT * FROM data_otprav WHERE id_data_otprav='".$filter['id_data_otprav']."'";
         
$new mysql_query($query);
         while(
$nomera mysql_fetch_array($new)){
           echo 
"<tr>
              <td><p class=help align=center>"
.$nomera['data_otprav']."</p></td>
              <td><p class=help align=center>"
.$filter['id_stan_otpr']."</p></td>
              <td><p class=help align=center>"
.$filter['id_stan_naznach']."</p></td>
              <td><p class=help align=center>"
.$filter['id_otprav']."</p></td>
              <td><p class=help align=center>"
.$filter['id_platil']."</p></td>
              <td><p class=help align=center>"
.$filter['id_gruz']."</p></td>
              <td><p class=help align=center>"
.$filter['id_vagon']."</p></td>
              <td><p class=help align=center>"
.$filter['id_sobstvennik']."</p></td>
            </tr>"
;
       }
      }
    }
    else
    {
        echo 
"</br> Нет данных, удовлетворяющих установленному фильтру";
    }
    echo 
"</table>";

Это я сделал только для одной таблицы, а мне еще надо остальные данные таким методом вытащить, уж больно не оптимальная конструкция получается, может есть другой метод, подскажите пожалуйста?
Я прикрепил файл со скриптом поиска.
Заранее благодарен.

   
 
 автор: cheops   (01.04.2008 в 12:14)   письмо автору
 
   для: JIyKaBbIu   (01.04.2008 в 09:41)
 

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

   
 
 автор: JIyKaBbIu   (01.04.2008 в 21:36)   письмо автору
 
   для: cheops   (01.04.2008 в 12:14)
 

Т.е. повторять эту конструкцию
 while ($filter = mysql_fetch_array($result)){
         $query="SELECT * FROM data_otprav WHERE id_data_otprav='".$filter['id_data_otprav']."'";
         $new = mysql_query($query);
         while($nomera = mysql_fetch_array($new)){

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования