bengelbaer: Daten in datenbankschreiben

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

  1. Was für ein Problem hast Du? Bitte demnächst genauere Beschreibung.

    Schau Dir mal deine Anführungszeichen an.

    Gruß
    Dynamite

    1. 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

      1. Alles klar das wars... Mit den GÄNSEFÜSCHEN hehe...

        Vielen dank für den hinweis, bin wohl schon betriebsblind.

        Gruß Micha

      2. hi,

        Ich bekomme wegen dieser Zeile

        • Prüfe das Statement außerhalb vom Script in der MySQL-Konsole mit Values, die den in Deiner Tabelle festgelegten Datentypen entsprechen,
        • Prüfe die Variablen innerhalb vom Script, ob diese mit Values belegt sind, die den in Deiner Tabelle festgelegten Datentypen entsprechen.

        So bekommst Du das in den Griff.

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  2. 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

    --
    Okay, Alkohol ist keine Antwort.
    Aber manchmal vergisst man beim Trinken wenigstens die Frage.
  3. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Vielen Dank für all die super Tipps und Hinweise, die ich gleich versuchen werde umzusetzen.

  4. 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";

  5. 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

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
    Terry Pratchett, "Wachen! Wachen!"
    Veranstaltungsdatenbank Vdb 0.3