Dynamische Tabelle in HTML mit MySQL und PHP

Lesezeit: 7 Minuten

Dynamische Tabelle in HTML mit MySQL und PHP
SR

Ich habe viele Beiträge darüber gesehen, wie man eine Tabelle in HTML mit PHP und Mysql erstellt, aber mein Problem ist, dass ich oft die Kopfzeilen von MySQL-Spalten ändere. Gibt es eine Möglichkeit, dass PHP den Code automatisch aktualisiert, sodass ich einfach den Tabellennamen eingeben kann und die Tabelle gedruckt wird, ohne dass ich alle Tags einfügen muss?

<?php

$table = "user";
$database = "database";
$conn = mysqli_connect("localhost", "username", "password", "database", "3306");

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM $table";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "<tr><td>" . $row["id"] . "</td><td>" . $row["first_name"] . "</td><td>" . $row["last_name"] . "</td><td>" . $row["birthday"] . "</td></tr>";
    }
    echo "</table>";
} else {
    echo "0 result";
}

$conn->close();

  • Wenn Sie verwenden müssen mysqli_*können Sie verwenden mysqli_fetch_fields() um ein Array von Spaltennamen zu erhalten.

    – kmoser

    10. Oktober 2020 um 17:58 Uhr

Dynamische Tabelle in HTML mit MySQL und PHP
Dharman

Wenn Sie den vollständigen Inhalt der Datenbanktabelle als HTML-Tabelle anzeigen möchten, schlage ich vor, dass Sie eine Funktion erstellen, die all dies dynamisch für Sie erledigt. Diese Funktion sollte prüfen, ob die Tabelle vorhanden ist, alle Daten abrufen und die HTML-Ausgabetabelle mit Kopfzeilen abrufen.

MySQLi-Lösung

Hier ist mein Vorschlag mit MySQLi. Zunächst müssen Sie sicherstellen, dass die Tabelle tatsächlich existiert. Dann können Sie alle Daten aus der Tabelle abrufen. Das von zurückgegebene Objekt mysqli::query() enthält alle Metadateninformationen zu Spaltennamen, die Sie verwenden können, um die Kopfzeile anzuzeigen. Sie können verwenden fetch_fields() um über die Metadaten jeder Spalte zu iterieren. Die Daten können mit abgerufen werden fetch_all() Methode.

<?php

// create global connection using mysqli
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = mysqli_connect("localhost", "username", "password", "database", "3306");
$mysqli->set_charset('utf8mb4'); // always set the charset

function outputMySQLToHTMLTable(mysqli $mysqli, string $table)
{
    // Make sure that the table exists in the current database!
    $tableNames = array_column($mysqli->query('SHOW TABLES')->fetch_all(), 0);
    if (!in_array($table, $tableNames, true)) {
        throw new UnexpectedValueException('Unknown table name provided!');
    }
    $res = $mysqli->query('SELECT * FROM '.$table);
    $data = $res->fetch_all(MYSQLI_ASSOC);
    
    echo '<table>';
    // Display table header
    echo '<thead>';
    echo '<tr>';
    foreach ($res->fetch_fields() as $column) {
        echo '<th>'.htmlspecialchars($column->name).'</th>';
    }
    echo '</tr>';
    echo '</thead>';
    // If there is data then display each row
    if ($data) {
        foreach ($data as $row) {
            echo '<tr>';
            foreach ($row as $cell) {
                echo '<td>'.htmlspecialchars($cell).'</td>';
            }
            echo '</tr>';
        }
    } else {
        echo '<tr><td colspan="'.$res->field_count.'">No records in the table!</td></tr>';
    }
    echo '</table>';
}

outputMySQLToHTMLTable($mysqli, 'user');

PDO-Lösung

Die Verwendung von PDO ist sehr ähnlich, aber Sie müssen auf die Unterschiede in den APIs achten.

Um die Tabellennamen zu erhalten, können Sie verwenden fetchAll(PDO::FETCH_COLUMN) anstatt array_column(). Um die Spaltenmetadaten abzurufen, müssen Sie verwenden getColumnMeta() Funktion.

<?php

$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'username', 'password', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

