Triyubi: INSERT funktioniert nicht

  
<?php  
  
$dbhost = "localhost";  
$dbuser = "root";  
$dbpass ="";  
$db ="artefakt";  
  
mysql_connect($dbhost, $dbuser, $dbpass) or die ('Verbindung fehlgeschlagen. Kein Server');  
mysql_select_db($db) or die ('Verbindung fehlgeschlagen. Keine Datenbank');  
  
$confirm = $_GET[confirm];  
  
if($confirm == "true")  
{  
$name = $_GET[name];  
$info = $_GET[info];  
$str = $_GET[str];  
$dex = $_GET[dex];  
$intel = $_GET[intel];  
$aus = $_GET[aus];  
$lck = $_GET[lck];  
  
if($str == ""){$str = "0";}  
if($dex == ""){$dex = "0";}  
if($intel == ""){$intel = "0";}  
if($aus == ""){$aus = "0";}  
if($lck == ""){$lck = "0";}  
  
if(($name != "") and ($info != ""))  
{  
mysql_query("INSERT INTO artefakte (name,info,str,dex,int,aus,lck) VALUES ('$name','$info','$str','$dex','$intel','$aus','$lck')");  
mysql_error();  
  
echo "<p align=center><font color=#008000><b>Erfolgreich eingetragen</b></font></p>";  
}  
else  
{  
echo "<p align=center><font color=#FF0000><b>Fehler</b></font></p>";  
}  
  
}  

Mein Problem hierbei ist, wie der Titel schon vermuten lässt, dass bei Ausführung des Scripts nichts in der Tabelle ankommt.

Soweit ich sehe muss das Problem beim INSERT-Befehl liegen. Zumindest wurden die Bedingungen der if-Abfrage erfüllt, da der Text "Erfolgreich eingetragen" einwandfrei angezeigt wird.

An der Rechtschreibung liegt es nicht, ich habe etliche Male Datenbank-, Tabellen-, Spalten-, und Variablennamen überprüft, aber nichts davon habe ich falsch geschrieben.

Die Rechte der Datenbank sind in Ordnung. Zumindest glaube ich bei meinem bescheidenen Wissen, dass es reicht wenn 127.0.0.1 und localhost alle Rechte haben.

Leider ist mysql_error(); auch nicht hilfreich, da es absolut gar nichts wiedergibt.

