私は自分の本を分類するための小さなオンライン システムに取り組んでいますが、何時間も解決しようとしている問題に出くわしました。
私のデータベースにはtitles
、本の情報 ( title_id
、title
、author
...) を持つテーブルtitle_relations
と、フィールドtitle_relation_id
、title_id
、を持つ 2 番目のテーブルがto_title_id
ありますtitlerelation
。
本の情報を呼び出すと、related titles
すべての前日譚、続編、およびスピンオフをリストすることになっているフィールドがあります。
データベースは次のようになります。
タイトル
タイトル_id 1 タイトル ロード・オブ・ザ・リング: フェローシップ・オブ・ザ・リング ... タイトル_id 2 タイトル ロード・オブ・ザ・リング: 二つの塔 ... タイトル_id 3 タイトル ロード・オブ・ザ・リング: ザ・リターン・オブ・ザ・キング ...
タイトル関係
title_relation_id 1 タイトル_id 1 to_title_id 2 タイトル関係 前日譚 title_relation_id 1 タイトル_id 1 to_title_id 3 タイトル関係 前日譚
今、私は指輪の交わりの情報を呼び出しており、 2 つの塔と王の帰還へのリンクを表示したいと考えています。そこにある情報を入手するにはどうすればよいですか?
1 つのタイトル関係で機能するようになりましたが、それ以上の場合は
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();
}