Announcement

Collapse
No announcement yet.

MySQL Schreibt nicht in die Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MySQL Schreibt nicht in die Datenbank

    Hallo,

    Bei mir zuhause (Apache 2.2.4 / MySQL 5.0.37 / PHP 5.2.1 / Firefox 2.0.0.7 / IE 6.0) funktioniert das Script ohne Probleme. In der Firma (IE6.0.2800.1106 / Firefox 2.0.0.3 / IIS 5.0 / PHP 5.2.4 / mySQL 5.0.45) gibt es die folgende Fehlermeldung:

    Code:
    Notice: Undefined variable: Fehler in D:\shares\CL_HTML\ltu_html\ltu\tickets_schreiben.php on line 49
    
    Fehler: MySQL: 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '\'12345678\', \'Testkunde\', \'01,12,07\', \'DUSMUC\', \'129,99
    Hier ist der betroffene Abschnitt:
    Code:
    mysql_query(sprintf('INSERT INTO tickets (BuchungsNr, KundenNamen, AbflugDatum, Strecke, Betrag, Bemerkung, Sonstiges, PaxAnzahl, Aktion, Verkäufer, Pn, Datum, Typ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)',$buchungsnummer , $kundennamen, $abflugdatum, $strecke, $betrag, $bemerkung, $sonstiges, $paxanzahl, $aktion, $agent_2, $pn_2, $datum, $typ)); 
    
    
    switch (mysql_errno()){ 
    case 0: 
    // Alles OK 
    printf("Alles OK!"); 
    mysql_close(); 
    continue; 
    default: 
    // Sonstiger Fehler 
    // -> Fehlermeldung ausgeben 
    $Fehler .= "MySQL: ".mysql_errno().": ". 
    mysql_error()."<br>\n"; 
    printf("<br>Fehler: %s", $Fehler ); 
    }
    Hat jemand eine Idee?

    Grüße
    Alex

  • #2
    Backslashes (\) müssen bei MySQL escapet werden.

    Und bitte, nimm parametrisierte Abfragen. Ansonsten wird jemand deine Datenbank mit einem "'; DROP DATABASE ..." abschießen.

    Fast die gleichen Probleme hatten wir schon vor ein paar Tagen -> Forensuche!

    Comment


    • #3
      Hi Bernhard,

      aber es werden keine Backslashes übergeben - es sind Integer / Chars ohne Sonderzeichen.

      @parametrisierte Abfrage: Da hast Du natürlich Recht. Nur momentan hänge ich an dieser Fehlermeldung fest - besonders, weil ich es am Heimrechner nicht nachstellen kann und dort entwickeln muss.

      Grüße
      Alex

      Comment


      • #4
        Installier mal die gleiche MySQL-Version. Hatte schon mal bei einer 4er-Version das MySQL eine absolut unbrauchbare Version released hatte.

        Comment


        • #5
          Hi,

          habe gerade die gleiche Version installiert. Keine Änderung - auf dem Apache Webserver geht´s, auf dem IIS6 nicht

          Gruss
          Alex

          Comment


          • #6
            Hallo Alex,

            hier scheint eher eine Maskierung zuviel drin zu sein. Wie werden denn die Variable (z.B. $buchungsnummer) mit Werten belegt? Stammen diese aus $_GET, $_POST oder einer anderen externen Quelle (Datei)? Wenn ja, dann könnte eine unterschiedliche Konfiguration von magic_quotes_gpc bzw. magic_quotes_runtime die Ursache für das Unterschiedliche Verhalten sein.
            Wie Bernhard aber schon angedeutet hat, wäre es sicherer die Daten explizit zu maskieren, also z.B. so:
            PHP Code:
            mysql_query(sprintf('INSERT INTO tickets (BuchungsNr, ...) VALUES (\'%s\', ...)',mysql_real_escape_string($buchungsnummer), ...)); 
            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo Frank,

              die Daten kommen aus einem $_GET, soweit ich mich richtig erinnere. Sobald ich zuhause bin, probiere ich die escape-strings mit mysql_real_escape_string abzufangen, evtl. liegt es ja daran.

              Grüße
              Alex

              Comment


              • #8
                Hi,

                also ich hab's ausprobiert. Ziemlich seltsam das Ganze: wenn ich die Variablennamen mit mysql_real_escape_string($varname) in dem Query kapsle, dann bekomme ich an meinem heimischen Rechner die gleiche Fehlermeldung wie auf dem IIS6 Server.

                Gruss
                Alex

                Comment


                • #9
                  Hallo Alex,

                  dann poste doch bitte nochmal genau, wie dein Query-String aussieht, was in den Variablen (Müssen nicht alle sein, die ersten 2-3 reichen) drinsteht (nicht was du denkst was drinsteht sondern was tatsächlich drin steht) und den Meldungstext von MySQL.
                  Dann mach mal bitte in einer Debugversion von deinem Script folgendes:
                  PHP Code:
                    //mysql_query(sprintf('INSERT INTO tickets ...
                    
                  $query sprintf('INSERT INTO tickets ...
                    echo("<pre>$query</pre>");
                    mysql_query($query); 
                  Das was dann bei echo(... ausgegeben wird, würde mich auch noch interessieren.

                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    Hallo Falk,

                    hier sind die Ausgaben. Es werden die 2 ersten Variablen ausgegeben und dann der query-string. Sehe ich das richtig, dass die slashes da eigentlich nicht hingehören?

                    Code:
                    '12345678'
                    'testuser'
                    
                    INSERT INTO tickets (BuchungsNr, KundenNamen, AbflugDatum, Strecke, Betrag, Bemerkung, Sonstiges, PaxAnzahl, Aktion, Verkaufer, Pn, Datum, Typ) 
                     	        VALUES (\'12345678\', \'testuser\', \'11,11,11\', \'dusmuc\', \'11,11\', \'Neubuchung\', \'2\', \'3\', \'4\', \'34434\', 3434, \'25.10.2007\', \'Linie\')
                    Wenn ich probehalber das mysql_real_escape_string weglasse, dann funktioniert´s am heimischen Rechner, dh die slashes tauchen dann nicht auf. An der IIS6 Maschine kann ich es gerade nicht testen

                    Grüße
                    Alex

                    Comment


                    • #11
                      Hallo Alex,
                      warum ist denn der Inhalt der Variablen bereits mit Hochkommas versehen? Die gehören in den SQL-String und nicht in die Variable.

                      Den Wert 'testuser' wandelt mysql_real_escape_string() in \'testuser\' um. Das ist ja so gewollt, da damit die Hochkommas escaped werden.
                      Für einen SQL-string in der Art INSERT INTO ... values('%s', ...) (Beachte das hier das %s in Hochkommas steht) passt das auch. Der reale String sieht dann so aus INSERT INTO ... values('\'testuser\'', ...) und ist ein gültiges MySQL-Statement.
                      Offensichtlich ist die Programmierung etwas "schlampig" und die Hochkommas werden schon mit in die Variablen geschrieben. Beim Einfügen gibts dann Probleme, da die höhere PHP-Version auf dem IIS offensichtlich automatisch maskiert. Hier liegt also eher ein grundsätzliches Problem vor, wie du Daten und Anweisungen voneinander trennst.

                      Gruß Falk
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        Hallo Falk,

                        aaah ich verstehe. Die Hochkommata habe ich nun entfernt.
                        Wäre der SQL String so korrekt?:

                        Code:
                        $query = sprintf('INSERT INTO tickets (BuchungsNr, KundenNamen, AbflugDatum, Strecke, Betrag, Bemerkung, Sonstiges, PaxAnzahl, Aktion, Verkaufer, Pn, Datum, Typ) 
                         	        VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')',
                                mysql_real_escape_string($buchungsnummer, $link),
                        	mysql_real_escape_string($kundennamen, $link), 
                        	mysql_real_escape_string($abflugdatum, $link), 
                        	mysql_real_escape_string($strecke, $link) , 
                        	mysql_real_escape_string($betrag, $link), 
                        	mysql_real_escape_string($bemerkung, $link), 
                        	mysql_real_escape_string($sonstiges, $link), 
                        	mysql_real_escape_string($paxanzahl, $link), 
                        	mysql_real_escape_string($aktion, $link), 
                        	mysql_real_escape_string($agent_2, $link), 
                        	mysql_real_escape_string($pn_2, $link), 
                        	mysql_real_escape_string($datum, $link) ,
                        	mysql_real_escape_string($typ, $link)
                        );
                        Vielen Dank!

                        Alex

                        Comment


                        • #13
                          Hallo Alex,

                          das müßte jetzt so funktionieren.

                          Gruß Falk
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment


                          • #14
                            Hallo Falk,

                            fast - so hatś funktioniert:

                            Code:
                            $query = sprintf("INSERT INTO tickets (BuchungsNr, KundenNamen, AbflugDatum, Strecke, Betrag, Bemerkung, Sonstiges, PaxAnzahl, Aktion, Verkaufer, Pn, Datum, Typ) 
                             	        VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
                                    mysql_real_escape_string($buchungsnummer, $link),
                            	mysql_real_escape_string($kundennamen, $link), 
                            	mysql_real_escape_string($abflugdatum, $link), 
                            	mysql_real_escape_string($strecke, $link) , 
                            	mysql_real_escape_string($betrag, $link), 
                            	mysql_real_escape_string($bemerkung, $link), 
                            	mysql_real_escape_string($sonstiges, $link), 
                            	mysql_real_escape_string($paxanzahl, $link), 
                            	mysql_real_escape_string($aktion, $link), 
                            	mysql_real_escape_string($agent_2, $link), 
                            	mysql_real_escape_string($pn_2, $link), 
                            	mysql_real_escape_string($datum, $link) ,
                            	mysql_real_escape_string($typ, $link)
                            );
                            ...sprich die Hochkommata um den String durch Anführungszeichen ersetzen.

                            Vielen Dank, Du hast mir sehr geholfen

                            Gruss
                            Alex

                            Comment

                            Working...
                            X