MySQL, PHP отношение многие ко многим - PullRequest
1 голос
/ 10 апреля 2011

У меня есть отношения «многие ко многим» между человеком и интересами. Это означает, что мне пришлось создать промежуточную таблицу с именем person_interests.

Таблица Person была создана с использованием:

create table if not exists Person
(
  id int not null auto_increment primary key,
  username varchar(10) not null,
  name varchar(40) not null,
  gender varchar(6) not null,
  dateOfBirth timestamp not null,
  signUpDate timestamp not null,
  email varchar(40) not null
);

Таблица интересов была создана с использованием:

create table if not exists interests
(
    id int not null auto_increment primary key,
    interestName varchar(10) not null
);

insert into interests(id, interestName)
values
(1, 'sport'),
(2, 'computer'),
(3, 'dancing'),
(4, 'boating'),
(5, 'car');

и person_interests были созданы с использованием:

create table if not exists person_interests
(
    id int not null auto_increment primary key,
    UserID int not null,
    foreign key (UserID) references Person(id),
    Interestid int not null,
    foreign key (Interestid) references interests(id)
);

Я пытаюсь выбрать записи из таблицы person_interests, но безуспешно. Моя PHP-функция для этого:

function get_person_interests($id)
{
    $connection = mysql_open();
    $query = "select pi.UserID, i.interestName from interests as i, person_interests as pi, where i.id = pi.interestid";

    $result = mysql_query($query, $connection) or show_error();

    $person_interests = array();

    while($person_interest = mysql_fetch_array($result))
    {
        $person_interests = $person_interest;
    }

    mysql_close($connection) or show_error();
    return $person_interests;
}

Но это не работает! Вот как выглядит мой шаблон (user_detail.tpl):

{foreach $interests as $interest}
    <li>{$interest.interestName}</li>
{/foreach}

и вот как выглядит мой user_detail.php:

$id = $_GET['id'];

$Person = get_person($id);

$interests = get_person_interests($id);

$smarty = new Smarty;
$smarty->assign("Person", $Person);
$smarty->assign("interests", $interests);
$smarty->display("user_detail.tpl")

Я пытаюсь отобразить интересы, которые пользователь выбрал при регистрации. Они хранятся в таблице person_interests. Каждый раз, когда я пытаюсь перейти на страницу user_detail.php, она выдает мне эту ошибку:

Error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where i.id = pi.interestid' at line 1

Если кто-нибудь сможет мне помочь, тогда это будет очень ценно!

Ответы [ 3 ]

3 голосов
/ 10 апреля 2011

Ошибка синтаксиса SQL.Вы не должны иметь запятую перед предложением where.Я бы посоветовал вам написать свой запрос как объединение:

$query = "select pi.UserID, i.interestName from person_interests as pi join interests as i on i.id = pi.interestid";

Конечно, если вы хотите, чтобы интересы конкретного человека (который предлагает ваш код), вам нужно отфильтровать по user_id:

$query = "select pi.UserID, i.interestName from person_interests as pi join interests as i on i.id = pi.interestid where pi.UserID =" . mysql_escape_string($id);

В ответ на ваш комментарий:

Я думаю, вы хотите заменить эту строку:

$person_interests = $person_interest;

На:

$person_interests[] = $person_interest;
0 голосов
/ 10 апреля 2011

В вашем запросе SQL есть ошибка, которую вы должны сначала отладить.

Подключитесь к вашей базе данных с помощью клиента командной строки (команда называется mysql).

Затем напишите запрос SQLв текстовом редакторе.Затем скопируйте запрос и вставьте его в клиент командной строки для его запуска.

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

Затем вы можете принять запрос в своем редакторе и повторить попытку.

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

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

0 голосов
/ 10 апреля 2011

Похоже на опечатку.У вас есть "Interestid" в вашей таблице, но "интересный" в вашем запросе.Обратите внимание на разницу в регистре.И у вас есть запятая после вашего где.Вы должны переписать это, используя соединение, выполнив:

select
    pi.UserId,
    i.interestname
from
    person_interests pi
left join
    interests i
on
    pi.Interestid = i.id
...