Daten in datenbankschreiben
bengelbaer
- php
0 Dynamite0 bengelbaer0 Bengelbaer0 hotti
1 Der Martin1 Tom4 Daten in atenbankschreiben
dedlfix0 Auge
Hallo zusammen,
ich bin ein neuling in Sachen PHP und trainiere gerade.
Nun habe ich Angefangen ein Account gnerator zu basteln.
(mein erstes script)
Ich habe mich bisher mit meinen Büchern retten können, doch nun komme ich nicht weiter.
Ich habe in der untersten Zeile immer ein Problem mit den VALUES..
Kann einer erkennen woran das liegt? Und wenn ja bitte erklären was ich falsch machte?
Verbindung etc zur DB funktioniert, und die Übergabe der Daten aus einer Eingabemaske auch.
Hier mal der Problem code
<html>
<head>
<Title>Ergebnis der Registrierung</Title>
</head>
<body>
<?php
// Hier bitte nichts ohne genehmigung ändern ( Michael.Zatti@gmx.de ), Code ist rechtlich geschützt.
// Laden der Config.php, in welche die Datenbank- Zugangsdaten eingetragen werden müssen.
include "config.php";
//*****************************************************************
// die von der Eingabemaske übergebenen Werte werden nun in PHP konforme Variablen gepackt
$accname = $_POST['accname'];
$email = $_POST['email'];
$passwd = $_POST['passwd'];
$addon = $_POST['addon'];
//*****************************************************************
// Verbindung zum MySQL Server starten
if (!($verbindung = mysql_pconnect ("$host", "$dbuser", "$dbpass"))) {
echo("Leider konnte keine Verbindung zur Datenbank hergestellt werden. Bitte prüfen Sie die Config.php<p>");
echo mysql_error();
exit();
}
// Datenbank auswahl
if (!mysql_select_db ("$dbchar", $verbindung)) {
echo("Leider konnte die in der Config.php angegebene Datenbank nicht ausgewählt werden.<p>");
echo mysql_error ();
exit ();
}
//Daten in die Datenbank schreiben
mysql_query ("INSERT INTO accounts (login, password, email, flags, forceLanguage") VALUES
('$accname', '$passwd', '$email', '34', 'de');", $verbindung";
?>
</body>
</html>
Bitte seit etwas nachsichtig, ich hoffe der Code sieht wenigstens für euch Profis sauber aus... Jedenfalls gab ich mir richtig mühe.
Dannke schon mal..
LG
Michael
Was für ein Problem hast Du? Bitte demnächst genauere Beschreibung.
Schau Dir mal deine Anführungszeichen an.
Gruß
Dynamite
Was für ein Problem hast Du? Bitte demnächst genauere Beschreibung.
Schau Dir mal deine Anführungszeichen an.
Gruß
Dynamite
Ich bekomme wegen dieser Zeile
//Daten in die Datenbank schreiben
mysql_query ("INSERT INTO accounts (login, password, email, flags, forceLanguage") VALUES
('$accname', '$passwd', '$email', '34', 'de');", $verbindung";
Immer diesen Fehler:
Parse error: parse error in E:\xampp\htdocs\erstes php programm\listing.php on line 35
Grüßle Micha
Alles klar das wars... Mit den GÄNSEFÜSCHEN hehe...
Vielen dank für den hinweis, bin wohl schon betriebsblind.
Gruß Micha
hi,
Ich bekomme wegen dieser Zeile
So bekommst Du das in den Griff.
Hotte
Hallo,
ich bin ein neuling in Sachen PHP und trainiere gerade.
und da nimmst du dir als erstes ein so ehrgeiziges und komplexes Projekt vor?
Ich habe in der untersten Zeile immer ein Problem mit den VALUES..
Kann einer erkennen woran das liegt? Und wenn ja bitte erklären was ich falsch machte?
Eins nach dem anderen.
// die von der Eingabemaske übergebenen Werte werden nun in PHP konforme Variablen gepackt
Das ist galoppierender Unsinn. Wozu die Umkopiererei? Was willst du damit erreichen? Letztendlich erreichst du damit nur zwei Dinge: Der Speicherbedarf deines Scripts wird ein bisschen größer, und die Herkunft der Daten wird verschleiert, so dass die Gefahr von Leichtsinnsfehlern steigt.
Arbeite im Script direkt mit den Daten in $_POST.
// Verbindung zum MySQL Server starten
if (!($verbindung = mysql_pconnect ("$host", "$dbuser", "$dbpass")))
Wozu verpackst du Variablen vom Typ String ihrerseits nochmal ein Strings? Das ist sinnfrei.
if (!mysql_select_db ("$dbchar", $verbindung))
Dito.
//Daten in die Datenbank schreiben
mysql_query ("INSERT INTO accounts (login, password, email, flags, forceLanguage") VALUES ('$accname', '$passwd', '$email', '34', 'de');", $verbindung";
Achte hier mal genau auf die Anführungszeichen. Wo beginnt dein SQL-Query, und wo endet er wieder? Das dürfte dein akutes Hauptproblem sein.
Bitte seit etwas nachsichtig, ich hoffe der Code sieht wenigstens für euch Profis sauber aus...
Auf den ersten Blick ja. ;-)
So long,
Martin
Hello,
//*****************************************************************
// die von der Eingabemaske übergebenen Werte werden nun in PHP konforme Variablen gepackt
$accname = $_POST['accname'];
$email = $_POST['email'];
$passwd = $_POST['passwd'];
$addon = $_POST['addon'];
//*****************************************************************
$_POST ist eine PHP-Variable, oder was meinst Du, woher die kommt?
Die Elemente dieses Array können ganz normal benutzt werden, wie jede andere Variable auch. Das umkopieren in ungebundene Variablen, bei denen man nachher ncht mehr weiß, welcher Bezeichner schon bentutzt wurde oder wozu die gehören, ist vollkommen überflüssig.
mysql_query ("INSERT INTO accounts (login, password, email, flags, forceLanguage") VALUES
('$accname', '$passwd', '$email', '34', 'de');", $verbindung";
Hier steckt ein Fehler, wie Du ja selber bemerkt hast.
Da in zusammengebauten Queries aber sowieso öfter Fehler auftreten, bietet es ich an, _zuersrt_ das Query zu bauen
$sql = "INSERT INTO accounts
(login, password, email, flags, forceLanguage )
VALUES ('$accname', '$passwd', '$email', '34' , 'de')";
und es dann anschließend erst zu benutzten:
$res = mysql_query($sql, $verbindung);
Wenn nämlich das Query jetzt schief geht, also $res === false ist, dann kannst Du Dir außer des Fehlerstatus von MySQL mysql_error($verbindung) auch das Query nochmal anzeigen lassen
echo htmlspecialchars($sql);
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Vielen Dank für all die super Tipps und Hinweise, die ich gleich versuchen werde umzusetzen.
echo $begrüßung;
// Hier bitte nichts ohne genehmigung ändern ( Michael.Zatti@gmx.de ), Code ist rechtlich geschützt.
Niedlich. Hast du das dahin geschrieben? Tut mir leid, wenn ich dich jetzt entmutige, aber in dem Code stecken so viele Fehler, dass man besser kommt, neuen Code zu schreiben, als ihn zu ändern. Zudem ist er nichts besonderes - 0815-Datenbankhandling - und ein Rechtsstreit um eine ungenehmigte Änderung recht wenig erfolgversprechend. Außerdem ist es gesetzlich nicht verboten, eine rechtmäßig erworbene Software so anzupassen, dass sie auf dem eigenen Equipment läuft.
// Verbindung zum MySQL Server starten
if (!($verbindung = mysql_pconnect ("$host", "$dbuser", "$dbpass"))) {
Aber bitte nicht mit p. Bei persistenten Verbindungen kann man unwissend mehr verkehrt machen, als sie Nutzen versprechen. Verwende lieber das normale mysql_connect():
echo("Leider konnte keine Verbindung zur Datenbank hergestellt werden. Bitte prüfen Sie die Config.php<p>");
echo mysql_error();
Wem zeigst du das an? Nur der Serveradministrator kann mit der Meldung was anfangen. "Normale" Anwender wollen und "unnormale" sollen solche Meldungen nicht zu Gesicht bekommen.
//Daten in die Datenbank schreiben
mysql_query ("INSERT INTO accounts (login, password, email, flags, forceLanguage") VALUES
('$accname', '$passwd', '$email', '34', 'de');", $verbindung";
Das übliche "Vergehen". Wann immer du Daten in einen anderen Kontext bringst, sind diese dem Kontext entsprechend zu behandeln! Hier bringst du Werte in einen SQL-String-Kontext. (My)SQL-Strings werden durch ' oder " eingerahmt. Wenn in deinen Nutzdaten solch ein Zeichen vorkommt, beendet es unfreiwillig den String-Kontext und man befindet sich wieder im Anweisungskontext. Die restlichen Zeichen aus den Daten und das eigentlich abschießende ' führen bestenfalls zu einem Syntaxfehler. Schlimmstenfalls nutzt das jemand gezielt aus und diese Lücke hört auf den Namen SQL-Injection. mysql_real_escape_string() heißt die Funktion, um Daten für den Kontext SQL-String aufzubereiten.
$sql = sprintf("INSERT INTO table (feld1, feld2, feld3) VALUES ('%s', '%s', '%s')",
mysql_real_escape_string($feld1),
mysql_real_escape_string($feld2),
mysql_real_escape_string($feld3));
if ($result = mysql_query($sql))
// Auswertung
else
// Fehlerbehandlung
Bitte seit etwas nachsichtig, ich hoffe der Code sieht wenigstens für euch Profis sauber aus... Jedenfalls gab ich mir richtig mühe.
Nachsicht ist die falsche Bitte. Fehler aus Nachsicht nicht anzusprechen ist nicht besser als sie wegen Unwissenheit einzubauen.
echo "$verabschiedung $name";
Hallo
Du hast ja nun schon diverse Hinweise bekommen. Sowohl, was das Umkopieren der Variablen betrifft, als auch das Einschließen der Variablen in Anführungszeichen und schlussendlich das kontextgerechte Maskieren der Variablen(inhalte).
Von mir noch ein Tip, der meiner Meinung nach die Lesbarkeit des Queries erhöht und sich zudem von seinem Aufbau her leichter merken lässt.
//Daten in die Datenbank schreiben
mysql_query ("INSERT INTO accounts (login, password, email, flags, forceLanguage") VALUES
('$accname', '$passwd', '$email', '34', 'de');", $verbindung";
Es gibt eine Syntax für INSERT, die der Syntax von UPDATE entspricht. ich halte sie für besser lesbar, weil die Feldnamen und die Feldwerte direkt beieinander stehen.
INSERT INTO accounts SET
login = 'name',
password = 'passwort',
email = 'email@example.com',
flags = '34',
forceLanguage = 'de'
In PHP könnte das so aussehen:
// Zuerst die übergebenen Werte prüfen und Verbindung zur DB aufbauen.
// Query zusammenbauen
$query = "INSERT INTO accounts SET
login = '".mysql_real_escape_string($_POST['accname'])."',
password = '".mysql_real_escape_string($_POST['passwd'])."',
email = '".mysql_real_escape_string($_POST['email'])."',
flags = '34',
forceLanguage = 'de'";
// Query absetzen
$ergebnis = mysql_query($query, $verbindung);
// weiter im Text ...
Ob du den Query nun mit dedlfix' Muster zusammenbaust, oder, wie es hier geschieht, als Stringverkettung, ist dabei egal.
Tschö, Auge