Met PDO een SQLite3 tabel uitlezen en in HTML omzetten
Ik ben bezig met adresboek te ontwikkelen. Daarin zit database met een tabel contacts. Deze tabel bevat enkele basisgegevens: naam, adres, telefoonnummer en email. Nu wil de klant dat de mogelijkheid er is om velden toe te voegen (dat meldde hij later). Daardoor ontstaat een volledig dynamische tabel.
Nu is mijn vraag: is het mogelijk om zo'n dynamic table te fetchen, zodat ik hem toch volledig kan weergeven, inclusief de custom informatie?
De code die ik al heb, ziet er als volgt uit:
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
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
<?php
class Contacts
{
public getAll()
{
// Select all data from contacts
$query = $db->query('select * from contacts');
// create table
echo '<table>';
// create table header
echo '<theader><tr>';
for($counter=0; $counter < $query->columnCount(); $counter++) {
$meta = $query->getColumnMeta($counter); // get column meta data
echo '<th>'.$meta['name'].'</th>'; // print the column name from the meta data
}
echo '</tr></theader>';
// create table body
echo '<tbody>';
foreach($query as $row) {
// hier weet ik niet wat gedaan moet worden
}
echo '</tbody></table>';
}
}
[/code]
Zoals je kunt zien, heb ik wel al de tabelhoofding goed, maar ik weet niet hoe ik de tabelinhoud goed kan zetten.
Is er iemand die me een tip zou kunnen geven waar ik uitleg kan krijgen over hoe dit moet, of iemand die me wellicht wat op weg kan helpen?
Alvast bedankt :)
class Contacts
{
public getAll()
{
// Select all data from contacts
$query = $db->query('select * from contacts');
// create table
echo '<table>';
// create table header
echo '<theader><tr>';
for($counter=0; $counter < $query->columnCount(); $counter++) {
$meta = $query->getColumnMeta($counter); // get column meta data
echo '<th>'.$meta['name'].'</th>'; // print the column name from the meta data
}
echo '</tr></theader>';
// create table body
echo '<tbody>';
foreach($query as $row) {
// hier weet ik niet wat gedaan moet worden
}
echo '</tbody></table>';
}
}
[/code]
Zoals je kunt zien, heb ik wel al de tabelhoofding goed, maar ik weet niet hoe ik de tabelinhoud goed kan zetten.
Is er iemand die me een tip zou kunnen geven waar ik uitleg kan krijgen over hoe dit moet, of iemand die me wellicht wat op weg kan helpen?
Alvast bedankt :)
Gewijzigd op 07/06/2018 14:51:32 door Jordy Deweer
In een koppeltabel Velden_Personen koppel je dan de velden met de juiste personen, en bij het ophalen gebruik je een JOIN. Het voordeel is dat je onbeperkt aantal velden kan gebruiken bij een persoon zonder je structuur steeds aan te passen.
Ik zie niet echt wat je bedoelt... zou je eens een mini-voorbeeldje kunnen geven?
Maak bijvoorbeeld een whitelist van kolomnamen? Hardcoded of schrijf een klein beheerscherm waarin je aan kunt vinken wat iemand ziet?
En anders draai je gewoon alles af wat in de $row zit met nog een foreach?
Enne, cotnacts? :p
Gewijzigd op 07/06/2018 14:37:04 door Thomas van den Heuvel
Maar daar gaat het juist over: ik ken de keys in de array, of toch niet allemaal. Hoe kan ik dat dan oplossen?
Dat lijkt mij dan irrelevant?
Je weet ook hoeveel kolommen het zijn (columnCount()) en hoe deze heten (getColumnMeta()).
Waar loop je dan precies vast? Je kunt $row gewoon uitdraaien met een foreach()?
Werkt dit dan?:
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
Je hebt de kolomnamen daar niet nodig?
EDIT: op een soortgelijke wijze kun je on the fly de kolomnamen ophalen als je de eerste rij uitdraait.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// @todo check of er uberhaupt iets weer te geven valt?
?><table><?php
$printHeader = true;
foreach ($query as $row) {
if ($printHeader) {
?><thead><tr><?php
foreach ($row as $name => $whatever) {
?><td><?php echo $name; ?></td><?php
}
?></tr></thead>
<tbody><?php
$printHeader = false;
}
?><tr><?php
foreach ($row as $value) {
?><td><?php echo $value; ?></td><?php
}
?></tr><?php
}
?></tbody>
</table><?php
// @todo check of er uberhaupt iets weer te geven valt afsluithaak
?>
// @todo check of er uberhaupt iets weer te geven valt?
?><table><?php
$printHeader = true;
foreach ($query as $row) {
if ($printHeader) {
?><thead><tr><?php
foreach ($row as $name => $whatever) {
?><td><?php echo $name; ?></td><?php
}
?></tr></thead>
<tbody><?php
$printHeader = false;
}
?><tr><?php
foreach ($row as $value) {
?><td><?php echo $value; ?></td><?php
}
?></tr><?php
}
?></tbody>
</table><?php
// @todo check of er uberhaupt iets weer te geven valt afsluithaak
?>
Daarbij doe je er verstandig aan om output ($name, $value) te escapen.
Gewijzigd op 07/06/2018 15:13:34 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
contacts: //je bestaande tabel
- id //pri.key
- naam
- adres
- telefoonnummer
- email
contact_meta //deze moet "de klant" dus ergens kunnen beheren
- id //auto-inc pri.key
- naam //naam voor de "extra kolom"
- seq //sorteer volgorde (int)
contact_meta_data
- contact_id //ref naar contacts.id
- meta_id //ref naar contact_meta.id
- value //waarde
- id //pri.key
- naam
- adres
- telefoonnummer
contact_meta //deze moet "de klant" dus ergens kunnen beheren
- id //auto-inc pri.key
- naam //naam voor de "extra kolom"
- seq //sorteer volgorde (int)
contact_meta_data
- contact_id //ref naar contacts.id
- meta_id //ref naar contact_meta.id
- value //waarde
Als je nou je data op wilt halen doe je (pseudo code):
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
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
<?php
$metas = $db->record('select id,naam from contact_meta order by seq');
//retourneert een assoc.array met id => naam voor "extra kolommen" paren
//bijvoorbeeld [1 => 'Facebook', 2 => 'Twitter', ...]
//query opbouwen, incl meta data
$sql = 'select c.*';
foreach($metas as $id => $name) $sql .= ",
(select value from contact_meta_data where contact_id = c.id and meta_id = $id) as meta$id";
$sql .= "\n from contacts c";
//alle meta data zit dus per record als meta? (? = id) in hetzelfde record als de basisgegevens
//evt die($sql) en dan in phpMyAdmin uitvoeren om te zien hoe & wat
//tabel header (basis + meta)
print('<table><thead><th> {basisgegevens} </th>');
foreach($metas as $name) print('<th>' . htmlspecialchars($name) . '</th>');
print('</tr></thead><tbody>');
//tabel data (basis + meta)
foreach($db->all($sql) as $record){
print('<tr><td> {basisgegevens} </td>');
foreach($metas as $id => name) print('<td>' . htmlspecialchars($record['meta' . $id]) . '</td>');
print('</tr>');
}
//tabel sluiten
print('</tbody></table>');
?>
$metas = $db->record('select id,naam from contact_meta order by seq');
//retourneert een assoc.array met id => naam voor "extra kolommen" paren
//bijvoorbeeld [1 => 'Facebook', 2 => 'Twitter', ...]
//query opbouwen, incl meta data
$sql = 'select c.*';
foreach($metas as $id => $name) $sql .= ",
(select value from contact_meta_data where contact_id = c.id and meta_id = $id) as meta$id";
$sql .= "\n from contacts c";
//alle meta data zit dus per record als meta? (? = id) in hetzelfde record als de basisgegevens
//evt die($sql) en dan in phpMyAdmin uitvoeren om te zien hoe & wat
//tabel header (basis + meta)
print('<table><thead><th> {basisgegevens} </th>');
foreach($metas as $name) print('<th>' . htmlspecialchars($name) . '</th>');
print('</tr></thead><tbody>');
//tabel data (basis + meta)
foreach($db->all($sql) as $record){
print('<tr><td> {basisgegevens} </td>');
foreach($metas as $id => name) print('<td>' . htmlspecialchars($record['meta' . $id]) . '</td>');
print('</tr>');
}
//tabel sluiten
print('</tbody></table>');
?>
Gewijzigd op 07/06/2018 15:51:32 door Rob Doemaarwat
Waar je wel over na moet denken is het volgende: de bovestaande manier beschrijft enkel hoe je je data organiseert en IN je database krijgt. Misschien moet je ook even nadenken hoe je deze er weer UIT haalt, vooral als je wilt kunnen zoeken in deze data, met zoekvelden en filters enzo.