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

Форум MySQL

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

 

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

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

тема: связь между несколькими таблицами
 
 автор: lilu   (27.07.2005 в 21:17)   письмо автору
 
 

Честно говоря я даже не знаю к какому больше разделу относится мой вопрос к php или к mysql!
Есть таблица с названием рубрик:
id nameR TextR
1 trans транспорт
2 flat недвижимость
и т.д. их много
Подскажите как вывести список ссылок, кот. названия будет черпать из этой таблицы! (т.е. если появится новая рубрика я просто добавлю её в таблицу а на страничке появится новая ссылка)

И ещё вопрос есть вторая таблица в которой перечислены подрубрики для всех рубрик, т.е. в рубрику транспорт включены подрубрики автобусы, легковые автомобили, мотоциклы и т.д.для каждой рубрики соответственно, можно ли так сделать чтобы выбирая одну рубрику выводилась радиогруппа только с соотв-ими подрубриками!
Ой надеюсь я понятно объяснила!

   
 
 автор: cheops   (27.07.2005 в 21:27)   письмо автору
 
   для: lilu   (27.07.2005 в 21:17)
 

1) А какой вид должны иметь ссылки?
2) Какова структура второй таблицы?

PS Всё что связано с MySQL лучше помещать в раздел http://www.softtime.ru/forum/index.php?id_forum=3 - там обсуждается как СУБД MySQL, запросы и администрирование, так и взаимодействие с MySQL из PHP и других языков программирования.

   
 
 автор: lilu   (28.07.2005 в 18:50)   письмо автору
 
   для: cheops   (27.07.2005 в 21:27)
 

Ссылки в виде названий рубрик из этой таблицы!
структура второй таблицы
id nameP textP
1 legavto легковые автомобили
2 bus автобусы
и т.д. но т.к. это подрубрики и они связаны с рубриками, то может надо ещё одно поле для связи с первой таблицей , тогда структура будет такая
id nameP TextP idR
1 legavto легковые автомобили 1
2 bus автобусы 1
и т.д. В первой и во второй таблице id - auto_inc и он же primary key
Я просто не знаю как в mysql отображаются связи между таблицами

   
 
 автор: cheops   (28.07.2005 в 19:27)   письмо автору
 
   для: lilu   (28.07.2005 в 18:50)
 

1) Для вывода ссылок можно воспользоваться следующим скриптом (так и не понятно какой должна быть ссылка)
<?php
  
// Устанавливаем соединение с базой данных
  
include "config.php";
  
// Формируем и выполняем запрос
  
$query "SELECT * FROM catalog";
  
$cat mysql_query($query);
  if(!
$cat) exit(mysql_error());
  
// В цикле выводим ссылки
  
while($catalog mysql_fetch_array($cat))
  {
     echo 
"<a href=index.php?id=$catalog[id]>$catalog[textP]</a><br>";
  }
?>


2) Теперь по переходу по ссылке в файле index.php можно выводить радио-кнопки, для этого можно воспользоваться кодом:
<?php
  
// Устанавливаем соединение с базой данных
  
include "config.php";
  
// Формируем и выполняем запрос
  
$query "SELECT * FROM subcatalog WHERE idR=$_GET[id]";
  
$sub mysql_query($query);
  if(!
$sub) exit(mysql_error());
  
// В цикле выводим ссылки
  
while($subcat mysql_fetch_array($sub))
  {
     echo 
"<input type=radio>$subcat[TextP]<br>";
  }
?>

   
 
 автор: lilu   (28.07.2005 в 21:47)   письмо автору
 
   для: cheops   (28.07.2005 в 19:27)
 

для cheops
Спасибо всё красиво выводит! Только вот как дальше мне проверять нажато ли и что именно в этой радиогруппе! Мне нужна какая-то переменная кот. будет хранить значение выбранного значения, кот. я буду использовать при написании выборки допустим по выбору этих значений из другой таблицы!>
Например из такой
id, idR, idP, idD, text, kontact, data
id- primary, auto_inc

