|
|
|
| Здравствуйте, у меня такая ситуация:
есть база, в ней 14 таблиц
в 13 таблицах хранятся данные примерно в таком виде:
id, nomer_vagona
все остальные таблицы примерно такого же содержания, записи этих таблиц в браузере выводятся в виде выпадающих списков, все это сделано для того, чтобы вести учет операций с вагонами.
14 таблица содержит записи, значения которых это id остальных таблиц, надеюсь, что объяснил понятно.
Вообщем пытаюсь сделать поиск по записям, причем поиск осуществляется в виде фильтра, т.е. опять же есть несколько критериев по которым надо выполнит поиск по базе, эти критерии выполнены через выпадающие списки (значения первых 13 таблиц).
Т.е. несколько выпадающих списков, мы выбрали значения из тех которые нам необходимы, и далее если есть совпадения по выбранным элементам списков в базе выводим результат, но не получается реализовать этот поиск.
Я прикрепил, весь свой скрипт, в архиве также дамп базы.
Кто может помогите разобраться пожалуйста, многое уже сделано, но с поиском ничего не получается | |
|
|
|
|
|
|
|
для: JIyKaBbIu
(28.03.2008 в 08:02)
| | Хочу внести немного ясности:
в скрипте есть форма добавления новой записи в базу
В этой форме много разных переменных, большинство их реализовано через списки, каждый список - отдельная таблица, так вот 14 таблица хранит в себе результирующие записи по каждой операции с вагоном, каждая запись представляет собой id элементов, выбранных из списков для каждой конкретной записи.
Поиск должен выполняться путем выбора элементов из определенного набора списков (таблиц), и далее результирующий запрос к базе, а точнее к 14 (главной) таблице строится на основе сравнения, всех выбранных id элементов списка, т.е. есть ли совпадения, уже честно говоря сам запутался пытаясь объяснить, но я думаю кто захочет мне помочь, посмотрев прикрепленный архив в первом посте, разберет что к чему, надеюсь на вашу помощь! | |
|
|
|
|
|
|
|
для: JIyKaBbIu
(28.03.2008 в 09:43)
| | Причем когда осуществляем поиск, путем выбора значений из списков, не обязательно выбирать значения во всех списках, можно выбрать из только из нескольких или даже из одного. | |
|
|
|
|
|
|
|
для: JIyKaBbIu
(28.03.2008 в 10:11)
| | Люди, помогите, срочно нужна помощь. | |
|
|
|
|
|
|
|
для: 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-конструкцию. | |
|
|
|
|
|
|
|
для: 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 не присваивается никакое значение. Не могу понять в чем ошибка, вроде все правильно.
Заранее благодарен за помощь. | |
|
|
|
|
|
|
|
для: JIyKaBbIu
(31.03.2008 в 10:44)
| | >$_POST['sobstvennik']='-1'
Вероятно вы имели в виду
$_POST['sobstvennik'] == '-1'
|
| |
|
|
|
|
|
|
|
для: cheops
(31.03.2008 в 11:14)
| | Спасибо за оперативную помощь, действительно, вместо сравнения, использовал присваивание.
Еще раз спасибо. | |
|
|
|
|
|
|
|
для: 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>";
|
Это я сделал только для одной таблицы, а мне еще надо остальные данные таким методом вытащить, уж больно не оптимальная конструкция получается, может есть другой метод, подскажите пожалуйста?
Я прикрепил файл со скриптом поиска.
Заранее благодарен. | |
|
|
|
|
|
|
|
для: JIyKaBbIu
(01.04.2008 в 09:41)
| | Лучше так и вытаскивайте - если будете пользоваться многотабличным запросом, то когда данных станет много - он будет слишком долго выполняться. Чтобы сделать код элегантнее - оформите вывод данных для каждой из таблиц в виде отдельной функции. | |
|
|
|
|
|
|
|
для: 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? | |
|
|
|