Yadgar: [MySQL 4.0] Datenbank nimmt keine Daten an

Hi(gh)!

Um mein ursprüngliches Eingabeseiten-Problem vielleicht irgendwann einmal lösen zu können, fange ich noch einmal ganz klein an, mit einer Test-Datenbank, die nur aus einer Tabelle mit zwei Feldern, ID (Primärschlüssel, auto_increment) und Name (varchar(40)) besteht.

Hier der PHP-Code für die Eingabeseite:

<?php  
  require("head.php"); // enthält u. a. die Funktionen für Datenbankaufruf und Fehlerbehandlung  
  head("TESTDATENBANK - Dateneingabe: Testtabelle");  
?>  
  <body>  
  <div>  
    <h2>TESTDATENBANK: Dateneingabe</h2>  
    <h3>Datentabelle: hersteller</h3>  
  
    <p>  
      <a href="testtabelle.php?input=yes&edit=no">Neue Datensätze eingeben</a> <a href="testtabelle.php?input=no&edit=yes">Vorhandene Datensätze bearbeiten</a>  
    </p>  
<?  
  function enter()  
  {  
    $input = $_GET['input'];  
    $edit = $_GET['edit'];  
    echo '<form method="POST" action="testtabelle.php?input='.$input.'&edit='.$edit.'">';  
    echo '  <table>';  
    echo '    <tr>';  
    echo '      <th>';  
    echo '        Name';  
    echo '      </th>';  
    echo '      <td>';  
    echo '       <input type="text" name="Name">';  
    echo '      </td>';  
    echo '    </tr>';  
    echo '    <tr>';  
    echo '      <td colspan="2">';  
    echo '        <input type="submit" value="Daten absenden">';  
    echo '      </td>';  
    echo '    </td>';  
    echo '  </table>';  
    echo '</form>';  
  }  
  
  $input = $_GET['input'];  
  $edit = $_GET['edit'];  
  
  if ($input == "yes")  
  {  
    enter();  
    $Name = $_POST['Name'];  
    echo "<p>Name = ".$Name."</p>";  
    if (!$Name)  
    {  
      echo "<p>Bitte geben Sie einen Namen ein!</p>";  
    }  
    else  
    {  
      $query = "INSERT INTO Testtabelle (Name) VALUES ('".mysql_real_escape_string($Name)."')";  
      dbcall();  
      dberror();  
      $result = mysql_query($query);  
      dberror();  
      echo "<p>Datensatz wurde in die Datenbank eingetragen!</p>";  
    }  
  }  
?>  
  </body>  
</html>	

Wenn ich jetzt aber mit PHPMyAdmin in meiner Testdatenbank nachsehe, stelle ich fest, dass zwar pro Programmdurchlauf (bis jetzt 2 Durchläufe) Datensätze mit automatisch erhöhten ID-Werten angelegt wurde, das "Name"-Feld aber leer blieb. Wieso?

Bis bald im Khyberspace!