idR и idP из таблицы "подрубрики"
idD из таблицы "действия"
Но прежде помогите мне разобраться со структурой третьей таблицы, а точнее со связями через доп. поля или как там можно по другому!

   
 
 автор: cheops   (29.07.2005 в 00:21)   письмо автору
 
   для: lilu   (28.07.2005 в 21:47)
 

В качестве имени можно использовать значение поля nameR таблицы с рубриками (catalog). Вот запрос, который извлечёт это значение.
"SELECT nameR FROM catalog WHERE id=$_GET[id]";

   
 
 автор: Loki   (28.07.2005 в 19:35)   письмо автору
 
   для: lilu   (28.07.2005 в 18:50)
 

А никак не отображаются. Вы все правильно понимаете: делаете дополнительное поле, и на основании его фильтруете данные.

   
 
 автор: lilu   (28.07.2005 в 22:03)   письмо автору
 
   для: Loki   (28.07.2005 в 19:35)
 

для Loki

Вы знаете это просто когда двойная вложенность, вот как у меня сейчас рубрики-подрубрики! А мне надо ещё третья рубрики-подрубки-действия!
Т.е. если у меня 10 рубрик в каждой по 6 подрубрик -то во второй таблице у меня хошь или нет будет 60 записей! Это ещё ничего!
А вот представьте что каждую подрубрику можно продать, купить, обменять, а для некоторых есть специфические действия, кот. для всех не подходят например, ищу работу или утеряно,
т.е. была первая таблица "рубрики" - с полями
idR, nameR, textR в ней 10 записей(рубрик)
вторая таблица "подрубрики"
idP, nameP, textP, idR в ней 60 записей (подрубрик) idR связывает её с таблицей "рубрики "
и наконец третья таблица "действия", в ней перечислены всевозможные действия с рубриками, но не каждое действие подходит к каждой рубрике и если сделать такую структуру
idD, nameD, textD, idP(для связи с таблицей "подрубрики") вы представляете сколько там будет записей если действий более 10! Если каждую подрубрику можно как минимум купить, продать, большинство арендовать и обменять
Ой, так что мне тогда делать
вот какую мне тогда структуру для третьей таблицы сделать .....:(((((

   
 
 автор: cheops   (29.07.2005 в 00:24)   письмо автору
 
   для: lilu   (28.07.2005 в 22:03)
 

А для чего нужна третья таблица? Я было принялся её выдумывать, но мне кажется она лишняя...

   
 
 автор: lilu   (29.07.2005 в 14:41)   письмо автору
 
   для: cheops   (29.07.2005 в 00:24)
 

cheops: "А для чего нужна третья таблица? Я было принялся её выдумывать, но мне кажется она лишняя..."
А как же без неё!
А что же тогда с действиями делать, может их как-то программно задать например в виде массива но если подрубрики выводятся в цикле из базы то как опред-ые действия связать с конкретной подрубрикой! Ох!

   
 
 автор: Loki   (29.07.2005 в 15:48)   письмо автору
 
   для: lilu   (29.07.2005 в 14:41)
 

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

   
 
 автор: lilu   (29.07.2005 в 16:04)   письмо автору
 
   для: Loki   (29.07.2005 в 15:48)
 

Если честно я с таким не сталкивалась но возможно это выход, объясните на примере пожалуйста, я примерно поняла но всё же....

   
 
 автор: Loki   (29.07.2005 в 16:15)   письмо автору
 
   для: lilu   (29.07.2005 в 16:04)
 

Есть у нас знакомая Маша. Пытаемся описать следующие ее качества:
Высокая - 1
Стройная - 2
Умная - 4
незамужняя - 8

если сумма характеристик, которыми обладает Маша получилось 9, то мы знаем, что она высокая, полная, глупая и, как следствие, не замужем:)
если 7, то понятно что высокие, стройные и умные редко бывают свободны:) и так далее.

разбирал бы значения я слудующим образом:

<?
$masha
=9;
if (
$masha>=8$text.="незамужняя ";
$masha-=8;
if (
$masha>=4$text.="умная ";
$masha-=4;
if (
$masha>=2$text.="стройная ";
$masha-=2;
if (
$masha>=1$text.="высокая ";
$masha-=1;
echo 
$text;
?>

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

   
 
 автор: cheops   (29.07.2005 в 17:35)   письмо автору
 
   для: Loki   (29.07.2005 в 16:15)
 

Помоему для этих здач поле типа SET больше подходит... более наглядно получится...

   
 
 автор: Loki   (29.07.2005 в 17:53)   письмо автору
 
   для: cheops   (29.07.2005 в 17:35)
 

Собственно, по этому принципу оно и работает, если я правильно понял из описания.
Ну и кроме того, работая с полем SET мы все равно на выходе будем получать строку, которую придется разбирать.

   
 
 автор: cheops   (29.07.2005 в 18:01)   письмо автору
 
   для: Loki   (29.07.2005 в 17:53)
 

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

   
 
 автор: cheops   (29.07.2005 в 17:34)   письмо автору
 
   для: lilu   (29.07.2005 в 14:41)
 

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

   
 
 автор: lilu   (29.07.2005 в 18:25)   письмо автору
 
   для: cheops   (29.07.2005 в 17:34)
 

>Всё равно не понятно зачем нужна таблица для действий -
>приведите пример её использования если не сложно... нам
>очень трудно понять, что требуется так как у нас нет
>тех.задания и мы не знаем что требуется в конечном итоге от
>системы.
Может и не нужна
На самом деле задача кажется на первый взгляд очень простая!
Задача приём-подача объявлений!
Есть рубрики это - автомобили, быт. техника, недвижимость и т.д.
У каждой есть подрубрики например у автомобилей легковые и грузовые и т.д. у бытовой техники - холодильники, пылесосы и т.д. Каждая подрубрика имеет опред-ый набор действий, кот. может совпадать с действиями другой подрубрики а может и не совпадать! Пользователи должны иметь возможность разместить своё объявление и выбрать все его интересующие!

   
 
 автор: cheops   (29.07.2005 в 18:29)   письмо автору
 
   для: lilu   (29.07.2005 в 18:25)
 

Если этих действий меньше 64, то проще ввести в таблицу дополнительное поле типа SET - каждый бит этого поля может принимать 1 или 0 (включено/выключено). А при использовании поля можно будет оперировать списком действий. Если же операций больше 64, тогда действительно следует вводить третью таблицу и использовать многотабличные запросы.

   
 
 автор: lilu   (29.07.2005 в 18:38)   письмо автору
 
   для: cheops   (29.07.2005 в 18:29)
 

Действий 10!

Если можно напишите примерную сруктуру таблицы!

   
 
 автор: cheops   (29.07.2005 в 19:40)   письмо автору
 
   для: lilu   (29.07.2005 в 18:38)
 

А вы не могли бы перечислить названия действий, как вы хотите их назвать?

   
 
 автор: lilu   (29.07.2005 в 20:57)   письмо автору
 
   для: cheops   (29.07.2005 в 19:40)
 

Да конечно:
sell - продаю
buy - куплю
arenda - аренда
obmen - обмен
remont - ремонт
vakansii - вакансии
needjob - ищу работу
cando - предлагаю услуги
needdo - необходимы услуги
find - найдено
loss - утеряно
uhod - средства по уходу
ну вот примерно так, может что-то потом добавится

   
 
 автор: cheops   (29.07.2005 в 22:46)   письмо автору
 
   для: lilu   (29.07.2005 в 20:57)
 

Тогда к полям
id nameP textP

и
id nameP TextP idR

Добавьте ещё одно поле action
action SET('sell','buy','arenda','obmen','remont','vakansii','needjob','cando','needdo','find','loss','uhod') NOT NULL default ''

Добавлять данный в таблицу с таким полем можно следующим образом
INSERT INTO auth VALUES ('fgfdgfd', 'gfdgfdgd', 'sell,buy,arenda,obmen');
INSERT INTO auth VALUES ('fgfdgfd', 'gfdgdfgfdg', 'sell,buy,arenda,obmen,find,loss,uhod');

   
 
 автор: lilu   (03.08.2005 в 14:07)   письмо автору
 
   для: cheops   (29.07.2005 в 22:46)
 

Да об этом способе я думала с самого начала , но с полями типа set я никогда не работала, старалась их как-то заменить др. способом, но здесь видно придётся делать так как вы советуете!
Только я добавила поле action типа set не в таблицу подрубрики а в таблицу рубрики, т.к. для всех подрубрик одной рубрики действия одни и те же и вот какая структура таблиц у меня получилась:
rubrika
idR, nameR, textR, action
podrubrika
idP, nameP, textP, idR
И вот начались проблемы и непонятки для меня!
Я воспользовалась вашими запросом на вывод ссылок в виде названий рубрик, при нажатии на которую должны выводится радиогруппа названий соот-их подрубрик из таблицы подрубрики и названия соотв-их действий из таблицы рубрики! Подрубрики выводятся красиво а вот названия действий в виде списка одной строкой через запятуюю! Помогите мне с запросом!

   
 
 автор: cheops   (03.08.2005 в 14:13)   письмо автору
 
   для: lilu   (03.08.2005 в 14:07)
 

>Я воспользовалась вашими запросом на вывод ссылок в виде
>названий рубрик, при нажатии на которую должны выводится
>радиогруппа названий соот-их подрубрик из таблицы подрубрики
>и названия соотв-их действий из таблицы рубрики! Подрубрики
>выводятся красиво а вот названия действий в виде списка
>одной строкой через запятуюю! Помогите мне с запросом!
Ну всё правильно - вы просто разбейте строку на составные части
<?php
  $text 
'sell,buy,arenda,obmen,find,loss,uhod';
  
// Разбиваем строку по запятой
  
$arr explode(",",$text);
  
// Выводим содержимое массива $arr в цикле 
  
foreach($arr as $value) echo $value."<br>";
?>

   
 
 автор: Loki   (03.08.2005 в 14:23)   письмо автору
 
   для: lilu   (03.08.2005 в 14:07)
 

>названия действий в виде списка одной строкой через запятую
Как я понимаю, средствами mysql это не сделать, надо полученную строку разбирать потом средствами php... например

<?
$action
=explode(",",$action); //получаем массив значений.
?>

   
 
 автор: cheops   (03.08.2005 в 14:28)   письмо автору
 
   для: Loki   (03.08.2005 в 14:23)
 

Можно и средствами MySQL проверить имеется ли в списке значение или нет, но тут действительно удобнее разбить результат и работать с массивом.

   
 
 автор: lilu   (04.08.2005 в 15:40)   письмо автору
1.9 Кб
 
   для: cheops   (03.08.2005 в 14:28)
 

С ВЫВОДОМ массива действий я разобралась, но ... ПОТОМ ВООБЩЕ МРАК
вот так выводятся значения радиогруппы подрубрик

<?php 
$query2 
"SELECT textR FROM  rubrika WHERE idR=$_GET[idR]"
  
$sub2 mysql_query($query2); 
  if(!
$sub2) exit(mysql_error()); 
   while(
$cat2 mysql_fetch_array($sub2)) 
  { 
     echo 
"$cat2[textR]<br>"
  } 
?>


а вот так радиогруппа действий

<?php
 $query1 
"SELECT * FROM podrubrika WHERE idR=$_GET[idR]"
  
$sub1 mysql_query($query1); 
  if(!
$sub1) exit(mysql_error()); 
  
// В цикле выводим ссылки 
  
while($cat mysql_fetch_array($sub1)) 
  { 
     echo 
"<input type=radio>$cat[textP]<br>"
  } 

?>

Как будет выглядеть запрос на добавление записей в третью таблицу после выбора пользователем значений этих радиогрупп! Самое интересное что нажимаю на любое значение радиогруппы даже точка не появляется как буд-то значение не выбирается вовсе! Почему так!
Структура третьей таблицы
id - счётчик
idR - номер нажатой ссылки (название рубрики)
idP - номер выбранного значения радиогруппы из названий подрубрик
action - одно из выбранных действий в радиогруппе
text - текст объявления, кот. вводит сам пользователь в поле ввода
kontact - контактные данные, кот. вводит сам пользователь в поле ввода
data - текущая дата!
На всякий случай код в виде файла прилается!
Совсем запуталась с передаваемыми значениями!

   
 
 автор: cheops   (05.08.2005 в 18:27)   письмо автору
 
   для: lilu   (04.08.2005 в 15:40)
 

У вас имя радио-кнопкам не присвоено
<?php
 
echo "<input type=radio>$cat[textP]<br>";
?>

А всё, что не названо в HTML-форме не передаётся, следует обозвать группу радио-кнопок одним именем
<?php
 
echo "<input type=radio name=category>$cat[textP]<br>";
?>

   
 
 автор: lilu   (08.08.2005 в 13:16)   письмо автору
 
   для: cheops   (05.08.2005 в 18:27)
 

Да действительно, точки при выборе значения появляются но вот значение эта переменная хранит какое-то странное
вот например мой запрос
<?php
$q
="INSERT INTO full (idR, idP, action, text, kontact, data)
VALUES ('
$_GET[idR]', '$_POST[deyst]', '$_POST[categ]', '$_POST[textob]', '$_POST[kontact]', NOW())";
?>


вот какой результат
INSERT INTO full (idR, idP, action, text, kontact, data) VALUES ('', 'on', 'on', 'рррр', 'ееее', NOW())Данные внесены успешно
т.е. $_GET[idR] вообще не признаёт хотя в цикле названия подрубрик выводятся правильно!
$_POST[deyst] и $_POST[categ] - значение on! Почему так?

   
 
 автор: cheops   (08.08.2005 в 13:31)   письмо автору
 
   для: lilu   (08.08.2005 в 13:16)
 

Да всё правильно именно on присваивается по умолчанию, если вы хотите присвоить другое значение в тэг <input> следует добавить атрибут value
<?php 
echo "<input type=radio name=category value='$cat[textP]'>$cat[textP]<br>"
?>

   
 
 автор: lilu   (08.08.2005 в 15:58)   письмо автору
 
   для: cheops   (08.08.2005 в 13:31)
 

вот это то что надо, спасибо!
но $_GET[idR] всё равно не опознаётся
idR хранит значение - номер нажатой ссылки (название рубрики)
Я просто не понимаю почему когда я вывожу эту переменную

<?php
$w
=$_GET[idR];
echo 
"$w";
?>

то она показывает правильный номер, но как только дело доходит до запроса эта переменная как буд-то пустая ....:(((

   
 
 автор: lilu   (04.08.2005 в 15:56)   письмо автору
 
   для: cheops   (03.08.2005 в 14:28)
 

Первый файл, с кот. вызывается этот ...

   
 
 автор: Duran   (29.07.2005 в 11:29)   письмо автору
 
   для: lilu   (28.07.2005 в 22:03)
 

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

   
 
 автор: Loki   (29.07.2005 в 13:02)   письмо автору
 
   для: lilu   (28.07.2005 в 22:03)
 

Тогда я бы пошел другим путем:

id
...
тут поля с данными
...
уровень вложенности
родитель

При такой структуре вы можете организовать дерево любой степени вложенности и легко перемещать его элементы между ветвями.
То есть для верхнего уровня значение уровня вложенности будет 0, а родитель - NULL, для вложенных элементов - уровень 1, а в качестве родителя id родительской записи.
Удобно тем, что можно использовать рекурсию. Это же и неудобно:)

   
Rambler's Top100
вверх

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