Daten aus Mysql auslesen
Gerch 2003
- php
0 Sven Rautenberg0 EKKi
Hallo,
ich möchte aus meiner Datenbank Werte einschreiben, bzw. später auslesen.
Ich versuche die Werte mit folgendem Code auszulesen, habe aber anscheinend im Ausgabefeld einen Fehler.
// Datenbankverbindung
//---------------------------------------------------
$host = "localhost"; // Adresse des Datenbankservers, meist localhost
$user = "xxx"; // Ihr MySQL Benutzername
$pass = "xxx"; // Ihr MySQL Passwort
$dbase = "xxx"; // Name der Datenbank
$connection = mysql_connect("$host" , "$user" , "$pass")
OR die ("Keine Verbindung zu der Datenbank moeglich.");
$db = mysql_select_db($dbase , $connection)
OR die ("Auswahl der Datenbank nicht moeglich.");
$select = "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;";
Und dann der Code an der Stelle wo es ausgegeben werden soll:
echo $output["n1"];
*das geht natürlich mit allen anderen Feldern dann genauso.
-------
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.
Das könnte man weglassen, wenn man mir sagt wie ich es schaffe, dass es den Wert in der Tabelle immer ersetzt und nicht einen neuen hinzufügt.
Die Daten werden in ein Formular eingegeben und dann an dieses Script gesendet:
// 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"];
// Aufbau der Datenbankverbindung
$connectionid = mysql_connect ("localhost", "xxx", "xxx");
if (!mysql_select_db ("xxx", $connectionid))
{
die ("Keine Verbindung zur Datenbank");
}
// Daten eintragen
while (list ($key, $value) = each ($daten))
{
// SQL-Anweisung erstellen
$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())";
mysql_query ($sql);
if (mysql_affected_rows ($connectionid) > 0)
{
echo "<div class=\"schrift\">Daten gespeichert.</div><br>\n";
print '<meta http-equiv="refresh" content="5; URL=admin.php">';
exit;
}
else
{
echo "<div class=\"schrift\">Fehler beim Anlegen der Benutzer. Sie werden in 5 Sekunden weitergeleitet!</div><br>\n";
print '<meta http-equiv="refresh" content="5; URL=admin.php">';
exit;
}
}
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
Mahlzeit Gerch 2003,
$connection = mysql_connect("$host" , "$user" , "$pass")
OR die ("Keine Verbindung zu der Datenbank moeglich.");
$db = mysql_select_db($dbase , $connection)
OR die ("Auswahl der Datenbank nicht moeglich.");
$select = "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]
Ich behaupte mal, dass das Datenbankdesign einer ERHEBLICHEN Überarbeitung bedarf.
echo $output["n1"];
Wo genau wird das Array $output gefüllt?
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.
Wer behauptet so etwas? Das stimmt nur, wenn Du ein eindeutiges, das mitgespeicherte Datum berücksichtigende Sortierkriterium verwendest.
[code lang=php]// 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"];
Wasu welchem Grund kopierst Du hier einen Haufen Formulardaten in ein Array? Wieso verwendest Du nicht $_GET oder $_POST? Ist Dir egal, mit welchen Daten Dein Skript gefüttert wird (Stichwort: "All input is evil!").
$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())";
mysql_query ($sql);
Du verwendest hier ungeprüft Daten, die Dein Skript von irgendwo bekommen hat, um ein Abfrage an Deine Datenbank zusammenzubasteln. Ich empfehle Dir DRINGEND, Dich mit mysql_real_escape_string() zu beschäftigen!
if (mysql_affected_rows ($connectionid) > 0)
{
Du hast an dieser Stelle noch nicht überprüft, ob die SQL-Abfrage überhaupt fehlerfrei ausgeführt wurde. Das könnte bei der Fehlersuche hilfreich sein.
MfG,
EKKi