Vraag over tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Thijs Nuis

Thijs Nuis

07/11/2020 23:38:04
Quote Anchor link
Hallo ik heb een probleempje met de site (Tabellen via MYSQL)

Zouden jullie kunnen helpen?

Dit had ik gisteren
Afbeelding

Dit heb ik op dit moment.

Afbeelding
Afbeelding
Afbeelding

Ik snap er geen rodebiet meer van helaas.
Gewijzigd op 07/11/2020 23:39:48 door - Ariën -
 
PHP hulp

PHP hulp

08/11/2024 19:54:47
 
- Ariën  -
Beheerder

- Ariën -

07/11/2020 23:46:44
Quote Anchor link
Hoi, leuk dat je hier nu je vraagt stelt :-)
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.
 
Thijs Nuis

Thijs Nuis

07/11/2020 23:49:20
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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()?>


waar moet die var_dump($sgmm) komen op de deze regel's?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<td><?=$sgmm['id']?></td>
 
- Ariën  -
Beheerder

- Ariën -

07/11/2020 23:52:30
Quote Anchor link
Na lijn 18 is een mooie plek; nadat je die variabele hebt aangemaakt.
Je ziet dan in ieder geval wat er in die variabele zit.
Gewijzigd op 07/11/2020 23:53:26 door - Ariën -
 
Thijs Nuis

Thijs Nuis

07/11/2020 23:56:10
Quote Anchor link
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 :|
 
- Ariën  -
Beheerder

- Ariën -

08/11/2020 00:08:45
Quote Anchor link
Je hebt dus alles in een aparte array staan die 0 heet.
Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?=$sgmm[0]['id']?>


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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

08/11/2020 15:21:22
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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]

Uiteraard de delen tussen < punthaken > zelf even invullen.
 
- Ariën  -
Beheerder

- Ariën -

09/11/2020 10:22:23
Quote Anchor link
Ik hoor net dat je het hebt opgelost?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.