Ich bin jetzt mit meinem Latein am Ende und über Google habe ich auch nicht viel hilfreicheres gefunden. Hat hier vielleicht noch jemand eine Idee wo der Fehler liegen könnte?

  1. Hallo,

    was genau wird denn an die Datenbank geschickt?

    Kleiner Tipp, das ...

      
    mysql_query("INSERT INTO artefakte (name,info,str,dex,int,aus,lck) VALUES ('$name','$info','$str','$dex','$intel','$aus','$lck')");  
    
    

    ... ist es nicht.

    Ciao, Frank

  2. Hallo,

    1. Wenn der Schlüssel von Array-Variablen ein String ist, muss er in Anführungszeichen stehen.
    Statt

    $_GET[confirm]

    also unbedingt
    $_GET['confirm']
    u.s.w.

    2. Du übernimmst offenbar GET-Variablen ungeprüft in die Query.
    Das ist sehr gefährlich!
    Benütze mysql_escape_string() und mach Dich schlau zu Sicherheit im allgemeinen und SQL injection im speziellen!
    Da Du die GET-Variablen eh umschreibst, kannst Du gleich bei diesem Schritt mysql_escape_string verwenden. Statt
    $name = $_GET[name];
    also:
    $name = mysql_escape_string($_GET['name']);

    3. Ich würde mir zu Kontrollzwecken mal den Query-String anzeigen lassen, um zu sehen, was mysql_query() tatsächlich an die Datenbank schickt.
    (Wie auch Frank vorgeschlagen hat.)

    Also  beispielsweise:

    // Query-String zusammenbauen:  
    $query_eintrag="INSERT INTO artefakte (name,info,str,dex,int,aus,lck) VALUES ('$name','$info','$str','$dex','$intel','$aus','$lck')";  
    // Query abschicken:  
    mysql_query($query_eintrag);  
    // Allfällige Fehlermeldung anzeigen:  
    mysql_error();  
    // Query-String anzeigen:  
    echo "<p>Query-String: $query_eintrag</p>";
    

    HTH, mfg
    Thomas

    P.S. Man wird Dir hier bestimmt noch empfehlen, statt den "veralteten" mysql_*-Funktionen lieber die "modernen" mysqli_*-Funktionen zu benutzen.

    1. Zwei kleine Nachträge:

      Benütze mysql_escape_string() und mach Dich schlau zu Sicherheit im allgemeinen und SQL injection im speziellen!

      Ich habe gerade gesehen, dass mysql_escape_string() veraltet ("deprecated") ist.
      Stattdessen sollte man (seit PHP 4.3) mysql_real_escape_string() verwenden.
      Ausserdem: Infos zu SQL Injection im PHP-Handbuch / in Wikipedia.

      mysql_query() gibt ja (bei einer Query mit INSERT) als Rückgabewert true oder false aus. Das kannst Du zu Kontrollzwecken nutzen:

      // Query abschicken und Rückgabewert auswerten:  
      $resultat=mysql_query($query_eintrag)  
      if ($resultat)  
           { echo "<p>INSERT erfolgreich.</p>"; };  
      else  
           { echo "<p>Fehler: INSERT fehlgeschlagen.</p>"; };  
      // In jedem Fall: Allfällige Fehlermeldung anzeigen:  
      mysql_error();  
      // Query-String anzeigen:  
      echo "<p>Query-String: $query_eintrag</p>";
      

      mfg Thomas

      1. Ups, Semikolon am Zeilenende vergessen. Es sollte natürlich heissen:
        $resultat=mysql_query($query_eintrag);
                                             ^

        1. 1. Daran liegt es leider nicht. Ich hab es ausprobiert und es passiert immer noch nichts.

          2. Danke für den Tipp, ich werde mich definitiv mal darüber informieren, da es in der Tat wichtig scheint. Das Problem besteht aber weiterhin.

          3. Wenn ich es mit deinem Codeabschnitt probiere, dann wird jetzt angezeigt:

          Fehler: INSERT fehlgeschlagen.

          Query-String: INSERT INTO artefakte (name,info,str,dex,int,aus,lck) VALUES ('testname','testinfo','1','2','3','4','5')

          Der Fehler scheint also wirklich beim INSERT zu liegen, aber ich kann am Query-String nichts verkehrtes erkennen. Und mysql_error() ist nach wie vor leider keine große Hilfe.

          1. Hi Triyubi!

            Der Fehler scheint also wirklich beim INSERT zu liegen, aber ich kann am Query-String nichts verkehrtes erkennen. Und mysql_error() ist nach wie vor leider keine große Hilfe.

            Was gibt denn folgendes aus?
            echo mysql_errno() . ": " . mysql_error()

            mfG
            Benjamin

            --
            For animals, the entire universe has been neatly divided into things to (a) mate with, (b) eat, (c) run away from, and (d) rocks.
            1. Was gibt denn folgendes aus?
              echo mysql_errno() . ": " . mysql_error()

              Dabei wird angezeigt:
              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 'int,aus,lck) VALUES ('testname','testinfo','1','2','3','4','5')' at line 1

              Leider kann ich damit nicht genug anfangen, bzw. ein Handbuch bezüglich meines MySQL Servers hab ich gesucht, aber nicht finden können

              1. Mahlzeit Triyubi,

                Dabei wird angezeigt:
                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 'int,aus,lck) VALUES ('testname','testinfo','1','2','3','4','5')' at line 1

                Vielleicht solltest Du dann einfach keine Spaltennamen benutzen, die identisch mit reservierten Wörtern in MySQL sind - oder alternativ solltest Du derartige Spaltennamen passend behandeln.

                Leider kann ich damit nicht genug anfangen, bzw. ein Handbuch bezüglich meines MySQL Servers hab ich gesucht, aber nicht finden können

                Und die Online-Dokumentation nutzt Du nicht, weil ...?

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                1. Vielleicht solltest Du dann einfach keine Spaltennamen benutzen, die identisch mit reservierten Wörtern in MySQL sind - oder alternativ solltest Du derartige Spaltennamen passend behandeln.

                  Ok, eigentlich hätte ich mir das mit den reservierten Wörtern denken können/sollen. Aber vielen Dank für die Hilfe. Jetzt klappt alles einwandfrei.

                  Und die Online-Dokumentation nutzt Du nicht, weil ...?

                  ... ich ernsthaft noch nie davon gehört habe. Jetzt wo sich aber dieses Detail geändert hat, werde ich mir auch mal die Online-Dokumentation genau ansehen.

          2. mysql_query($query_eintrag);
            // Allfällige Fehlermeldung anzeigen:
            mysql_error();

            Der Fehler scheint also wirklich beim INSERT zu liegen, aber ich kann am Query-String nichts verkehrtes erkennen. Und mysql_error() ist nach wie vor leider keine große Hilfe.

            Mach' mal was ganz Verrücktes: Schau in die Anleitung.

            Dinge wie 'Rückgabewert: Liefert den Fehlertext der letzten MySQL-Funktion' oder 'echo mysql_errno() . ": " . mysql_error() . "\n";' können doch eigentlich nicht so schwer zu verstehen sein, wenn man sich ein zumindest ein klein wenig Mühe gibt.

  3. Hi!

    mysql_query("INSERT INTO artefakte (name,info,str,dex,int,aus,lck) VALUES ('$name','$info','$str','$dex','$intel','$aus','$lck')");
    mysql_error();
    echo "<p align=center><font color=#008000><b>Erfolgreich eingetragen</b></font></p>";

    Erst wenn du den Rückgabewert von mysql_query() ausgewertet und festgestellt hast, dass er nicht false ist, kannst du behaupten, dass etwas erfolgreich eingetragen wurde.

    Leider ist mysql_error(); auch nicht hilfreich, da es absolut gar nichts wiedergibt.

    Diese Funktion macht auch nichts sichtbares. Sie gibt den Fehlertext zurück. Zum Anzeigen fehlt dann noch ein echo oder ähnliches.

    Bitte nutze das PHP-Handbuch, um dich über die Arbeitsweise der von dir verwendeten Funktionen zu informieren!

    Lo!