Yadgar

  1. Hi(gh)!

    Merkwürdig... wenn ich statt

    $query = "INSERT INTO Testtabelle (Name) VALUES ('".mysql_real_escape_string($Name)."')";

    auf mysql_real_escape_string() verzichte und einfach nur $Name eingebe, funktioniert es prima - allerdings nicht bei Sonderzeichen, die werden "verhackt" dargestellt! Wie komme ich jetzt weiter?

    Bis bald im Khyberspace!

    Yadgar

  2. Hi,

    <?php

    $query = "INSERT INTO Testtabelle (Name) VALUES ('".mysql_real_escape_string($Name)."')";
          dbcall();
          dberror();
          $result = mysql_query($query);
          dberror();
    ?>

      
    warum benutzt Du noch die veralteten mysql\_\*-Methoden?  
      
    Was macht dbcall()? (ist auf php.net nicht zu finden - ist das was von Dir?)  
    Gleiche Frage für dberror()?  
      
    Was steht in $Name, und was in $query tatsächlich drin?  
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
      
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
    
    
    1. Hi(gh)!

      warum benutzt Du noch die veralteten mysql_*-Methoden?

      Weil mein Remote-Server nur MySQL 4.0 und PHP 4.0 kann!

      Was macht dbcall()?

        function dbcall()  
        {  
          $db = mysql_connect("www.bergisch-afghanistan.de", "Datenbank", "Passwort");  
          dberror();  
          $db = mysql_select_db("Datenbank");  
          dberror();  
        }  
      
      

      Gleiche Frage für dberror()?

        function dberror()  
        {  
          if (mysql_errno())  
          {  
            switch(mysql_errno())  
            {  
      	case 1062:  
      	  die ("Ein Eintrag mit diesen Daten existiert bereits! Bitte korrigieren Sie Ihre Eingabe!<br>");  
      	break;  
      	default:  
      	  die (mysql_errno().": ".mysql_error()."<br>");  
            }  
          }  
        }  
      
      

      Was steht in $Name,

      Nach Eingabe von "André" wird testhalber ausgegeben:

      Name = André

      und was in $query tatsächlich drin?

      INSERT INTO Testtabelle (Name) VALUES ("")

      Aber warum bleibt der String leer? Verstehe ich nicht...

      cu,
      Andreas

      1. Hakuna matata!

        und was in $query tatsächlich drin?

        INSERT INTO Testtabelle (Name) VALUES ("")

        Das kann nicht stimmen.

        $query = "INSERT INTO Testtabelle (Name) VALUES ('".mysql_real_escape_string($Name)."')";  
        
        

        Hier benutzt du einfache Anführungszeichen, um den MySQL-Wert zu umschließen, in deinem Beispiel-Dump stehen da plötzlich doppelte Anführungszeichen.

        Und was steht jetzt tatsächlich drin?

        Erzeuge deine Kontrollausgaben mit var_dump() oder var_export(), statt mit echo() , dann kriegt man auch Werte wie false zu Geischt, die von PHP sonst einfach verschluckt werden.

        --
        “All right, then, I'll go to hell.” – Huck Finn
        1. Hi(gh)!

          Das kann nicht stimmen.

          $query = "INSERT INTO Testtabelle (Name) VALUES ('".mysql_real_escape_string($Name)."')";

          
          >   
          > Hier benutzt du einfache Anführungszeichen, um den MySQL-Wert zu umschließen, in deinem Beispiel-Dump stehen da plötzlich doppelte Anführungszeichen.  
            
          Ich hatte zwischenzeitlich die Schreibweise umgestellt, aktuell ist das hier:  
            
          `$query = 'INSERT INTO Testtabelle (Name) VALUES ("'.mysql_real_escape_string($Name).'")';`{:.language-php}  
            
          
          >   
          > Und was steht jetzt tatsächlich drin?  
          >   
          > Erzeuge deine Kontrollausgaben mit `var_dump()`{:.language-php}  
            
          Bitte sehr:  
            
          string(42) "INSERT INTO Testtabelle (Name) VALUES ("")"  
            
          Bis bald im Khyberspace!  
            
          Yadgar
          
          1. Tach!

            Erzeuge deine Kontrollausgaben mit var_dump()
            Bitte sehr:
            string(42) "INSERT INTO Testtabelle (Name) VALUES ("")"

            Und nun nicht stehenbleiben sondern für die Einzelteile rückwärts gehen. Du fügst $Name ein, was steht da drin? var_dump($Name); gibt die Antwort. Wo kommt der Wert her? Aus $_POST, also var_dump($_POST); Wenn das leer ist, musst du dort weitersuchen. Kommt überhaupt ein POST-Request?

            dedlfix.

            1. Hi(gh)!

              Und nun nicht stehenbleiben sondern für die Einzelteile rückwärts gehen. Du fügst $Name ein, was steht da drin? var_dump($Name); gibt die Antwort. Wo kommt der Wert her? Aus $_POST, also var_dump($_POST); Wenn das leer ist, musst du dort weitersuchen. Kommt überhaupt ein POST-Request?

              Wenn ich "Yadgar" eingebe, steht in $_POST:

              array(1) { ["Name"]=> string(6) "Yadgar" }

              Das sieht korrekt aus... das Problem scheint wirklich mysql_real_escape_string() zu sein!

              Bis bald im Khyberspace!

              Yadgar

              1. Tach!

                Wenn ich "Yadgar" eingebe, steht in $_POST:
                array(1) { ["Name"]=> string(6) "Yadgar" }
                Das sieht korrekt aus... das Problem scheint wirklich mysql_real_escape_string() zu sein!

                Also dann kontrollier das Ergebnis von mysql_real_escape_string() an der Stelle, wo du es auch sonst aufrufen würdest, also eine Zeile vor dem SQL-Statement-Zusammenbau:

                var_dump(mysql_real_escape_string($_POST['Name']));

                Wenn da false rauskommt, wird es wohl an dem liegen, was Mudgard vermutet hat. Fehlermeldungen scheinen dann auch unterdrückt zu sein, sonst hättest du eine sehen müssen. Überprüfe die Werte von error_reporting und display_errors in der Ausgabe von phpinfo(). Während der Entwicklung sollten diese auf E_ALL stehen respektive angeschaltet sein.

                Im Script kann man das mit

                error_reporting(E_ALL);
                ini_set('display_errors', 1);

                nachholen.

                dedlfix.

                1. Hi(gh)!

                  Wenn da false rauskommt, wird es wohl an dem liegen, was Mudgard vermutet hat. Fehlermeldungen scheinen dann auch unterdrückt zu sein, sonst hättest du eine sehen müssen. Überprüfe die Werte von error_reporting und display_errors in der Ausgabe von phpinfo(). Während der Entwicklung sollten diese auf E_ALL stehen respektive angeschaltet sein.

                  Im Script kann man das mit

                  error_reporting(E_ALL);
                  ini_set('display_errors', 1);

                  Das war wohl tatsächlich das Problem - ich habe jetzt den Aufruf der Datenbank vor mysql_real_escape_string() gestellt, und jetzt funktioniert es! Ein Problem bleibt aber noch: Sonderzeichen erscheinen in "verhackter" Form in der Ansicht von PHPMyAdmin - bei MySQL 5 würde man das mit einer passenden Kollation lösen, aber wie in MySQL 4?

                  Bis bald im Khyberspace!

                  Yadgar

                  1. Tach!

                    Sonderzeichen erscheinen in "verhackter" Form in der Ansicht von PHPMyAdmin - bei MySQL 5 würde man das mit einer passenden Kollation lösen, aber wie in MySQL 4?

                    Ab MySQL 4.5 geht es. Davor hat der gesamte Server nur eine Einstellung (vermutlich latin1_swedish_ci), und kennt auch kein UTF-8.

                    dedlfix.

                    1. Hi(gh)!

                      Ab MySQL 4.5 geht es. Davor hat der gesamte Server nur eine Einstellung (vermutlich latin1_swedish_ci), und kennt auch kein UTF-8.

                      Das Problem mit den "verhackten" Sonderzeichen erscheint mir erst einmal nicht so dringend, da ich festgestellt habe, dass es nur bei der Anzeige des Datenbankinhalts mit PHPMyAdmin auftritt, nicht aber bei meiner zwischenzeitlich selbstprogrammierten Auflistungs-Routine (siehe neuen Thread von heute)!

                      Bis bald im Khyberspace!

                      Yadgar

      2. Hi,

        warum benutzt Du noch die veralteten mysql_*-Methoden?
        Weil mein Remote-Server nur MySQL 4.0 und PHP 4.0 kann!

        Dann solltest Du Deinen Provider mal zum Update überreden. Oder den Provider wechseln.

        function dbcall()

        {
            $db = mysql_connect("www.bergisch-afghanistan.de", "Datenbank", "Passwort");
            dberror();
            $db = mysql_select_db("Datenbank");
            dberror();
          }

          
        dbcall (also der connect auf die Datenbank) wird also nach mysql\_real\_escape\_string aufgerufen.  
          
        Lies das, was im PHP-Manual bei mysql\_real\_escape\_string bei "Notes" steht.  
          
        Das fängt an mit "A MySQL connection is required before using mysql\_real\_escape\_string()"  
          
        cu,  
        Andreas
        
        -- 
        [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
        [O o ostern ...](http://ostereier.andreas-waechter.de/)  
          
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
        
        
      3. Hallo Yadgar,

        warum benutzt Du noch die veralteten mysql_*-Methoden?

        Weil mein Remote-Server nur MySQL 4.0 und PHP 4.0 kann!

        Das ist doch hoffentlich nicht dein Ernst, oder? Beide Versionen sind hoffnungslos veraltet und werden nicht mehr unterstützt, wie kann man sich das antun?

        Gruß,
        Tobias