PHP Gästebuch: Daten eintragen funktioniert nicht

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hi hab folgendes Problem:

Habe mal versucht aus nem Tutorial mir nen eigenes Gästebuch zu schreiben
(zum Tutorial).
Wenn ich manuell einen Eintrag bei myphpadmin mache, dann zeigt der mir die Einträge auf der Seite an. Wenn ich jedoch versuche, mit meinem Formular einen Eintrag abzuschicken, dann klappt es nicht, den Eintrag in die Tabelle "gaestebuch" einzutragen.

Hier der Quelltext:
PHP:
<?php
//Connect zur Datenbank
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', 'XXX' );
define ( 'MYSQL_KENNWORT', 'XXX' );
define ( 'MYSQL_DATENBANK', 'XXX' );

$db_con = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( ! $db_con )
{
    // das Problem ausgeben mit: mysql_error()
    die('Verbindung zur Datenbank fehlgeschlagen. Bitte später probieren. ');
}
$db_sel = mysql_select_db( MYSQL_DATENBANK )
    or die("Auswahl der Datenbank fehlgeschlagen.");


// SQL-Befehl für den Zugriff
$sql_query = "SELECT * FROM gaestebuch
		ORDER BY datum";
	
// ausführen des mysql-Befehls
$db_query = mysql_query( $sql_query );
if ( ! $db_query )
{
    die('Ungültige Abfrage: ' . mysql_error());
}
?>



<div class="boxtitle">Gästebuch</div> 
<div class="boxinhalt">
	
<table>
<tr>
	<td>
		<table id="gaestebuchform">
		<tr>
			<td>
				<form method="post"><br>
				<input type="text" name="name">
					<br><font class="small">Dein Name*</font><br><br>
				<input type="email" name="email">
					<br><font class="small">Deine Email</font><br><br>
				<textarea name="eintrag" class="gaestebuch"></textarea>
					<br><font class="small">Deine Grüße*</font><br><br>
				<input type="submit" name="valider" value="Eintragen"><br><br>
				</form>
				<?php
				// In die SQL-Datenbank eintragen

				if($_POST['valider']>4 && strlen($_POST['eintrag'])>4)
				{
					$sql="INSERT INTO gaestebuch (Name, Email, Datum, Text)
					VALUES('".mysql_real_escape_string($_POST['name'])."',
						'".mysql_real_escape_string($_POST['email'])."',
						'".mysql_real_escape_string(date('Y-m-d H:i:s'))."'
						'".mysql_real_escape_string($_POST['eintrag'])."')";  
					$result = mysql_query($sql);
					if (!$result) 
					{
						die('SQL Befehl konnte nicht ausgeführt werden. ' . mysql_error());
					}
				
				}
				?>
			</td>
		</tr>
		</table>
	</td>	
	<td>
		<table id="gaestebuchanzeige">
		<tr>
			<td>
				<?php
				// Anzeige der Anzahl der Einträge
				$gb_anzahl = mysql_num_rows($db_query);
				echo "<p>Anzahl der Gästebuch-Einträge: $gb_anzahl  </p>";
					
				while ($daten = mysql_fetch_array( $db_query, MYSQL_ASSOC))
				{
					// Aushabe der Daten
					echo "ID: ";
					echo $daten['ID'];
					echo "<br />";
					
					echo "Name: ";
					echo $daten['Name'];
					echo "<br />";
					
					echo "E-Mail: ";
					echo $daten['Email'];
					echo "<br />";
					
					echo "Datum: ";
					echo $daten['Datum'];
					echo "<br />";
				
					echo "Gästebucheintrag: ";
					echo $daten['Text'];
					echo "<br />";
				}
				mysql_free_result( $db_query );
				?>

			</td>
		</tr>
		</table>
	</td>
</tr>
</table>
</div>

Hoffe ihr könnt mir Helfen
 
Ich habe damit jetzt schon länger nichts mehr gemacht.
Aber wenn sonst keiner den Fehler sieht, versuch es dochma damit den Fehler etwas einzugrenzen.
Geh einfach mal hin und schau ob er überhaupt in deine Schleife zum schreiben in die DB geht.
Mach einfach ein echo innerhalb dieser Schleife.
echo "Schleife wird ausgeführt.<br>";
Wenn er das tut, dann schreib erstmal fixe Werte rein. Und so weiter.

Vielleicht kommst du damit Dem Fehler auf die Schliche :)
 
Nookiewww schrieb:
Ich habe damit jetzt schon länger nichts mehr gemacht.
Geh einfach mal hin und schau ob er überhaupt in deine Schleife zum schreiben in die DB geht.
Mach einfach ein echo innerhalb dieser Schleife.

