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

Форум MySQL

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

 

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

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

тема: запрос из нескольких таблиц
 
 автор: lilu   (19.09.2005 в 20:15)   письмо автору
 
 

Нужно вывести результат поиска по базе
значения для поиска вводит пользователь или выбирает из списка через вот такую форму-таблицу!


<form action=? method="post">
<input type="submit" value="Поиск">
<table width="100%" border="1" cellspacing="0" cellpadding="0">
  <tr>
    <td>N</td>
    <td>город</td>
   <td>код_абонента</td>
   <td>част_орг</td>
....
<td>дата_вкл</td>
    <td>состояние</td>
    <td>дата_блок</td>
  </tr>
 <tr>
     <td>1</td>
    <td><input name="s_city" type="text" value="Введите назв.города"></td>
    <td><input name="s_code" type="text" value="Введите код абонента"></td>
    <td><select name="s_ch_org">
<option value="chast">частник</option>
<option value="org">орг</option>
<option value="all">все</option>
</select></td>
<td><input name="s_d_vkl" type="text" value="Введите дату_вкл"></td>
        <td><select name="s_status">
<option value="ok">ok</option>
<option value="b_dolg">блок. за неуплату</option>
<option value="b_vrem">врем. блок.</option>
<option value="del">удалён</option>
</select></td>
     <td>&nbsp;</td>
  </tr>
</table>
</form>

Даже если ничего не заполнено должны выводится все данные, причём допустим значения до многоточия беруться из таблицы "abonent" а остальная из таблицы "dates"! Связаны эти таблицы по полю code(код абонента)! Соответственно если выбрано или введено только одно или два значения! Как всё это учесть в запросе?

   
 
 автор: cheops   (20.09.2005 в 01:08)   письмо автору
 
   для: lilu   (19.09.2005 в 20:15)
 

А вы не могли бы привести структуру таблиц (получить их можно при помощи оператора SHOW CREATE TABLE)?

   
 
 автор: lilu   (20.09.2005 в 10:39)   письмо автору
 
   для: cheops   (20.09.2005 в 01:08)
 

Таблица "abonent"
id int(2) auto_inc - primary key
city varchar(20)
code varchar(8)
ch_org set(частник, орг, все)

Таблица "dates"
id int(2) auto_inc - primary key
code varchar(8)
data_vkl date
status set(ok, бл.за неуплату, врем.блок, удалён)
data_blok date

   
 
 автор: cheops   (20.09.2005 в 12:52)   письмо автору
 
   для: lilu   (20.09.2005 в 10:39)
 

Можно формировать запрос на поиск примерно следующим образом
<?php
  
if($_POST['s_city'] != 'Введите назв.города' && $_POST['s_city'] != '')
  {
    
$query[] = "abonent.city LIKE '$_POST[s_city]'";
  }
  
$query[] = "abonent.code = $_POST[s_code]";
  
$query[] = "FIND_IN_SET('$_POST[s_ch_org]',abonent.ch_org)>0";

  if(
$_POST['s_d_vkl'] != 'Введите дату_вкл' && $_POST['s_d_vkl'] != '')
  {
    
$query[] = "dates.data_vkl = '$_POST[s_d_vkl]'";
  }
  
$query[] = "FIND_IN_SET('$_POST[s_status]',dates.ch_org)>0";
  
$query[] = "abonent.code = dates.code"
  
// Формируем конечный запрос
  
$sql "SELECT * FROM dates, abonent WHERE ".implode(" AND ",$query)." GROUP BY abonent.code"
  
echo $sql;
?>

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

   
 
 автор: lilu   (20.09.2005 в 18:07)   письмо автору
 
   для: cheops   (20.09.2005 в 12:52)
 

М.. да! НЕ просто разобраться! Если вам не сложно пояснит ехоть кратенько каждую строчку!
И что происходит если поля пользователь не заполняет - допустим оно пустое или там всё же написано Введите..., надо чтобы учитывались все записи этого поля! Это здесь не срабатывает! А что ж делать тогда? :(

   
 
 автор: cheops   (21.09.2005 в 01:26)   письмо автору
 
   для: lilu   (20.09.2005 в 18:07)
 

Если строка пустая или содержит фразу 'Введите назв.города' тогда условие
<?php
if($_POST['s_city'] != 'Введите назв.города' && $_POST['s_city'] != '')
?>

не выполняется и никаких ограничений в запросе по данному полю не будет - т.е. выведутся все поля. Мы последовательно формируем куски SQL-запроса, которые помещаем в массив $query. После того, как массив заполнен - мы объединяем все части в один запрос при помощи функции implode, первый параметр которой является разделителем (' AND '). Так как как у вас используется тип SET (совершенно непонятно зачем - помоему логичнее использовать ENUM) приходится использовать MySQL-функцию FIND_IN_SET, которая ищет вхождение.

Да вы просто выведите результат - у вас многие вопросы просто отпадут.

   
Rambler's Top100
вверх

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