Sven Rautenberg: Daten aus Mysql auslesen

Beitrag lesen

Moin!

Ich versuche die Werte mit folgendem Code auszulesen, habe aber anscheinend im Ausgabefeld einen Fehler.

Nein, im SQL. Und zwar mehrere.

$select = "[code lang=sql]SELECT n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, text, date FROM uebler_zins LIMIT 1;";[/code]

Die Bezeichner "text" und "date" sind in SQL reservierte Worte, die nicht ohne Sonderbehandlung (Escaping) im SQL-Befehl verwendet werden dürfen.

Mit "LIMIT 1" hab ich mir sagen lassen gibt man an, dass es den letzten Wert ausliest, der eingetragen wurde, da ich das Datum ja mitspeichere.

Auch das ist falsch. Datenbankabfragen sind grundsätzlich unsortiert, wenn du keine Sortierreihenfolge angibst. Die Abfrage würde dir ohne LIMIT einfach eine unsortierte Liste der Einträge geben - mit LIMIT kriegst du nur den ersten Eintrag dieser Liste. Das ist dann immer noch "irgendeiner".

Wenn du die Liste sortiert haben willst, nutze ORDER BY.

Auch sonst ist dein Code durchaus kritikwürdig zu betrachten:

// Definition der Daten

$daten[0]["n1"] = $_REQUEST["n1"];
$daten[0]["n2"] = $_REQUEST["n2"];
$daten[0]["n3"] = $_REQUEST["n3"];
$daten[0]["n4"] = $_REQUEST["n4"];
$daten[0]["n5"] = $_REQUEST["n5"];
$daten[0]["n6"] = $_REQUEST["n6"];
$daten[0]["n7"] = $_REQUEST["n7"];
$daten[0]["n8"] = $_REQUEST["n8"];
$daten[0]["n9"] = $_REQUEST["n9"];
$daten[0]["n10"] = $_REQUEST["n10"];
$daten[0]["n11"] = $_REQUEST["n11"];
$daten[0]["e1"] = $_REQUEST["e1"];
$daten[0]["e2"] = $_REQUEST["e2"];
$daten[0]["e3"] = $_REQUEST["e3"];
$daten[0]["e4"] = $_REQUEST["e4"];
$daten[0]["e5"] = $_REQUEST["e5"];
$daten[0]["e6"] = $_REQUEST["e6"];
$daten[0]["e7"] = $_REQUEST["e7"];
$daten[0]["e8"] = $_REQUEST["e8"];
$daten[0]["e9"] = $_REQUEST["e9"];
$daten[0]["e10"] = $_REQUEST["e10"];
$daten[0]["e11"] = $_REQUEST["e11"];
$daten[0]["text"] = $_REQUEST["text"];

  
Das ist sinnloses Umkopieren von Werten.  
  
Zum einen: Greife nie auf $\_REQUEST zu, wenn du nicht sicher bist, dass du es musst. Verwende immer direkt das deiner Formulardefinition entsprechende Array $\_POST oder $\_GET.  
  

> // Daten eintragen  
> while (list ($key, $value) = each ($daten))  
  
Programmierst du noch PHP 3? Scheint ja so!  
  
Schon seit zehn Jahren bietet PHP 4 ein foreach-Konstrukt an, welches sich eindeutig besser nutzen lässt. Zumal du es hier sowieso total überflüssig einsetzt, denn in $daten steckt exakt EIN Element mit dem Index [0], welches in dem sinnlosen Kopiercode weiter oben entstanden ist. Es ist also komplett überflüssig, hier eine Schleife für genau ein Element anzusetzen.  
  

>   $sql = "INSERT INTO "."uebler\_zins (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, text, date) "."VALUES ('".$value["n1"]."', '".$value["n2"]."', '".$value["n3"]."', '".$value["n4"]."', '".$value["n5"]."', '".$value["n6"]."', '".$value["n7"]."', '".$value["n8"]."', '".$value["n9"]."', '".$value["n10"]."', '".$value["n11"]."', '".$value["e1"]."', '".$value["e2"]."', '".$value["e3"]."', '".$value["e4"]."', '".$value["e5"]."', '".$value["e6"]."', '".$value["e7"]."', '".$value["e8"]."', '".$value["e9"]."', '".$value["e10"]."', '".$value["e11"]."', '".$value["text"]."', now())";  
  
Dagegen vernachlässigst du hier jegliche Sicherheit und baust keinerlei Escaping ein. Nutze immer [mysql_real_escape_string()](http://www.php.net/mysql-real-escape-string). Zusätzlich gelten natürlich wieder die Anmerkungen zu den Feldbezeichnern "text" und "date".  
  

>   mysql\_query ($sql);  
  
Hier gehört eine Fehlerbehandlung hin! Die Funktion mysql\_error() liefert dir, was MySQl an deinem Query eventuell nicht schmeckt.  
  
 - Sven Rautenberg