jenslm: Problem mit SESSIONS

hab ein kleines Problem mit Sessions:

die Ausgabe echo $_SESSION['forename'];
bringt mir den richtigen Wert.

Möchte ich diesen aber in die DB schreiben:

if ($_SESSION['type'] == "wert" && isset($_SESSION['forename']) && isset(all die anderen Werte...))  
{  
    echo $_SESSION['forename']; //Gibt den richtigen Wert an  
    $sql = "INSERT INTO user (type, foa, title, forename, surname, mail, street, zip, city, phone, mobile, username, password)  
            VALUES  
		  ('".addslashes(trim($_SESSION['type']))."',  
		   '".addslashes(trim($_SESSION['foa']))."',  
		   '".addslashes(trim($_SESSION['title']))."',  
		   '".addslashes(trim($_SESSION['forename']))."',  
		   '".addslashes(trim($_SESSION['surname']))."',  
		   '".addslashes(trim($_SESSION['mail']))."',  
		   '".addslashes(trim($_SESSION['street']))."',  
		   '".addslashes(trim($_SESSION['zip']))."',  
		   '".addslashes(trim($_SESSION['city']))."',  
		   '".addslashes(trim($_SESSION['phone']))."',  
		   '".addslashes(trim($_SESSION['mobile']))."',  
		   '".addslashes(trim($_SESSION['username']))."',  
		   '".addslashes(trim($_SESSION['password']))."'  
		  )  
           ";  
			  
   	mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());  
}

