Mastodon

renephoenix.de

Erster Eingriff in phpMyAdmin

Am Wochenende machte ich den ersten Eingriff in phpMyAdmin. Klickt man innerhalb einer Datenbank auf SQL bzw. auf Anzeigen, so zeigt er stets folgenden Befehl an: SELECT * FROM [tabellenname]

Besser wäre allerdings, wenn er anstelle des * gleich die aktuellen Spaltennamen anzeigt. Gute Skripte verwenden nicht den Platzhalter, sondern benennen stets die Spalten, auf denen zugegriffen werden soll. Da ich mich bei der Skriptentwicklung ohnehin in PhpMyAdmin befinde, ist es doch eine gute Sache, wenn ich mir bestimmte Codefragmente einfach abkopieren kann.

Mein Ansatz: Es gibt viele Stellen, an denen man anbohren muß. In der Regel wird das entsprechende SQL-Statement mit dem Link mitgeliefert, so daß man stets in die Datei bearbeiten muß, die den Link anbietet. Insgesamt fand ich 5 Stellen:

  • 1. left.php (in dieser Datei ist es viermal vorhanden, Zeilen ca. 483, 540, 710, 720) — Das ist der linke Balken.
  • 2. tbl_properties_links.php (Zeile ca. 42) — Damit verändert man die URL für den Link `Anzeigen´ im Kopfbereich
  • 3. db_details_structure.php (Zeile ca. 254) — Befinde ich mich in der Strukturansicht einer Datenbank, so habe ich auch Links zu den jeweiligen Tabellen
  • 4. tbl_query_box.php (Zeile ca. 143) — Diese Datei zeigt eine Box zur Eingabe einer URL an, entgegen der anderen, griff ich hier auf den default-Wert der textarea zu.
  • 5. tbl_select.php (Zeile 247-249, 260) — Diese Datei wird über »Teilw. anzeigen« ausgeführt. Man kann hierbei sich die gewünschten Spalten auswählen, und wählt man alle aus, so erscheint wieder der Stern. In diesem Falle muß im Code nichts weiter machen, als die 4 aufgeführten Zeilen zu kommentieren.

In der Regel findet man die Passagen, in dem man im Texteditor nach »SELECT *« sucht (! Nicht SELECT COUNT (*)).

Dann findet man in der Regel Abschnitte wie diesen hier:

<?php echo ((!empty($query_to_display)) ? htmlspecialchars($query_to_display) : 'SELECT * FROM ' . htmlspecialchars(PMA_backquote($table)) . ' WHERE 1'); ?>

Dieser muß ergänzt werden. Man sollte stets andere Parameter für $result und $row verwenden, als in phpMyAdmin verwendet werden, denn je nach Position kann man auch andere ResultSets zerstören. Des weiteren sollte man bei der SHOW FIELD-Abfrage auch die Datenbank mit angeben, da z.B. im dritten Fall sich das Skript gerade in der Datenbank mysql befindet und nicht in der aktuellen.

<?php
$felder = "";
$rpresult      = @PMA_mysql_query("SHOW FIELDS FROM ". PMA_backquote($db) .".". PMA_backquote($table) );
while ($rprow = PMA_mysql_fetch_array($rpresult))
{
 $felder .= $felder ? ', '. $rprow['Field'] :  $rprow['Field'];
}
echo ((!empty($query_to_display)) ? htmlspecialchars($query_to_display) : 'SELECT '. $felder .' FROM ' . htmlspecialchars(PMA_backquote($table)) . ' WHERE 1'); ?>

Hat man diese Eingriffe getan, zeigt er nun von überall aus ein Statement mit den entsprechenden Spaltennamen an. Ich übernehme natürlich keine Garantie, daß es bei euch genauso funktioniert.

Bisherige Kommentare (5)

Kommentar von Thiemo

Und, schon als Feature Request gemeldet?

An vielen Stellen des Codes steht übrigens ein Array $fields_list zur Verfügung, dass man einfach für diesen Zweck benutzen kann: implode(', ', PMA_backquote($fields_list)).

Des weiteren gibt's in der Konfiguration eine Einstellung $cfg['DefaultQueryTable'], mit der man zumindest den Standardwert für tbl_query_box.php beeinflussen kann — leider ohne die von dir gewünschten Felder.

Kommentar von René

Ich habe schon den ersten Schwachpunkt gesehen: fügt man eine neue Tabelle hinzu, so muß der rechte Balken neu geladen werden. Würde ich das auch bei jeder Namensveränderung machen, so würde nach jeder kleinen Veränderung der Menu-Frame geladen werden — ansonsten stimmten vielleicht die Attribute nicht mehr überein. Den Fall hatte ich auch schon gehabt ...

Kommentar verfassen

Freiwillige Angabe
Freiwillige Angabe
Der Text kann mit Textile formatiert werden, z.B. *fett* _kursiv_ "link":url. Wie das geht?
Wieviel ist 40 plus 2?

Bisherige Trackbacks (0)

Es wurde noch kein Trackback empfangen!