Die While-Schleife ist nicht zum eintragen, sondern zur Ausgabe. Das funktioniert auch, aber nur weil ich 2 Einträge manuell bei phpmyadmin eingetragen hab
 
if($_POST['valider']>4


?

Der submit button hat meines Wissens eher die Zustände true/false, leer/nicht leer
Versuch mal if($_POST['valider'] &&

und ich würde der Übersicht wegen die insert anweisung oben über dem html-code hinsetzen.
 
Das Formular in deinem Quelltext hat kein Ziel. Das solltest du vielleicht noch ergänzen.
PHP:
<form method="post" action="<?php echo __FILE__; ?>">...</form>
Außerdem ist die Prüfung beim Eintragen des Eintrags falsch:
PHP:
if ($_POST['valider'] > 4 ...
kann nur funktionieren, wenn $_POST['valider'] eine Zahl ist. Besser wäre hier
PHP:
if (isset($_POST['valider']) && ...
oder
PHP:
if (strlen($_POST['valider']) > 4 && ...
Wobei erstere Lösung besser ist, da hier nur geprüft wird, ob die Variable gesetzt ist, nicht aber, was für einen Wert sie hat.


Insgesamt solltest du das Script so nicht in die freie Wildbahn setzen, zum üben reicht es aber ;) Gewöhn dir aber am besten gleich an validen HTML-Quelltext zu fabrizieren.
 
muhkuher schrieb:
Das Formular in deinem Quelltext hat kein Ziel. Das solltest du vielleicht noch ergänzen.
PHP:
<form method="post" action="<?php echo __FILE__; ?>">...</form>

Das action verweißt doch nur auf eine andere Datei wo der php-code stehen sollte oder nicht?
In diesem Fall steht doch der PHP-Code in der gleichen php-datei wie das Formular...
So habe ich das zumindestens verstanden...
Hab schon mal nen php-script geschrieben, wo das eintragen so funktioniert hat mit diesem formular und dem Eintrag... nun ist nur noch die ausgabe hinzugekommen und der eintrag von datum und zeit...
Könnte mein fehler vll. sein das der Datentyp des Text als BLOB in der Tabelle festgelegt ist?
bei den 2 einträgen die ich manuell eingetragen habe, klappt die ausgabe aber und der zeigt mir in der tabelle unter blob nur die größe des textes an, aber den text an sich nicht...kann mir vorstellen das blob zur formatierung des textes dient
muhkuher schrieb:
Insgesamt solltest du das Script so nicht in die freie Wildbahn setzen, zum üben reicht es aber ;) Gewöhn dir aber am besten gleich an validen HTML-Quelltext zu fabrizieren.

Joar... aber da steht ja im endeffekt ja nicht mehr drinne wie im tutorial
 
Blob Felder dienen in der Regel für multimediale Inhalte, zb. Bilder, die man direkt in die DB speichern will. Man sollte es aber nach Möglichkeit vermeiden. Und gerade für Texte und nicht Binärdateien ganz einfach TEXT oder Varchar als Datentyp wählen.

Form Felder sollten immer valide eine Datei/Ziel zugeordnet bekommen. Das was du machst mag in manchen Fällen so auch funktionieren, entspricht aber nicht der Norm.
 
Relict schrieb:
Blob Felder dienen in der Regel für multimediale Inhalte, zb. Bilder, die man direkt in die DB speichern will. Man sollte es aber nach Möglichkeit vermeiden. Und gerade für Texte und nicht Binärdateien ganz einfach TEXT oder Varchar als Datentyp wählen.

Form Felder sollten immer valide eine Datei/Ziel zugeordnet bekommen. Das was du machst mag in manchen Fällen so auch funktionieren, entspricht aber nicht der Norm.

Dann weiß ich nicht warum die das dann im Tutorial so gemacht haben... ^^

muss ich dann unter action die gleiche datei wählen wie das formular?
 
ja klar, dort erfolgt ja bei Dir auch der insert. Und es soll ja anschliessend sicher auch die gleiche Seite wieder angezeigt werden. ;)

Du kannst auch den direkten Dateinamen angeben, hauptsache überhaupt was und nicht so was halbgares. ^^
<form method="post" action="meinefile.php">...</form>
 
Relict schrieb:
<form method="post" action="meinefile.php">...</form>

Das Problem ist jetzt nur dabei, dass ich das gaestebuch in eine include Datei geschrieben habe...die wird dann eingebunden und steht dann auf der hauptseite...
dann müsste ich die hauptseite angeben.... aber wenn ich mein gb- auf eine andere seite einbinde habe ich dann das problem, dass ich die action dann ändern muss.... kann man das irgendwie so machen, dass ich das dann nicht ändern muss?
 
Includes ruft man nie direkt auf. Sonst wären sie keine includes. ^^

In der Form die Hauptseite angeben. Die fungiert sicher als Steuerdatei ?
In der Hauptseite dann entsprechend auf den Eingang/Parameter abfragen und die entsprechende Datei includen.

Wie rufst du denn jetzt die GB-Seite überhaupt auf? So machst du es dann auch. Ist ja nix anderes und auch die DB und php Geschichten bereits in der selben Datei enthalten. Also gleichen Link nehmen, wie beim Aufruf des GB auf der Hauptseite.

PS:
Achso und wenn du das script von einer anderen Datei includest, musst Du von der jeweils anderen Datei diese ihren Link als Variable per php an die include "weiterreichen" und in das form-action schreiben lassen. Also dynamisch.
 
Zuletzt bearbeitet:
hmmmm naja ich probiers mal...
aber heißt ja nicht das das dann mein gesamtproblem behebt
 
nein, nicht wirklich. Dein Hauptproblem war wohl das
if ($_POST['valider'] > 4

Das ist Quark und kann nur zum Misserfolg führen, weil es nie >4 sein wird. ^^
 
so... hab das jetzt so so strukturiert...

PHP:
<?php
//Connect zur Datenbank
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', 'XXX' );
define ( 'MYSQL_KENNWORT', 'XXX' );
define ( 'MYSQL_DATENBANK', 'XXX' );

$db_con = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( ! $db_con )
{
    // das Problem ausgeben mit: mysql_error()
    die('Verbindung zur Datenbank fehlgeschlagen. Bitte später probieren. ');
}
$db_sel = mysql_select_db( MYSQL_DATENBANK )
    or die("Auswahl der Datenbank fehlgeschlagen.");


// SQL-Befehl für den Zugriff
$sql_query = "SELECT * FROM gaestebuch
		ORDER BY datum";
	
// ausführen des mysql-Befehls
$db_query = mysql_query( $sql_query );
if ( ! $db_query )
{
    die('Ungültige Abfrage: ' . mysql_error());
}
	
				// In die SQL-Datenbank eintragen

				if($_POST['valider'] && strlen($_POST['eintrag'])>4)
				{
					$sql="INSERT INTO gaestebuch (Name, Email, Datum, Text)
					VALUES('".mysql_real_escape_string($_POST['name'])."',
						'".mysql_real_escape_string($_POST['email'])."',
						'".mysql_real_escape_string(date('Y-m-d H:i:s'))."'
						'".mysql_real_escape_string($_POST['eintrag'])."')";  
					$result = mysql_query($sql);
					if (!$result) 
					{
						die('SQL Befehl konnte nicht ausgeführt werden. ' . mysql_error());
					}
				
				}
				
?>



<div class="boxtitle">Gästebuch</div> 
<div class="boxinhalt">
	
<table>
<tr>
	<td>
		<table id="gaestebuchform">
		<tr>
			<td>
				<form method="post" action="index.php"><br>
				<input type="text" name="name">
					<br><font class="small">Dein Name*</font><br><br>
				<input type="email" name="email">
					<br><font class="small">Deine Email</font><br><br>
				<textarea name="eintrag" class="gaestebuch"></textarea>
					<br><font class="small">Deine Grüße*</font><br><br>
				<input type="submit" name="valider" value="Eintragen"><br><br>
				</form>
			</td>
		</tr>
		</table>
	</td>	
	<td>
		<table id="gaestebuchanzeige">
		<tr>
			<td>
			 <?php
				// Anzeige der Anzahl der Einträge
				$gb_anzahl = mysql_num_rows($db_query);
				echo "<p>Anzahl der Gästebuch-Einträge: $gb_anzahl  </p>";
					
				while ($daten = mysql_fetch_array( $db_query, MYSQL_ASSOC))
				{
					// Aushabe der Daten
					echo "ID: ";
					echo $daten['ID'];
					echo "<br />";
					
					echo "Name: ";
					echo $daten['Name'];
					echo "<br />";
					
					echo "E-Mail: ";
					echo $daten['Email'];
					echo "<br />";
					
					echo "Datum: ";
					echo $daten['Datum'];
					echo "<br />";
				
					echo "Gästebucheintrag: ";
					echo $daten['Text'];
					echo "<br />";
				}
				mysql_free_result( $db_query );
				?>

			</td>
		</tr>
		</table>
	</td>
</tr>
</table>
</div>


Jetzt sagt der mir als Fehlermeldung erst die Meldung an, die von der $result ausgelöst wird und dann die Meldung Column count doesn't match value count at row 1
 
SO geht es nicht! Du überschreibst ja wieder die vorige Abfrage mit dem folgenden insert.
mach es wenn schon dann wieder so wie vorher:

PHP:
           <?php
						 
// SQL-Befehl für den Zugriff
$sql_query = "SELECT * FROM gaestebuch
        ORDER BY datum";
    
// ausführen des mysql-Befehls
$db_query = mysql_query( $sql_query );	

if ( ! $db_query )
{
    die('Ungültige Abfrage: ' . mysql_error());
}
					 
                // Anzeige der Anzahl der Einträge
                $gb_anzahl = mysql_num_rows($db_query);
                echo "<p>Anzahl der Gästebuch-Einträge: $gb_anzahl  </p>";
                    
                while ($daten = mysql_fetch_array( $db_query, MYSQL_ASSOC))
                {
                    // Aushabe der Daten
                    echo "ID: ";
                    echo $daten['ID'];
                    echo "<br />";
                    
                    echo "Name: ";
                    echo $daten['Name'];
                    echo "<br />";
                    
                    echo "E-Mail: ";
                    echo $daten['Email'];
                    echo "<br />";
                    
                    echo "Datum: ";
                    echo $daten['Datum'];
                    echo "<br />";
                
                    echo "Gästebucheintrag: ";
                    echo $daten['Text'];
                    echo "<br />";
                }
                mysql_free_result( $db_query );
                ?>


Column count doesn't match
bedeutet Deine insert Anweisung stimmt evt. nicht mit den Feldern in der DB überein.
Bzw es ist ein Folgefehler aus Deinem aktuellen Wirrwar.

Lass es erstmal so wie es war, nur zusätzlich mit unseren Veränderungen.
Optimieren kannst du dann immer noch, wenn es erstmal überhaupt funzt.

PS:

Und zu dem form-action auf verschiedenen Seiten:

einfach in jede jeweilige Seite, welche das script incuded vor dem include oder gleich ganz oben eine Variable mit eigenem Link setzen:

$actionLnk = "index.php";

in eine andere

$actionLnk = "eineandere.php";

oder in alle einfach:

$actionLnk = __FILE__;
oder
$actionLnk = $_PHP_SELF; // $_SERVER['PHP_SELF']

in der inlcude selber dann
<form method="post" action="<? echo $actionLnk; ?>">
 
Zuletzt bearbeitet:
naja die Ausgabe muss schon an der stelle bleiben und darf nicht nach oben... weil die ausgabe sonst nicht in der tabelle landet...

aber ich hab den fehler gefunden... das war nen simples kommata, welches gefehlt hatte...
PHP:
if($_POST['valider'] && strlen($_POST['eintrag'])>4)
				{
					$sql="INSERT INTO gaestebuch (Name, Email, Datum, Text)
					VALUES('".mysql_real_escape_string($_POST['name'])."',
						'".mysql_real_escape_string($_POST['email'])."',
						'".mysql_real_escape_string(date('Y-m-d H:i:s'))."'>>,<<
						'".mysql_real_escape_string($_POST['eintrag'])."')";  
					$result = mysql_query($sql);
					if (!$result) 
					{
						die('SQL Befehl konnte nicht ausgeführt werden. ' . mysql_error());
					}			
				}
 
Aber nun ist noch zuletzt das Problem, dass der die Ausgabe nach dem Abschicken nicht aktualisiert...

d.h. ich muss erst die seite nochmal aktualisieren, damit der den neuen eintrag auf der seite anzeigt
 
Naja ist klar, wenn die SQL-Select Abfrage der Einträge VOR dem insert gemacht wird.
Versuch mein letztes Beispiel oder mach das insert VOR der SELECT Anweisung. ;)

PS:
Übrigens meinte ich im letzten Bsp. die Select wieder nach unten in die Tabelle, nicht alles nach oben.
Es sei denn, du machst aus allen echos eine Variable und gibst diese unten mit einem Rutsch aus.
Und schon hättest du schon ein halbes Template-System. ;)
 
Zuletzt bearbeitet:
Relict schrieb:
Naja ist klar, wenn die SQL-Select Abfrage der Einträge VOR dem insert gemacht wird.

Hmmm ja aber die SQL-Abfrage wird doch zuerst in $sql_query nur gespeichert
PHP:
// SQL-Befehl für den Zugriff
$sql_query = "SELECT * FROM gaestebuch
		ORDER BY datum";

und dann in der Ausgabe, welches nach dem Formular und der Insert erfolgt, abgefragt?
PHP:
while ($daten = mysql_fetch_array( $db_query, MYSQL_ASSOC))
				{
					// Aushabe der Daten
                                 }
Ich merke schon es wird langsam Spät :D
 
Zurück
Oben