Vraag over tabellen
Zouden jullie kunnen helpen?
Dit had ik gisteren
Dit heb ik op dit moment.
Ik snap er geen rodebiet meer van helaas.
Gewijzigd op 07/11/2020 23:39:48 door - Ariën -
Code's kan je hier ook tussen [code] en [/code] plaatsen.
Kijk eens wat een var_dump($sgmm) doet.
Verder nog wat tips (die ik je al had verteld)
- DRY: Don't Repeat Yourself. Zorg dat je geen codes en databasestructuren herhaalt.
- Soorten een eigen tabel geven is niet de bedoeling. Maak een tabel voor de treinsoorten en een voor de nummers. Zorg dat je met een ID-nummer een koppeling tussen beiden realiseert. Niet is zo vervelend om bij een database-aanpassing straks 40 tabellen door te lopen.
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include 'functions.php';
// Connect to MySQL database
$pdo = pdo_connect_mysql();
// Get the page via GET request (URL param: page), if non exists default the page to 1
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
// Number of records to show on each page
$records_per_page = 25;
// Prepare the SQL statement and get records from our contacts table, LIMIT will determine the page
$stmt = $pdo->prepare('SELECT * FROM sgmm ORDER BY id LIMIT :current_page, :record_per_page');
$stmt->bindValue(':current_page', ($page-1)*$records_per_page, PDO::PARAM_INT);
$stmt->bindValue(':record_per_page', $records_per_page, PDO::PARAM_INT);
$stmt->execute();
// Fetch the records so we can display them in our template.
$sgmm = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Get the total number of contacts, this is so we can determine whether there should be a next and previous button
$num_sgmm = $pdo->query('SELECT COUNT(*) FROM sgmm')->fetchColumn();
?>
<?=template_header('Read')?>
<div class="content read">
<p>Op dit moment werken we de pagina nummers bij na een nieuwe versie. Deze geeft dus een error aan in de tabellen. We werken er hard aan om dit op te lossen</p>
<h2>Nummers</h2>
<a href="create.php" class="create-contact">Voeg een nummer toe</a>
<table>
<thead>
<tr>
<td>nummer</td>
<td>dienstnummer</td>
<td>vervoerder</td>
<td>bijzonderheden</td>
<td>status</td>
<td>datum laatste signaal</td>
<td>Bijgewerkt op:</td>
<td></td>
</tr>
</thead>
<tbody>
<tr>
<td><?=$sgmm['id']?></td>
<td><?=$sgmm['nummer']?></td>
<td><?=$sgmm['vervoerder']?></td>
<td><?=$sgmm['status']?></td>
<td><?=$sgmm['bijzonderheden']?></td>
<td><?=$sgmm['datum']?></td>
<td><?=$sgmm['editdatum']?></td>
<td class="actions">
<a href="update.php?id=<?=$sgmm['id']?>" class="edit"><i class="fas fa-pen fa-xs"></i></a>
<a href="delete.php?id=<?=$sgmm['id']?>" class="trash"><i class="fas fa-trash fa-xs"></i></a>
</td>
</tr>
</tbody>
</table>
<div class="pagination">
<?php if ($page > 1): ?>
<a href="nummers.php?page=<?=$page-1?>"><i class="fas fa-angle-double-left fa-sm"></i></a>
<?php endif; ?>
<?php if ($page*$records_per_page < $num_sgmm): ?>
<a href="nummers.php?page=<?=$page+1?>"><i class="fas fa-angle-double-right fa-sm"></i></a>
<?php endif; ?>
</div>
</div>
<?=template_footer()?>
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include 'functions.php';
// Connect to MySQL database
$pdo = pdo_connect_mysql();
// Get the page via GET request (URL param: page), if non exists default the page to 1
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
// Number of records to show on each page
$records_per_page = 25;
// Prepare the SQL statement and get records from our contacts table, LIMIT will determine the page
$stmt = $pdo->prepare('SELECT * FROM sgmm ORDER BY id LIMIT :current_page, :record_per_page');
$stmt->bindValue(':current_page', ($page-1)*$records_per_page, PDO::PARAM_INT);
$stmt->bindValue(':record_per_page', $records_per_page, PDO::PARAM_INT);
$stmt->execute();
// Fetch the records so we can display them in our template.
$sgmm = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Get the total number of contacts, this is so we can determine whether there should be a next and previous button
$num_sgmm = $pdo->query('SELECT COUNT(*) FROM sgmm')->fetchColumn();
?>
<?=template_header('Read')?>
<div class="content read">
<p>Op dit moment werken we de pagina nummers bij na een nieuwe versie. Deze geeft dus een error aan in de tabellen. We werken er hard aan om dit op te lossen</p>
<h2>Nummers</h2>
<a href="create.php" class="create-contact">Voeg een nummer toe</a>
<table>
<thead>
<tr>
<td>nummer</td>
<td>dienstnummer</td>
<td>vervoerder</td>
<td>bijzonderheden</td>
<td>status</td>
<td>datum laatste signaal</td>
<td>Bijgewerkt op:</td>
<td></td>
</tr>
</thead>
<tbody>
<tr>
<td><?=$sgmm['id']?></td>
<td><?=$sgmm['nummer']?></td>
<td><?=$sgmm['vervoerder']?></td>
<td><?=$sgmm['status']?></td>
<td><?=$sgmm['bijzonderheden']?></td>
<td><?=$sgmm['datum']?></td>
<td><?=$sgmm['editdatum']?></td>
<td class="actions">
<a href="update.php?id=<?=$sgmm['id']?>" class="edit"><i class="fas fa-pen fa-xs"></i></a>
<a href="delete.php?id=<?=$sgmm['id']?>" class="trash"><i class="fas fa-trash fa-xs"></i></a>
</td>
</tr>
</tbody>
</table>
<div class="pagination">
<?php if ($page > 1): ?>
<a href="nummers.php?page=<?=$page-1?>"><i class="fas fa-angle-double-left fa-sm"></i></a>
<?php endif; ?>
<?php if ($page*$records_per_page < $num_sgmm): ?>
<a href="nummers.php?page=<?=$page+1?>"><i class="fas fa-angle-double-right fa-sm"></i></a>
<?php endif; ?>
</div>
</div>
<?=template_footer()?>
waar moet die var_dump($sgmm) komen op de deze regel's?
Je ziet dan in ieder geval wat er in die variabele zit.
Gewijzigd op 07/11/2020 23:53:26 door - Ariën -
array(1) { [0]=> array(7) { ["id"]=> string(4) "2111" ["nummer"]=> string(4) "2111" ["vervoerder"]=> string(2) "NS" ["status"]=> string(9) "Ter Zijde" ["bijzonderheden"]=> string(0) "" ["datum"]=> string(10) "2020-11-07" ["editdatum"]=> string(19) "2020-11-07 23:33:11" } } Euhhh??? heb het toegevoegd en krijg nu dit :|
Dus:
Ik gebruik geen PDO, dus ik zie even niet hoe dit kan, en of dit iets van PDO is.
Update:
Voor een enkele kolom moet je dus PDO::FETCH_COLUMN gebruiken, lees ik.
Dan kan het wel.
Update 2:
Wordt al laat, ik dacht dat het om een enkel record ging. Maar je wilt toch alles zien? Dan moet je alles in een loop, een foreach tonen. Anders krijg je gewoon enkel het eerste element terug.
Gewijzigd op 08/11/2020 00:16:46 door - Ariën -
fetchAll() retourneert een array van elementen, dus ik zie niet hoe bovenstaande code (in die vorm) ooit heeft kunnen werken.
Je zult dus in ieder geval een lus moeten hebben die alle resultaten afloopt.
Daarbij implementeert PDOStatement de Traversable interface, dus in plaats van een fetchAll() plus een loop kun je simpelweg een foreach uitvoeren op het PDOStatement zelf:
Dan loont het de moeite om alles in try-catch blokken te zetten, want dat is toch een beetje de wijze waarop je PDO gebruikt. Ik hoop dat het aanmaken van de connectie ook binnen een try-catch blok staat.
En tot slot heeft MySQL nog een "optimalisatie", indien je het keyword SQL_CALC_FOUND_ROWS meegeeft aan de initiële LIMIT-query, kun je in de eerstvolgende query direct het totaal aantal records opvragen die je gekregen zou hebben indien het LIMIT-statement was weggelaten inclusief enige overige condities. Dit voert dus nog wat verder dan simpelweg een COUNT() (zonder condities). In de eerstvolgende query vraag je het totaal aantal resultaten op met FOUND_ROWS().
Ook loont het de moeite om PDO te configureren voor gebruik van een MySQL-database, want PDO staat niet op voorhand ingesteld voor gebruik van welke database dan ook.
Om dit alles te demonstreren in een enkel voorbeeld:
Uiteraard de delen tussen < punthaken > zelf even invullen.
Je zult dus in ieder geval een lus moeten hebben die alle resultaten afloopt.
Daarbij implementeert PDOStatement de Traversable interface, dus in plaats van een fetchAll() plus een loop kun je simpelweg een foreach uitvoeren op het PDOStatement zelf:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$st = $db->prepare(...);
$st->execute();
foreach ($st as $row) {
// doe iets met $row
}
?>
$st = $db->prepare(...);
$st->execute();
foreach ($st as $row) {
// doe iets met $row
}
?>
Dan loont het de moeite om alles in try-catch blokken te zetten, want dat is toch een beetje de wijze waarop je PDO gebruikt. Ik hoop dat het aanmaken van de connectie ook binnen een try-catch blok staat.
En tot slot heeft MySQL nog een "optimalisatie", indien je het keyword SQL_CALC_FOUND_ROWS meegeeft aan de initiële LIMIT-query, kun je in de eerstvolgende query direct het totaal aantal records opvragen die je gekregen zou hebben indien het LIMIT-statement was weggelaten inclusief enige overige condities. Dit voert dus nog wat verder dan simpelweg een COUNT() (zonder condities). In de eerstvolgende query vraag je het totaal aantal resultaten op met FOUND_ROWS().
Ook loont het de moeite om PDO te configureren voor gebruik van een MySQL-database, want PDO staat niet op voorhand ingesteld voor gebruik van welke database dan ook.
Om dit alles te demonstreren in een enkel voorbeeld:
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
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
<?php
// voor ontwikkeling
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// voor debugging
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.escape($in).'</pre>';
}
// voor output
header('Content-Type: text/html; charset=UTF-8');
try {
$db = new pdo('mysql:host=<HOST>;dbname=<DB>;charset=utf8', '<USER>', '<PASSWORD>', array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // maak gebruik van exceptions
PDO::ATTR_EMULATE_PREPARES => false, // gebruik native prepared statements
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // default fetch modus
));
} catch (Exception $e) {
echo $e->getMessage(); // waarschijnlijk niet verstandig om te dumpen in een productie-omgeving
}
try {
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1; // is_numeric is mogelijk niet de beste manier om te achterhalen of iets een getal is
$records_per_page = 25;
$st = $db->prepare('SELECT SQL_CALC_FOUND_ROWS * FROM <TABLE> ORDER BY <ID> LIMIT :current_page, :records_per_page');
$st->bindValue(':current_page', ($page - 1) * $records_per_page);
$st->bindValue(':records_per_page', $records_per_page);
$st->execute();
$total = $db->query('SELECT FOUND_ROWS()')->fetchColumn(); // na de execute kun je FOUND_ROWS opvragen
echo 'fetched: '.$st->rowCount().' total: '.$total;
foreach ($st as $row) { // maak gebruik van het feit dat PDOStatement Traversable implementeert
dump($row);
}
} catch (Exception $e) {
echo $e->getMessage();
}
?>[end]
// voor ontwikkeling
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// voor debugging
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.escape($in).'</pre>';
}
// voor output
header('Content-Type: text/html; charset=UTF-8');
try {
$db = new pdo('mysql:host=<HOST>;dbname=<DB>;charset=utf8', '<USER>', '<PASSWORD>', array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // maak gebruik van exceptions
PDO::ATTR_EMULATE_PREPARES => false, // gebruik native prepared statements
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // default fetch modus
));
} catch (Exception $e) {
echo $e->getMessage(); // waarschijnlijk niet verstandig om te dumpen in een productie-omgeving
}
try {
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1; // is_numeric is mogelijk niet de beste manier om te achterhalen of iets een getal is
$records_per_page = 25;
$st = $db->prepare('SELECT SQL_CALC_FOUND_ROWS * FROM <TABLE> ORDER BY <ID> LIMIT :current_page, :records_per_page');
$st->bindValue(':current_page', ($page - 1) * $records_per_page);
$st->bindValue(':records_per_page', $records_per_page);
$st->execute();
$total = $db->query('SELECT FOUND_ROWS()')->fetchColumn(); // na de execute kun je FOUND_ROWS opvragen
echo 'fetched: '.$st->rowCount().' total: '.$total;
foreach ($st as $row) { // maak gebruik van het feit dat PDOStatement Traversable implementeert
dump($row);
}
} catch (Exception $e) {
echo $e->getMessage();
}
?>[end]
Uiteraard de delen tussen < punthaken > zelf even invullen.
Ik hoor net dat je het hebt opgelost?