sqlite gegevens uit meerdere tabellen
Zou er iemand mij verder op weg kunnen helpen met volgend probleem?
Ik heb een tabel boeken en een tabel categorieën. De tabel boeken bevat allerlei detailgegevens zoals de titel, het isbn-nummer,.... en een categorie_id.
De tweede tabel categorieën bevat dan een primary key (categorie_id) en de naam van de categorie.
Allereerst heb ik query gemaakt die een lijst geeft met al de titels van de boeken, aanwezig in mijn bibliotheek. Wanneer ik op die titel klik, zou ik een nieuwe pagina moeten krijgen met al de details van dat ene boek.
Volgende query heb ik hiervoor geschreven :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
public function getDetails($id)
{
$sql ='SELECT boeken.*, categorieen.categorie, categorieen.categorie_id FROM boeken
JOIN categorieen WHERE boek_id=?';
$statement = $this->db->prepare($sql);
$data = array($id);
$statement = $this->makeStatement($sql, $data);
$model = $statement->fetchObject();
return $model;
}
?>
public function getDetails($id)
{
$sql ='SELECT boeken.*, categorieen.categorie, categorieen.categorie_id FROM boeken
JOIN categorieen WHERE boek_id=?';
$statement = $this->db->prepare($sql);
$data = array($id);
$statement = $this->makeStatement($sql, $data);
$model = $statement->fetchObject();
return $model;
}
?>
Het lukt met echter niet om de categorie_id uit de boekentabel om te zetten in de naam van de categorie.
Het zou superfijn zijn als iemand me een hint zou kunnen geven!
Zo te zien haal je de categorienaam helemaal niet op.
Ik haal hem inderdaad niet op en zie niet hoe ik dat wel kan doen.
Ik selecteer de naam in de query met categorieen.categorie (ik had dit misschien om verwarring te voorkomen beter categorienaam genoemd), maar dan loopt er iets mis.
Maar die kan je dan toch echoen.
De twee bestand uit mijn model :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class tabel
{
protected $db;
public function __construct($db)
{
$this->db = $db;
}
protected function makeStatement($sql,$data = null){
$statement = $this->db->prepare($sql);
try{
$statement->execute($data);
} catch (Exception $e) {
$msg = "<p>You tried to run this query: $sql</p>
<p>Exeption: $e</p>";
trigger_error($msg);
}
return $statement;
}
?>
class tabel
{
protected $db;
public function __construct($db)
{
$this->db = $db;
}
protected function makeStatement($sql,$data = null){
$statement = $this->db->prepare($sql);
try{
$statement->execute($data);
} catch (Exception $e) {
$msg = "<p>You tried to run this query: $sql</p>
<p>Exeption: $e</p>";
trigger_error($msg);
}
return $statement;
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
include_once "models/Table.class.php";
class Book_Table extends Tabel
{
public function getAllBooks()
{
$sql = "SELECT * FROM boeken";
$statement = $this->makeStatement($sql);
return $statement;
}
public function getDetails($id)
{
$sql = 'SELECT boeken.*, categorieen.categorie, categorieen.categorie_id FROM boeken
JOIN categorieen WHERE boek_id=?';
$statement = $this->db->prepare($sql);
$data = array($id);
$statement = $this->makeStatement($sql, $data);
$model = $statement->fetchObject();
return $model;
}
}
?>
include_once "models/Table.class.php";
class Book_Table extends Tabel
{
public function getAllBooks()
{
$sql = "SELECT * FROM boeken";
$statement = $this->makeStatement($sql);
return $statement;
}
public function getDetails($id)
{
$sql = 'SELECT boeken.*, categorieen.categorie, categorieen.categorie_id FROM boeken
JOIN categorieen WHERE boek_id=?';
$statement = $this->db->prepare($sql);
$data = array($id);
$statement = $this->makeStatement($sql, $data);
$model = $statement->fetchObject();
return $model;
}
}
?>
Mijn controllers :
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
include_once 'models/Book_Table.class.php';
$bookTable = new Book_Table($db);
$books = $bookTable->getAllBooks();
$booksAsHTML = include_once "views/admin/books_html.php";
return $booksAsHTML;
?>
include_once 'models/Book_Table.class.php';
$bookTable = new Book_Table($db);
$books = $bookTable->getAllBooks();
$booksAsHTML = include_once "views/admin/books_html.php";
return $booksAsHTML;
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include_once 'models/Book_Table.class.php';
$bookTable = new Book_Table($db);
$isBookClicked = isset($_GET['id']);
if($isBookClicked){
$bookId = $_GET['id'];
$bookData = $bookTable->getDetails($bookId);
$bookOutput = include_once "views/admin/details_html.php";
} else {
$books = $bookTable->getAllBooks();
$bookOutput = include_once "views/admin/books_html.php";
}
return $bookOutput;
?>
include_once 'models/Book_Table.class.php';
$bookTable = new Book_Table($db);
$isBookClicked = isset($_GET['id']);
if($isBookClicked){
$bookId = $_GET['id'];
$bookData = $bookTable->getDetails($bookId);
$bookOutput = include_once "views/admin/details_html.php";
} else {
$books = $bookTable->getAllBooks();
$bookOutput = include_once "views/admin/books_html.php";
}
return $bookOutput;
?>
en mijn views :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
$booksFound = isset ($books);
if ($booksFound === false){
trigger_error ( 'views/admin/books_html.php needs $books' );
}
$booksAsHTML = "
<div class='container'>
<form method='post' action='index.php?page=search' id='search-form'>
<input type='search' name='search-term' class='form-control'>
<button type='submit' value='Search' class='form-control' id='button-zoek'>Zoek</button>
</form>
<div id='booklistAdmin' class='table-responsive'>
<h2>Boekenlijst</h2>
<table id='adminTableBooks' class='table table-striped borderless '>
<thead>
<tr>
<td>Titel</td>
<td>Details</td>
<td>Aanpassen</td>
<td>Verwijderen</td>
</tr>
</thead>
<tbody>
";
while($book = $books->fetchObject()){
$href = "admin.php?page=details&id=$book->boek_id";
$booksAsHTML .= "
<tr>
<td>$book->titel</td>
<td><a class='fa fa-info-circle' href=\"$href\" ></a></td>
<td><a class='fa fa-wrench'></a></td>
<td><a class='fa fa-trash-o'></a></td>
</tr>
";
}
$booksAsHTML .= "
</tbody>
</table>
</div>
</div>
";
return $booksAsHTML;
?>
$booksFound = isset ($books);
if ($booksFound === false){
trigger_error ( 'views/admin/books_html.php needs $books' );
}
$booksAsHTML = "
<div class='container'>
<form method='post' action='index.php?page=search' id='search-form'>
<input type='search' name='search-term' class='form-control'>
<button type='submit' value='Search' class='form-control' id='button-zoek'>Zoek</button>
</form>
<div id='booklistAdmin' class='table-responsive'>
<h2>Boekenlijst</h2>
<table id='adminTableBooks' class='table table-striped borderless '>
<thead>
<tr>
<td>Titel</td>
<td>Details</td>
<td>Aanpassen</td>
<td>Verwijderen</td>
</tr>
</thead>
<tbody>
";
while($book = $books->fetchObject()){
$href = "admin.php?page=details&id=$book->boek_id";
$booksAsHTML .= "
<tr>
<td>$book->titel</td>
<td><a class='fa fa-info-circle' href=\"$href\" ></a></td>
<td><a class='fa fa-wrench'></a></td>
<td><a class='fa fa-trash-o'></a></td>
</tr>
";
}
$booksAsHTML .= "
</tbody>
</table>
</div>
</div>
";
return $booksAsHTML;
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
$bookFound = isset($bookData);
if($bookFound === false) {
trigger_error('views/entry-html.php needs an $bookData object');
}
return "
<div class='container'>
<h2>Boekfiche van : $bookData->isbn</h2>
<div class='info-onderdeel'>
<table id='boekdetails'>
<tr>
<td>IISBN :</td>
<td>$bookData->isbn</td>
</tr>
<tr>
<td>Prijs :</td>
<td>€ $bookData->prijs</td>
</tr>
<tr>
<td>Categorie :</td>
<td><$bookData->categorie_id></td>
</tr>
</table>
</div>
<div class='info-onderdeel'>
</div>
<div class='info-onderdeel'>
<img src='' alt='$bookData->titel'>
</div>
</div>
";
?>
$bookFound = isset($bookData);
if($bookFound === false) {
trigger_error('views/entry-html.php needs an $bookData object');
}
return "
<div class='container'>
<h2>Boekfiche van : $bookData->isbn</h2>
<div class='info-onderdeel'>
<table id='boekdetails'>
<tr>
<td>IISBN :</td>
<td>$bookData->isbn</td>
</tr>
<tr>
<td>Prijs :</td>
<td>€ $bookData->prijs</td>
</tr>
<tr>
<td>Categorie :</td>
<td><$bookData->categorie_id></td>
</tr>
</table>
</div>
<div class='info-onderdeel'>
</div>
<div class='info-onderdeel'>
<img src='' alt='$bookData->titel'>
</div>
</div>
";
?>
Als resultaat krijg ik al mijn gegevens, alleen bij de categorie krijg ik het id 1 waar eigenlijk kookboek zou moeten komen.
Verabder dat in de veldnaam van de naam.
Toevoeging op 28/02/2016 20:36:49:
Even corrigeren en beter formuleren : al mijn details worden weergegeven, maar bij de categorie blijft alles leeg.
Anders zou ik het zo even ook niet weten.
Ik zou zoiets verwachten als JOIN categorieen ON (categorieen.categorie_id = boeken.categorie_id) maar mogelijk is de syntax/het verband tussen tabellen in sqlite iets anders?