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 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>
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