Fehler bei mysqli_query insert

cliodriver

Mitglied
ich verwende auf meiner Website ein kleines Gästebuch das jetzt Probleme macht.

Will man einen GB-Eintrag in die SQL schreiben funktioniert dies seit mir unbekannter Zeit nicht mehr.

Verwendet wird

PHP:
        mysqli_query($connection, "INSERT INTO $TABLE_NAME_1 (name, email, homepage, comment, date, ip) VALUES ('$name','$email','$homepage','$comment','$date','$ip')");

Bis zu dieser Zeile funktioniert alles wie zb. die Abfrage der Daten aus der SQL zur Anzeige normal.
Die Verbindung zur SQL funktioniert ebenfalls
Interessant ist das im Adminbereich meiner Seite alles inkl. mysqli_query insert funktioniert. Ich kann Einträge erstellen und ändern.

Ich sehe aktuell keinen Grund warum das nicht funktionieren soll und mir fehlt gerade der Ansatz für die weitere Fehlersuche. Hat jemand eine Idee?

PHP 8.2.9
MySQL 8.0.34-26

hier der rund um diese besage Zeile. Der code für die Eingabe und Datenbankconnection ist ausgelagert
die Zeile ist im markierten Testabschnitt

PHP:
<?php
// ----------------------------------------------------------------------
// Eintrag speichern
// ----------------------------------------------------------------------
if($action == 'save'){

    global $_GET,$_POST,$_SERVER,$ANTISPAM;

    // Antispamprüfung

    if  ($_POST['location'] == ""){

        if ($ANTISPAM == "0"){
    
        }else {
            if (!preg_match("/^\d{9,12}\.\d{4,8}$/", $_POST['hashfile'])): die ("Hacking attempt");
            elseif (!preg_match("/^\d{4}$/", $_POST['antispam'])):    $error = 2;
            else : {
                $hashfile = "antispam/" . $_POST['hashfile'] . ".txt";
                $pic_file = "antispam/" . $_POST['hashfile'] . ".jpg";
                if (file_exists($hashfile)) {
                    $txt_file = fopen($hashfile, "r");
                    $hash = fgets($txt_file, 33);
                    fclose ($txt_file);
                    unlink ($hashfile);
                    if (file_exists($pic_file)) unlink($pic_file);
                    if (md5($_POST['antispam']) == $hash){
                        $error = 0;
                    } else {
                        $error = 2;
                    }
                } else {
                    $error = 2;
                }
            }
            endif;
        }
    }else {
        header("Location: $GB_PFAD");
        exit();
    }
    
    // Ende Antispamprüfung
    
    // Eingaben in die Datenbank schreiben
    
    if ($error == 0){
        $name = substr($_POST['name'], 0, 20);
        $email = substr($_POST['email'], 0, 50);
        $homepage = substr($_POST['homepage'], 0, 50);
        $comment = $_POST['comment'];
        $date = date("d.m.Y - H:i:s");
        $ip = getenv ("REMOTE_ADDR");

// Testabschnitt

        echo '<h1>G&auml;stebuch Wartungsarbeiten! Folgende Daten wurden NICHT in das GB eingetragen:</h1>';
        echo "<p>$name</p>";
        echo "<p>$email</p>";
        echo "<p>$homepage</p>";
        echo "<p>$comment</p>";
        
        echo "<p>$date</p>";


        //include('sql.config.php');
        //$connection = new mysqli($HOST, $ID, $PW, $DB) OR DIE ("Keine Verbindung zu der Datenbank m&ouml;glich.");

        //mysqli_query($connection, "INSERT INTO $TABLE_NAME_1 SET name = '$name', email = '$email', homepage = '$homepage', comment = '$comment', date = '$date', ip = '$ip' ");

        mysqli_query($connection, "INSERT INTO $TABLE_NAME_1 (name, email, homepage, comment, date, ip) VALUES ('$name','$email','$homepage','$comment','$date','$ip')");

// Ende Testabschnitt

        // emailbenachrichtigung senden
        $mailTo = 'info@seitelschlag.at';
        $mailFrom = $email;
            if($mailFrom == ""){
                $mailFrom = $mailTo;
            }
        $mailSubject = 'Neuer Gaestebucheintrag - Dorfgemeinschaft Seitelschlag';
        $mailText = $name." schrieb am ".$date.": \n\n".$comment."\n\n IP: ".$ip;
        
        mail($mailTo, $mailSubject, $mailText, "From: ".$mailFrom);
        // Ende email--------------------

        header("Location: $GB_PFAD");
    }else {
        header("Location: {$GB_PFAD}&action=add&name={$_POST['name']}&email={$_POST['email']}&homepage={$_POST['homepage']}&comment={$_POST['comment']}&error=$error");
    }
    // Ende Datenbank schreiben
}
// Ende Eintrag speichern


