Mario: Datenbank - Variable wird nicht eingetragen

Hallo Nachteulen,

ich habe da ein kleines Datenbank "Insert"-Problem.
Und zwar:
Wenn eine bestimmte Bedingung erfüllt ist, lese ich (mit einem Script) aus einer Tabelle einen Namen aus, um ihn anschließend in einer anderen Tabelle einzutragen. Das funzt nur leider nicht.
Der Name besteht aus zwei Wörtern, die mit einem Leerzeichen getrennt sind. Da ich mir sicher bin, das der Code soweit richtig ist (Andere Variablen werden eingetragen) gehe ich mal ganz startk davon aus, dass es an diesem Leerzeichen liegt. Aber obwohl ich...
[...$name = mysql_real_escape_string($name);...]
...anwende klappt das irgendwie immer noch nicht.

Habt Ihr da noch einen Vorschlag für mich?

Danke und Gruß

Mario

  1. Hello,

    Da ich mir sicher bin, das der Code soweit richtig ist

    das waren schon ganz andere...
    Bitte zeige ihn uns trotzdem, auch auf die Gefahr einer harten aber gut gemeinten Debatte...andernfalls bleibt nicht viel mehr als wilde und sinnlose Spekulationen und du wirst bei 80% sagen "habe ich schon probiert".

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
    1. Kein Problem,
      dann noch kurz ein Paar Hintergrundinfos:
      Beiträge in einem Gästebuch können von bestimmten Personen beantwortet werden. Dazu wird in der ersten Tabelle 'Buch'(in der die Beiträge stehen) bei dem entsprechenden Beitrag (hier $ziel) das Feld 'antwort' auf 'ja' gesetzt. Anschließend wird zunächst aus der Tabelle 'Biographie' der entsprechende Name das Antworters gezogen, um anschließend in einer dritten Tabelle 'Antworten' die Antwort zu speichern. Neben dem Namen und der Antwort wird der Zeitpunkt und auch die ID des Ursprungbeitrages eingetragen. Klingt vielleicht etwas kompliziert, aber wenn man soweit drin steckt, ist das ganz logisch.
      so sieht´s aus:
      [...
      (Zugang zur Datenbank besteht)
      ...
      <?php
       //Auslesen der Eingaben des Besuchers
       $aufruf = $_POST["aufruf"];
       $zugang = $_POST["zugang"];
       $ziel = $_POST["ziel"];
       $tabelle = $_POST["tabelle"];

      /*Eintrag einer Antwort*/
       if ($tabelle=="Antworten")
       {
       mysql_query("Update Buch Set antwort="ja" WHERE id="$ziel"");

      $name_set = mysql_query("SELECT name FROM Biographie WHERE id="$zugang" ");
       while ($name_row = mysql_fetch_assoc($name_set))
       {
       $name=$name_row["name"];
       }
       $datum = date("Y-m-d",time());
       $zeit = date("H:i:00");
       echo"(1:$name)"; //Testausgabe richtig!
       $name = mysql_real_escape_string($name);
       $antwort = mysql_real_escape_string($antwort);
       echo"(2:$name)"; //Testausgabe richtig!
       mysql_query("INSERT INTO Antworten (antwort, von, kommentar, datum, zeit) VALUES ("$ziel", "$name", "$antwort", "$datum", "$zeit")");
       }

      //Aufrufen der Bestätigung
       header("Location: ../$aufruf.php?zugang=$zugang");
      ...]

      Die beiden Testausgaben, geben den richtigen Namen aus.
      Es wird alles, bis auf $name eingetragen.

      Gruß Mario

      1. Hi,

        echo"(2:$name)"; //Testausgabe richtig!

        und die lautet? Herrje, bitte verfasse doch eine brauchbare Fehlerbeschreibung!

        header("Location: ../$aufruf.php?zugang=$zugang");

        Der Location-Header *MUSS* eine absolute URL enthalten.

        Es wird alles, bis auf $name eingetragen.

        Was bedeutet das? Ist das Feld leer, steht was anderes drin, gibt es einen Datensatz weniger als erhofft? Wie lautet die Tabellenstruktur? Welche Würmer hast Du noch in Nase oder anderen Körperöffnungen stecken?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. mhhh...

          so frech und dreist ich Deine Antworten auch immer finde...
          ...leider hast Du doch immer wieder gute Ansätze für mich :(

          Es lag tatsächlich an der Struktur.
          In Tabelle 'Biograhpie' ist das Feld name ein varchar(30)
          In Tabelle 'Antworten' ist es ein Enum mit den entsprechenden Namen festgelegt.

          Zwar wurde der Name mit aufgelistet - aber das mochte er anscheinend nicht.

          Also notgedrungenes, aber trotzdem aufrichtiges Dankeschön geht an

          Cheatah

          Besten Gruß

          Mario

      2. Hello,

        generell mal eine Frage, und die ist einfach nur eine Frage: funktionieren die doppelten Anführungszeichen im SQL anstandslos? Ich selbst benutze in SQL immer einfache Anführungszeichen.

        mysql_query("Update Buch Set antwort="ja" WHERE id="$ziel"");

        Potenzial für SQL-Injection. Warum benutzt du hier nicht, wie unten auch, mysql_real_escape_string?
        Weiterhin führst du keine Fehlerbehandlung durch, d.h. das Statement könnte schief gegangen sein.

        $name_set = mysql_query("SELECT name FROM Biographie WHERE id="$zugang" ");

        hier ist ebenfalls keine Fehlerbehandlung, es könnte kein Ergebnis geben. Es gilt der selbe Hinweis auf SQL-Injection wie oben.

        mysql_query("INSERT INTO Antworten (antwort, von, kommentar, datum, zeit) VALUES ("$ziel", "$name", "$antwort", "$datum", "$zeit")");

        Zu guter vorletzt: es empfiehlt sich als Debugging-Technik seine Statements nicht direkt im mysql_query aufzubauen:

          
        $query = "SELECT ...";  
        mysql_query($query);  
        
        

        Mit dieser Schreibweise kannst du schneller eine Debugausgabe des Statements erzwingen, z.B. sogar über eine Konfigurationseinstellung:

          
        $query = "SELECT ...";  
        // es wird eine Konfigurationskonstante DEBUG vorausgesetzt...  
        if (DEBUG) {  
           echo $query;  
        }  
        mysql_query($query);  
        
        

        Und zu aller letzt: Ich hab mehrfach SQL-Injection in den Mund genommen, die Nutzung von mysqli zusammen mit Prepared Statements kann dir einiges an Escaping ersparen.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Don't lick your wounds: celebrate them. The scars you bear are the signs of a competitor.  --  character Richard Webber on Grey's Anatomy: 'Where the wild things are'
        1. echo $begrüßung;

          generell mal eine Frage, und die ist einfach nur eine Frage: funktionieren die doppelten Anführungszeichen im SQL anstandslos? Ich selbst benutze in SQL immer einfache Anführungszeichen.

          MySQL kann mit beiden Typen umgehen. Andere Dialekte können das nicht.

          echo "$verabschiedung $name";

      3. echo $begrüßung;

        //Auslesen der Eingaben des Besuchers
        $aufruf = $_POST["aufruf"];
        $zugang = $_POST["zugang"];
        $ziel = $_POST["ziel"];
        $tabelle = $_POST["tabelle"];

        Das ist völlig unnötig. Du kannst genauso gut die Elemente des $_POST-Arrays direkt verwenden, ohne sie in weitere Variablen umzukopieren. So verschleierst du nur die Herkunft und macht durch die zusätzlichen Variablen das Script nicht einfacher.

        $name = mysql_real_escape_string($name);
        $antwort = mysql_real_escape_string($antwort);
        mysql_query("INSERT INTO Antworten (antwort, von, kommentar, datum, zeit) VALUES ("$ziel", "$name", "$antwort", "$datum", "$zeit")");

        Wenn du dir das Statement ausgäbest und die schon erwähnte Reaktion auf die über den Rückgabewert von mysql_query() bekanntgegebene Fehlerzustände reagiertest, könntest du die Ursache einfacher finden. Zudem hast du nur den Namen und die Antwort SQL-String-gerecht behandelt. Zeit und Datum sind hier unkritisch, weil sie aus Funktionen mit definiertem Ergebnis erstellt worden sind. Aber das Ziel kommt aus einer Benutzereingabe und die hast du nicht behandelt. Wen du das Behandeln und Statement-Zusammensetzen in einer Anweisung schriebest, fiele diese Unterlassung vielleicht eher auf.

        $sql = sprintf("INSERT INTO Antworten (antwort, von, kommentar, datum, zeit) VALUES ('%s', '%s', '%s', '%s', '%s')",
          $ziel, // stattdessen: mysql_real_escape_string($_POST["ziel"]),
          mysql_real_escape_string($_POST["name"]),
          mysql_real_escape_string($_POST["antwort"]),
          $datum,
          $zeit);

        echo "$verabschiedung $name";