Я работаю над небольшой онлайн-системой, чтобы сортировать свои книги, но наткнулся на проблему, и теперь я пытаюсь решить несколько часов без везения.Мне нужна помощь в моей базе данных PDO
В моей базе данных у меня есть таблица titles
с информацией о книге (title_id
, title
, author
...) и второй таблицей title_relations
с полями title_relation_id
, title_id
, to_title_id
и titlerelation
.
Когда я обращаюсь к информации о книге, есть поле related titles
, которое должно перечислить все приквелы, сиквелы и побочные эффекты.
База данных выглядит следующим образом:
названия
title_id 1 title Lord of the Rings: The Fellowship of the Ring ... title_id 2 title Lord of the Rings: The Two Towers ... title_id 3 title Lord of the Rings: The Return of the King ...
title_relations
title_relation_id 1 title_id 1 to_title_id 2 titlerelation prequel title_relation_id 1 title_id 1 to_title_id 3 titlerelation prequel
Теперь я ВЫЗОВ информацию для Братство Кольца и хотите, чтобы были показаны ссылки на Две башни и Возвращение короля. Как мне получить информацию?
Я получил это работает для одного заголовка отношения, но больше, чем я был бы нужен
foreach($title_relations as $row) {
}
, в котором хранит информацию от title_relations в переменных ($to_title_id_1
, $titlerelation_1
, $to_title_id_2
, $titlerelation_2
, .. .), массив или что-то еще подобное.
Ничего не пробовал работать, поэтому любая предлагаемая помощь будет высоко оценена.
Я использую PDO для получения информации о базе данных.
Старый код (не работает):
try {
$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$dbh->exec("SET CHARACTER SET utf8");
if($page == 'title'){
#titles zuordnen
$titles = $dbh->prepare("SELECT * FROM titles WHERE title_id = $id");
$titles->execute();
while($row = $titles->fetch(PDO::FETCH_OBJ)) {
$title = $row->title;
/* deleted the other infos */
}
#title_relations zuordnen
$title_relations = $dbh->prepare("SELECT * FROM title_relations WHERE title_id = $id");
$title_relations->execute();
while($row = $title_relations->fetch(PDO::FETCH_OBJ)) {
$to_title = $row->to_title_id;
$relation_type = $row->titlerelation;
}
#to_title Seriennamen zuordnen
$series_name = $dbh->prepare("SELECT * FROM titles WHERE title_id = $to_title");
$series_name->execute();
while($row = $series_name->fetch(PDO::FETCH_OBJ)) {
$series = $row->title;
}
}
#Datenbank schließen
$dbh = null; } catch(PDOException $exceptionpdo){
echo 'ERROR: ' . $exceptionpdo->getMessage(); }
Текущий код (работает!):
try {
$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$dbh->exec("SET CHARACTER SET utf8");
if($page == 'title'){
// titles zuordnen
// Here I binded the $id in execute, not in prepare
$titles = $dbh->prepare("SELECT title FROM titles WHERE title_id = ?");
$titles->bindParam(1, $id, PDO::PARAM_INT);
$titles->execute();
// Here you are expecting a single row, I guess title_id is a primary key, so you don't needa loop
$row = $titles->fetch(PDO::FETCH_OBJ);
$title = $row->title;
// title_relations zuordnen
$title_relations = $dbh->prepare("SELECT title_relation_id, title_id, to_title_id, titlerelation FROM title_relations WHERE title_id = ?");
$title_relations->bindParam(1, $id, PDO::PARAM_INT);
$title_relations->execute();
$series = array(); // In this array we will store all the related titles
while($row = $title_relations->fetch(PDO::FETCH_OBJ)) {
// zu_title Serieninfo zuordnen
$series_info = $dbh->prepare("SELECT title_id, title FROM titles WHERE title_id = ?");
$series_info->bindParam(1, $row->to_title_id, PDO::PARAM_INT);
$series_info->execute();
while($row = $series_info->fetch(PDO::FETCH_OBJ)) {
$series[] = $row;
}
}
#Datenbank schließen
$dbh = null;
}
} catch(PDOException $exceptionpdo){
echo 'ERROR: ' . $exceptionpdo->getMessage();
}
Можете ли вы показать, как вы его работали для одного титульного отношения, пожалуйста? – Ryan
Пожалуйста, покажите свой запрос. Вы используете 'JOIN'? –
Разве вы не должны хранить обратную связь где-нибудь? (Title_id = 2, to_title_id = 1, titlerelation = sequel) '? – Wrikken