function outputMySQLToHTMLTable(pdo $pdo, string $table)
{
    // Make sure that the table exists in the current database!
    $tableNames = $pdo->query('SHOW TABLES')->fetchAll(PDO::FETCH_COLUMN);
    if (!in_array($table, $tableNames, true)) {
        throw new UnexpectedValueException('Unknown table name provided!');
    }
    $stmt = $pdo->query('SELECT * FROM '.$table);
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $columnCount = $stmt->columnCount();
    
    echo '<table>';
    // Display table header
    echo '<thead>';
    echo '<tr>';
    for ($i = 0; $i < $columnCount; $i++) {
        echo '<th>'.htmlspecialchars($stmt->getColumnMeta($i)['name']).'</th>';
    }
    echo '</tr>';
    echo '</thead>';
    // If there is data then display each row
    if ($data) {
        foreach ($data as $row) {
            echo '<tr>';
            foreach ($row as $cell) {
                echo '<td>'.htmlspecialchars($cell).'</td>';
            }
            echo '</tr>';
        }
    } else {
        echo '<tr><td colspan="'.$columnCount.'">No records in the table!</td></tr>';
    }
    echo '</table>';
}

outputMySQLToHTMLTable($pdo, 'user');

PS Die Tabellenexistenzprüfung kann stattdessen mit folgendem Code optimiert werden:

$tableNames = $pdo->prepare('SELECT COUNT(1) FROM information_schema.TABLES WHERE TABLE_SCHEMA = SCHEMA() AND TABLE_NAME=?');
$tableNames->execute([$table]);
if (!$tableNames->fetchColumn()) {
    throw new UnexpectedValueException('Unknown table name provided!');
}

Ich habe gerade Ihre Frage gelesen und entsprechend Ihren Anforderungen codiert, aber ich habe PDO und nicht MYSQLI verwendet. Vielleicht ist es für Sie besser, den Code zu verstehen, da mit PDO alles einfacher ist. Und so wie ich es gemacht habe, müssen Sie nicht alle Tags einfügen, PHP wird automatisch aktualisiert und Sie wissen, dass die Datei mit der Erweiterung .php enden muss!

<?php

$conn = new PDO("mysql:host=localhost;dbname=YOUR_DATABASE_HERE", "USERNAME", "PASSWORD");


if(!$conn){
    echo "Could not connect!";
}          

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table, th, td {
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <table style="width:100%;">
        <thead>
        <tr>
            <th>ID</th>
            <th>FirstName</th>
            <th>LastName</th>
            <th>Birthday</th>
            </tr>
        </thead>
        <tbody>
        <?php
        
        $sql = "SELECT * FROM user";
        $result = $conn->prepare($sql);
        $result->execute();

        if($result->rowCount() > 0):
            $rows = $result->fetchAll();
            foreach($rows as $row):
        ?>
        <tr>
            <td><?php echo $row['id'];  ?></td>
            <td><?php echo $row['first_name']; ?></td>
            <td><?php echo $row['last_name']; ?></td>
            <td><?php echo $row['birthday']; ?></td>
        </tr>
        </tbody>

        <?php
        endforeach;
    endif;
        ?>
    </table>
</body>
</html>

  • Bitte mischen Sie nicht PHP und HTML. Das wird sehr schnell unordentlich. Halten Sie PHP getrennt und zeigen Sie dann nur die Werte in HTML an.

    – Dharman

    10. Oktober 2020 um 17:44 Uhr

  • Was ist der Zweck von if($result->rowCount() > 0):?

    – Dharman

    10. Oktober 2020 um 17:44 Uhr

  • Warum if(!$conn){? Warum hast du die Fehlerberichterstattung nicht umgestellt?

    – Dharman

    10. Oktober 2020 um 17:45 Uhr

  • Ich verstehe nicht, wie dies die Frage beantwortet. Sie haben immer noch fest codierte Spaltennamen.

    – Dharman

    10. Oktober 2020 um 17:47 Uhr

  • Der Zweck meiner Antwort bestand darin, alles einfacher zu machen. Das Schreiben von HTML-Code mit PHP kann es schwierig machen, den Code zu verstehen, insbesondere wenn es um eine Person geht, die nicht so sachkundig ist. Daher ist es erwähnenswert, dass die Trennung von HTML und PHP dies bewirken kann der am einfachsten zu verstehende Code. Und nein, ich habe den Fehlerbericht nicht geändert, es hängt vom Benutzer für den Benutzer ab, ich glaube, dass die Person die Daten kennen muss, die sie mitteilt, um die Verbindung herzustellen, sonst wird keine Verbindung hergestellt.

    – Anne Rebbe

    10. Oktober 2020 um 19:05 Uhr

1005400cookie-checkDynamische Tabelle in HTML mit MySQL und PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy