Alle Tabellen bei phpMyAdmin anzeigen?
Hallo, geht es vielleicht einfacher? Mit weniger Code?
<?php
$servername = "localhost";
$username = "root";
$password = "";
// Funktion um Verbindung zu prüfen und eine Nachricht auszugeben
function checkConnection($conn) {
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
}
// Verbindung herstellen
$conn = new mysqli($servername, $username, $password);
checkConnection($conn);
// Alle Datenbanken abrufen
$sql = "SHOW DATABASES";
$result = $conn->query($sql);
echo "<h1>Datenbanken</h1>";
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$dbname = $row['Database'];
echo "<a href='?database=$dbname'>$dbname</a><br>";
}
}
else {
echo "Keine Datenbanken gefunden.";
}
$conn->close();
// Tabellen in der gewählten Datenbank anzeigen
if (isset($_GET['database'])) {
$dbname = $_GET['database'];
$conn = new mysqli($servername, $username, $password, $dbname);
checkConnection($conn);
$sql = "SHOW TABLES";
$result = $conn->query($sql);
echo "<h1>Tabellen in $dbname</h1>";
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$tablename = $row["Tables_in_$dbname"];
echo "<a href='?database=$dbname&table=$tablename'>$tablename</a><br>";
}
}
else {
echo "Keine Tabellen gefunden.";
}
$conn->close();
}
// Einträge in der gewählten Tabelle anzeigen und Eingabefelder generieren
if (isset($_GET['database']) && isset($_GET['table'])) {
$dbname = $_GET['database'];
$tablename = $_GET['table'];
$conn = new mysqli($servername, $username, $password, $dbname);
checkConnection($conn);
$sql = "SELECT * FROM $tablename";
$result = $conn->query($sql);
echo "<h1>Einträge in $tablename bearbeiten</h1>";
if ($result->num_rows > 0) {
echo "<form method='POST' action='save_changes.php'>";
echo "<table border='1'><tr>";
// Spaltenüberschriften
$fieldinfo = $result->fetch_fields();
foreach ($fieldinfo as $val) {
echo "<th>{$val->name}</th>";
}
echo "</tr>";
// Daten
while ($row = $result->fetch_assoc()) {
echo "<tr>";
foreach ($row as $key => $data) {
echo "<td><input type='text' name='{$key}[]' value='$data'></td>";
}
echo "</tr>";
}
// Leeres Eingabefeld für neue Einträge hinzufügen
echo "<tr>";
foreach ($fieldinfo as $val) {
echo "<td><input type='text' name='{$val->name}[]' value=''></td>";
}
echo "</tr>";
echo "</table>";
echo "<input type='hidden' name='database' value='$dbname'>";
echo "<input type='hidden' name='table' value='$tablename'>";
echo "<input type='submit' value='Änderungen speichern'>";
echo "</form>";
}
else {
echo "Keine Einträge gefunden.";
// Leere Tabelle mit Eingabefeldern für neuen Eintrag anzeigen
echo "<form method='POST' action='save_changes.php'>";
echo "<table border='1'><tr>";
foreach ($fieldinfo as $val) {
echo "<th>{$val->name}</th>";
}
echo "</tr><tr>";
foreach ($fieldinfo as $val) {
echo "<td><input type='text' name='{$val->name}[]' value=''></td>";
}
echo "</tr></table>";
echo "<input type='hidden' name='database' value='$dbname'>";
echo "<input type='hidden' name='table' value='$tablename'>";
echo "<input type='submit' value='Änderungen speichern'>";
echo "</form>";
}
$conn->close();
}
?>
1 Antwort
1) Es wäre besser, PHP und HTML stärker voneinander zu trennen.
Ein Weg wäre die alternative Syntax für Kontrollstrukturen:
<?php
/* build connection ... */
$result = $connection->query('SHOW DATABASES');
$databaseEntries = $result->fetch_all(MYSQLI_ASSOC);
$connection->close();
/* etc. ... */
?>
<!doctype html>
<head>
<title>Datenbanken</title>
<meta charset="utf-8">
</head>
<body>
<h1>Datenbanken</h1>
<?php if (count($databaseEntries) > 0): ?>
<ul>
<?php foreach ($databaseEntries as $databaseEntry): ?>
<?php $databaseName = databaseEntry['Database']; ?>
<li><a href="?database=<?= $databaseName ?>"><?= $databaseName ?></a>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>Keine Datenbanken gefunden.
<?php endif; ?>
<!-- etc. ... -->
</body>
2) Die Links halte ich in einer Auflistung für besser aufgehoben. Man könnte stattdessen aber auch eine Auswahlliste oder eine Gruppe an Radioboxen anbieten. Den Fallbacktext würde ich in ein eigenes Element (p/span/o.ä.) packen, damit man ihn später leichter stylen kann.
3) Dein Skript soll als grafische Schnittstelle dienen, über die eine explizite Auswahl an Aktionen durchgeführt werden darf. Demzufolge wäre es auch in diesem Fall klüger, mit Prepared Statements zu arbeiten, um zu verhindern, dass ein Nutzer eigene Anweisungen an die Datenbank verschicken kann, die von der Oberfläche nicht angeboten werden.
4) Texteingabefelder brauchen kein explizites type- oder value-Attribut. Auch bei den form-Elementen kannst du das action-Attribut weglassen, wenn es doch eh auf diesselbe URL verweist.
5) Da du wohl auch Daten zum Speichern an die Datenbank schicken möchtest, würde ich empfehlen, für die Datenbankverbindung explizit die Zeichenkodierung vorzugeben.
6) Statt einer Funktion checkConnection wäre eine Funktion getConnection sinnvoll, die eine Verbindung kreiert und zurückgibt.
7) Wenn der URL Querystring neben einem Datenbanknamen auch einen Tabellennamen beinhaltet, brauchst du die zuvor hergestellte Datenbankverbindung doch nicht kappen. Immerhin befragst du doch in beiden Fällen die gleiche Datenbank.
8) Das border-Attribut auf dem table-Element ist obsolet. Nutze CSS stattdessen.
9) Im Übrigen fehlen in deinem geposteten Code Doctype und title. Falls sie dem HTML-Dokument tatsächlich fehlen, sollten sie noch ergänzt werden.