// Anzeige Überschrift und Link

if(!$_GET['action']){
    echo "<h1>G&auml;stebuch</h1>
            <h2><a href='{$GB_PFAD}&action=add'>neuer Eintrag</a></h2>";
}else{
    echo "<h1>G&auml;stebuch</h1>
            <h2><a href='{$GB_PFAD}'>Eintr&auml;ge ansehen</a></h2>";
}

// ----------------------------------------------------------------------
// Einträge auflisten
// ----------------------------------------------------------------------
if(!$_GET['action']){ // Sofern keine Aktion => Einträge Anzeigen

    global $_GET,$_POST,$_SERVER,$num;
    
    $result = mysqli_query($connection, "select id from $TABLE_NAME_1");
    
    $num = mysqli_num_rows($result);
    echo "<p>$num Eintr&auml;ge</p>";
    echo "<hr>";
    echo "<p></p>";
    
    $_GET['start'] = mysqli_real_escape_string($connection, $_GET['start']);
    $result = mysqli_query($connection, "select id,name,email,homepage,comment,date,admin,ip from $TABLE_NAME_1 order by id desc LIMIT {$_GET['start']}, $DS_ANZAHL");

    while ($row = mysqli_fetch_object($result))
    {
        $id = $row->id;
        $name = $row->name;
        $email = $row->email;
        $homepage = $row->homepage;
        $date = $row->date;
        $name = htmlspecialchars($name);
        $email = htmlspecialchars($email);
        $homepage = htmlspecialchars($homepage);
        $ip = $row->ip;
        
        include ("row-comment.php");
                        
        if ($homepage == "http://") $homepage = "";
        if (!$homepage AND !$email): $homemail = ""; //"<a href='admin/gb.delete.php?id=$id'>[x]</a>&nbsp;";
        elseif ($homepage AND !$email): $homemail = "|&nbsp;<a href='$homepage' target = '_blank'>Homepage</a>"; //&nbsp;&nbsp;<a href='admin/gb.delete.php?id=$id'>[x]</a>&nbsp;";
        elseif (!$homepage AND $email): $homemail = "|&nbsp;<a href='mailto:$email'>email</a>"; //&nbsp;&nbsp;<a href='admin/gb.delete.php?id=$id'>[x]</a>&nbsp;";
        else: $homemail = "|&nbsp;<a href='$homepage' target = '_blank'>Homepage</a>&nbsp;|&nbsp;<a href='mailto:$email'>email</a>"; //&nbsp;&nbsp;<a href='admin/gb.delete.php?id=$id'>[x]</a>&nbsp;";
        endif;
        
        if ($ip == "") $ip = "";
        else $ip = "| IP gespeichert";
        
echo "<p><b>$name</b> schrieb am $date $homemail $ip</p>";
echo "<p>$row->comment</p>";
echo "<p class='admin'><em>$row->admin</em></p>";
echo "<hr>";
echo "<p></p>";

    }

echo "Seite:&nbsp;&nbsp;";
    if ($num > $DS_ANZAHL)
    {
        $seiten = $num / $DS_ANZAHL;
        $seiten = ceil($seiten);
        $i = ($_GET['start'] / $DS_ANZAHL) -1;
        if ($i < 1)
        {
            $i = 1;
            $_GET['next_start'] = 0;
        }
        else $_GET['next_start'] = $_GET['start'] - (2 * $DS_ANZAHL);
        if (($seiten - $i) >= 5) $seiten1 = $i + 4 ;
        else $seiten1 = $seiten;
        if ($i >= 2)  echo "<a class='gbseiten' href='{$GB_PFAD}&start=0'>erste Seite</a> &nbsp;...&nbsp; ";
            for ($i; $i<= $seiten1; $i++)
            {
                if ($_GET['next_start'] == $_GET['start']) echo "<a class='gbseiten' href='{$GB_PFAD}&start={$_GET['next_start']}'>[ $i ]</a>";
                else echo "<a class='gbseiten' href='{$GB_PFAD}&start={$_GET['next_start']}'> $i</a> ";
                $_GET['next_start'] = $_GET['next_start'] + $DS_ANZAHL;
            }
        $endstart = ($seiten - 1) * $DS_ANZAHL;
        if (($i-1) < $seiten)  echo " &nbsp;...&nbsp; <a class='gbseiten' href='{$GB_PFAD}&start=$endstart'>letzte Seite</a>";
    }
    else echo "<a class='gbseiten' href='{$GB_PFAD}&start=0'>[ 1 ]</a>";
}
?>
 
Du könntest ja einfach mal die DB fragen, was da schief läuft.

Ändere
PHP:
mysqli_query($connection, "INSERT INTO $TABLE_NAME_1 (name, email, homepage, comment, date, ip) VALUES ('$name','$email','$homepage','$comment','$date','$ip')");
in
PHP:
mysqli_query($connection, "INSERT INTO `$TABLE_NAME_1` (`name`, `email`, `homepage`, `comment`, `date`, `ip`) VALUES ('$name','$email','$homepage','$comment','$date','$ip')")
   or die (mysqli_error($connection));

Ich vermute, dass es an den Spaltennamen date und comment hängt, denn das sind reservierte Worte, siehe MySQL :: MySQL 8.0 Reference Manual :: 9.3 Keywords and Reserved Words

Wenn man diese Namen zwischen Backticks schreibt (sollte man immer machen), dann wird es wohl funktionieren.

Und was soll das:
PHP:
$name = substr($_POST['name'], 0, 20);
$email = substr($_POST['email'], 0, 50);
$homepage = substr($_POST['homepage'], 0, 50);

Außerdem solltest du dich mal in Sachen SQL-Injections schlau machen, denn Daten aus einem Formular einfach mal so in die Datenbank zu schreiben ist nicht ganz ungefährlich, siehe dazu PHP: mysqli::real_escape_string - Manual oder verwende gleich Prepared Statements, siehe dazu PHP: Prepared Statements - Manual
 
Zuletzt bearbeitet:
danke, aber das war es leider nicht

das ändern der Spaltennamen brachte nix

ich verwende comment und date auch in einer anderen Tabelle für ein anderes Tool wo es funktioniert.

auch ein händisches eintragen der Werte funktioniert nicht

PHP:
        mysqli_query($connection, "INSERT INTO $TABLE_NAME_1 (name,email,homepage,comment,date,ip) VALUES ('Testname','info@m-l.at','http://www.m-l.at','Testkommentar','17.05.2014 - 15:42:26','000.000.000.000')");
 
Und was ist mit der Fehlermeldung? Wieso hast du mysqli_error nicht eingebaut?

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Punkt 2 & 3 sind bereits in der index.php vorhanden

Punkt 4 ist der Testabschnitt, wie du sehen kannst gibt es da bereits Testausgaben welche auch angezeigt werden
bei mysqli ist eben Schluss

blende ich diese Zeile aus, läuft alles sauber durch, auch die infomail gleich danach geht mit allen Daten durch
 
aktueller Testabschnitt, mysqli-zeilen wurden einzeln ohne Erfolg getestet

PHP:
// Testabschnitt

        echo '<h1>G&auml;stebuch Wartungsarbeiten! Folgende Daten wurden NICHT in das GB eingetragen:</h1>';
        echo "<p>$name</p>";
        echo "<p>$email</p>";
        echo "<p>$homepage</p>";
        echo "<p>$comment</p>";
        
        echo "<p>$date</p>";
        
        echo "Ende der Daten";

        //include('sql.config.php');
        //$connection = new mysqli($HOST, $ID, $PW, $DB) OR DIE ("Keine Verbindung zu der Datenbank m&ouml;glich.");

        //mysqli_query($connection, "INSERT INTO $TABLE_NAME_1 SET name = '$name', email = '$email', homepage = '$homepage', comment = '$comment', date = '$date', ip = '$ip' ");

        mysqli_query($connection, "INSERT INTO $TABLE_NAME_1 (name,email,homepage,comment,date,ip) VALUES ('$name','$email','$homepage','$comment','$date','$ip')") or die (mysqli_error($connection));

        //mysqli_query($connection, "INSERT INTO `$TABLE_NAME_1` (`name`, `email`, `homepage`, `comment`, `date`, `ip`) VALUES ('$name','$email','$homepage','$comment','$date','$ip')") or die (mysqli_error($connection));


// Ende Testabschnitt
 
Versuche das:
PHP:
$query = "INSERT INTO `$TABLE_NAME_1` (`name`, `email`, `homepage`, `comment`, `date`, `ip`) VALUES ('$name','$email','$homepage','$comment','$date','$ip')";

echo $query;

mysqli_query($connection, $query)
   or die (mysqli_error($connection));
Wie sieht die Ausgabe aus?
 

Neue Beiträge

Zurück