...in der Tabelle steht dann forename = 0
warum das?
lg, jens

  1. Hi,

    die Ausgabe echo $_SESSION['forename'];
    bringt mir den richtigen Wert.

    Der wäre?

    Möchte ich diesen aber in die DB schreiben:
    [...]
    ...in der Tabelle steht dann forename = 0
    warum das?

    Weil du was falsch gemacht hast ...?

    Um herauszufinden, was - betreibe Debugging.
    Eine Kontrollausgabe des generierten SQL-Statements wäre ein erster Schritt.

    Und btw., addslashes hat an der Stelle absolut überhaupt rein gar nichts verloren.
    Der Kontextwechsel Daten -> MySQL-Query wird durch mysql_real_escape_string behandelt.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi!

      Und btw., addslashes hat an der Stelle absolut überhaupt rein gar nichts verloren.
      Der Kontextwechsel Daten -> MySQL-Query wird durch mysql_real_escape_string behandelt.

      Schon der Konsistenz wegen (es ist eine von der MySQL-API bereitgestellte Hilfsfunktion, die für Funktionen der MySQL-API verwendet werden soll) sollte man mysql_real_escape_string() den Vorzug geben. Technisch gesehen ist der Unterschied zwischen mysql_real_escape_string() und addslashes() im Grunde genommen jedoch nur kosmetischer Natur ((Strictly speaking, ...). Die zusätzlich von mysql_real_escape_string() behandelten Zeichen haben keine Auswirkungen auf die Sicherheit von (My)SQL-Statements. Auch dass addslashes() die Kodierung der Verbindung zwischen PHP und MySQL nicht beachtet ist für die hierzulande üblichen Kodierungen ISO-8859-x und UTF-8 nicht von sicherheitstechnischem Belang. Alle kritischen Zeichen haben eineindeutige Bytewerte.

      Lo!

      1. Hi,

        Schon der Konsistenz wegen (es ist eine von der MySQL-API bereitgestellte Hilfsfunktion, die für Funktionen der MySQL-API verwendet werden soll) sollte man mysql_real_escape_string() den Vorzug geben.

        *Gerade* *weil* die API diese Funktion bereitstellt.

        Technisch gesehen ist der Unterschied zwischen mysql_real_escape_string() und addslashes() im Grunde genommen jedoch nur kosmetischer Natur ((Strictly speaking, ...). Die zusätzlich von mysql_real_escape_string() behandelten Zeichen haben keine Auswirkungen auf die Sicherheit von (My)SQL-Statements.

        Momentan, ja.
        Wenn sich diesbezüglich (welche Zeichen Sonderbedeutung haben) seitens MySQL aber irgendwann mal etwas ändern sollte* - dann darf von der von der API bereitgestellten Funktion erwartet werden, dass sie dies auch berücksichtigt.
        Von einer vollkommen themenfremden Funktion, die *momentan* *zufälligerweise* ein der Aufgabe hinreichend genügendes Ergebnis liefert, aber deshalb noch lange nicht.

        * auch wenn unwahrscheinlich, zumindest denkbar.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
      2. ok also ich verwende jetzt mysql_real_escape_string()
        das die Werte in der Datenbank 0 waren liegt ganz einfach daran das INT als typ festgelegt war nicht wie eigentlich eingestellt VARCHAR(255).
        hier moechte ich aber nochmal auf sprintf() zurueckkommen.
        ich verstehe die erklaerung auf php.net nicht ganz.
        kann mit jemand das hier anpassen, damit ich ein Beispiel habe?

        $sql = "INSERT INTO user (1, 2)  
                    VALUES  
        				   ('".mysql_real_escape_string(trim($_SESSION['1']))."',  
        					'".mysql_real_escape_string(trim($_SESSION['2']))."'  
        				   )  
        "; 
        

        waere echt nett :)
        lg

        1. Hi,

          hier moechte ich aber nochmal auf sprintf() zurueckkommen.
          ich verstehe die erklaerung auf php.net nicht ganz.

          Was verstehst du nicht?

          Als ersten Parameter gibst du einen Formatstring an, in den du Platzhaler einbaust, die anschliessend durch den Wert der nachfolgenden Parameter ersetzt werden.

          MfG ChrisB

          --
          “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        2. Hi!

          hier moechte ich aber nochmal auf sprintf() zurueckkommen.
          ich verstehe die erklaerung auf php.net nicht ganz.
          kann mit jemand das hier anpassen, damit ich ein Beispiel habe?

          Reicht dir auch das Anwendungsbeispiel von sprintf() im Kontextwechselartikel?

          Lo!

          1. also ungefaehr so:

              
            $sql = sprintf("INSERT INTO user (1, 2) VALUES",  
                           mysql_real_escape_string($_SESSION['1']),  
                           mysql_real_escape_string($_SESSION['2']));  
            
            
            1. ok danke funktioniert....bisschen anders aber es geht

            2. Hi!

              also ungefaehr so:

              $sql = sprintf("INSERT INTO user (1, 2) VALUES",

              mysql_real_escape_string($_SESSION['1']),
                             mysql_real_escape_string($_SESSION['2']));

                
              Fast. Am Ende muss ein vollständiges und korrektes SQL-Statement rauskommen. Der Vorteil von sprintf() ist, dass du das SQL-Statement übersichtlich in Gänze und in einem Stück notieren kannst, nur eben mit Platzhaltern für die Werte.  
                
              $sql = sprintf("INSERT INTO user (feldname1, feldname2) VALUES ('%s', '%s')", ... der Rest wie oben.  
                
                
                
              Lo!
              
  2. In $sql stehts auch richtig drin? Dann ist es aber kein Problem der Session.
    Ich würde in diesem Fall in der DB schauen, mal den SQL-String direkt ausführen lassen und da gucken was passiert.

  3. Hallo,

    'forename'

    autsch, das tut weh beim Lesen.

    Meintest du 'Vorname'? Die richtige englische Bezeichnung ist 'first name', seltener auch 'christian name'. Als Feldbezeichner würde ich das Leerzeichen meiden und 'firstname' schreiben.
    Dagegen ist 'surname' zwar im Prinzip richtig; gebräuchlicher ist aber 'last name'.

    echo $_SESSION['forename']; //Gibt den richtigen Wert an
        $sql = "INSERT INTO user (type, foa, title, forename, surname, mail, street, zip, city, phone, mobile, username, password)
                VALUES
      ('".addslashes(trim($_SESSION['type']))."',
       '".addslashes(trim($_SESSION['foa']))."',
       '".addslashes(trim($_SESSION['title']))."',
       '".addslashes(trim($_SESSION['forename']))."',
       '".addslashes(trim($_SESSION['surname']))."',
       '".addslashes(trim($_SESSION['mail']))."',
       '".addslashes(trim($_SESSION['street']))."',
       '".addslashes(trim($_SESSION['zip']))."',
       '".addslashes(trim($_SESSION['city']))."',
       '".addslashes(trim($_SESSION['phone']))."',
       '".addslashes(trim($_SESSION['mobile']))."',
       '".addslashes(trim($_SESSION['username']))."',
       '".addslashes(trim($_SESSION['password']))."'
      )
               ";

    Dass addslashes() hier Unsinn ist, wurde dir ja schon gesagt. Unabhängig davon kann man solche Bandwürmer eleganter mit sprintf() schreiben. Dann spart man sich -zig Anführungszeichen und Stringverkettungspunkte.

    ...in der Tabelle steht dann forename = 0
    warum das?

    Vielleicht weil $_SESSION['forename'] durch addslashes() verstümmelt wurde? Hast du dir den SQL-Query mal genau angesehen, nachdem er zusammengebaut ist?

    Ciao,
     Martin

    --
    Ein Patriot ist jemand, der bereit ist, sein Land gegen seine Regierung zu verteidigen.