SQL Daten werden nicht geschrieben. Anfänger Problem

errorist

New Member
Hallo,

ich wollte mich etwas in MySQL einlesen und habe ein Script, welches ich durch ausprobieren erweitern möchte.
Es kommt aber immer zu dem Problem, dass die Daten nicht geschrieben werden konnten. Soweit funktioniert also das Fehlerhandling.
Die Datenbank heisst "db123456789" und es soll in die Tabelle "bestellung" geschrieben werden. Die Tabelle hat noch das Feld ID, welches durch autoincrement gefüllt werden soll.
Die Benutezrdaten sind soweit korrekt, sonst würde ein anderer Fehler hochkommen (habe ich schon probiert).
Vielleicht seht ihr meinen Fehler

Hier das Script.

PHP:
<?php
$db_host = "db123456.1und1.de";
$db_user = "xxx";
$db_pass = "xxx";
$db_name = "db123456789";

if (isset( $_POST['eintragen'] ))
{
	// Maskierende Slashes aus POST entfernen
	$_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;
	
	// Inhalte der Felder aus POST holen
	$vorname = $_POST['vorname'];
	$nachname = $_POST['nachname'];
	$groesse = (int) $_POST['groesse'];
	$initialien = isset( $_POST['initialien'] ) ? 1 : 0;
	
	/* ************************************************************************************************ */
	/* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
	/* ************************************************************************************************ */
	
	// Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
	// Verbindung oeffnen und Datenbank ausweahlen
	$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
	if ($conID)
	{
		mysql_select_db( $db_name, $conID );
	}
	
	// Anfrage zusammenstellen der an die DB geschickt werden soll
	$sql = "INSERT INTO `bestellung`
				(`vorname`, `nachname`, `groesse`, `initialien`)
			VALUES(
				'" .mysql_real_escape_string( $vorname ). "',
				'" .mysql_real_escape_string( $nachname ). "',
				" .$groesse. ",
				'" .mysql_real_escape_string( $initialien ). "',

				)";
	// Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
	mysql_query( $sql );
	// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
	if (mysql_affected_rows() == 1)
	{
		echo "<h3>Der Datensatz wurde hinzugefügt!</h3>";
		// Hier kann weiterer Code stehen der ausgefuehrt werden soll
		// wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken
		// der ueber den neuen Eintrag informiert
	}
	else
	{
		echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
		// Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren
		// wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken
		// damit er sich um den Fehler kuemmern kann, etc pp
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formularinhalt in eine Datenbank schreiben</title>
</head>

<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Vorname: <input type="text" name="vorname" id="vorname" /><br />
Nachname: <input type="text" name="nachname" id="nachname" /><br />
Größe: <select name="groesse" id="groesse"><?php for ($i=8; $i<12; $i++) { echo "<option>{$i}</option>"; } ?></select><br />
Initialien: <input type="checkbox" name="initialien" id="initialien" /><br />
<input type="submit" name="eintragen" id="eintragen" value="Abschicken" />

</body>
</html>
 
ohne Fehlermeldung kann man da wenig machen.

Eine einfache Möglichkeit deinen Query explizit zu testen wären per "echo $sql" diesen auszugeben und in einer Adminoberfläche wie phpmyAdmin zu testen.
 
Einfach das letzte Komma bei

'" .mysql_real_escape_string( $vorname ). "',
'" .mysql_real_escape_string( $nachname ). "',
" .$groesse. ",
'" .mysql_real_escape_string( $initialien ). "',


entfernen.
Siehe da, es klappt.

Danke sehr.
 
Du hast aber hoffentlich nicht vor das Script in irgendeiner Form produktiv einzusetzen?
Denn zum Einen verwendet das Ding veraltete/deprecated Funktionen, zum Anderen ist es unsicher.
 
Also deprecated PHP-Aufrufe/-Funktionen sehe ich da erstmal nicht - dennoch taugt das Beispiel als hervorragendes Muster für die Anfälligkeit auf SQL-Injections weil die Hinweis in der Kommentierung im Quelltext nicht beachtet wurde, nämlich die Validierung der Eingabedaten.

P.S.: Die Mischung verschiedener if ... then-Schreibweisen ist auch kein guter Stil auch wenn es auf den ersten Blick kürzer und übersichtlicher scheint, liest es sich nicht besser.
 
Last edited by a moderator:
Nun so ganz depricated ist das nicht, eher wohl aus Kompatibilitätsgründen noch mit drin. Du weißt ja nicht auf welcher PHP-Version das Script noch eingesetzt wird. Insofern ist es theoretisch nützlich zu wissen, ob magic-quotes noch funktioniert oder nicht - und das wird erst bei Version > 5.4 interessant, alles darunter kann durchaus noch magic-quote aktiviert haben.

Und PHP 5.3 ist sehr wohl noch im Einsatz.
 
Magic-Quotes fragt man dann aber einfach nur noch nach Bedarf ab und zwar in einer eigenständigen Funktion/Klasse, in welcher man auch gleich den Fall der Deaktivierung/Nichtexistenz der Funktion behandelt. So bleibt der Code kompatibel mit alten und neuen PHP-Versionen und man fliegt nicht bei einem demnächst anstehenden Update sehenden Auges auf die Nase.

BTW: Magic-Quotes sind seit 5.3 deprecated und deprecated Funktionen nutzt man per se nicht, erst recht nicht in neuen Projekten.
 
Nun zumindest in der deutschen Beschreibung steht gar nix zu (http://php.net/manual/de/function.get-magic-quotes-gpc.php), in der von Dir englischen Variante der Hinweis ab 5.4. Erst mit weiterer Recherche trifft man auf http://php.net/manual/en/security.magicquotes.php

Naja - die Doku von PHP könnte in manchen Punkten besser sein. Man kann als normaler Entwickler, IMHO, nicht alles immer im Blick haben.

Nun über den Stil des Scriptes zu parlieren, ist sicherlich müßig, weil es offensichtlich eine Copy&Paste Snippet aus einem Tutorial oder sonstiger Anleitung ist, das vom TE angepasst wurde. ;)
 
Wenn du das Ergebnis des Query getestet hättest, wärst du wohl auf den Fehler gekommen.

So könnte das gemacht werden:
Code:
$result = mysql_query( $sql );
if (!$result) {
    die('Ungültige Anfrage: ' . mysql_error());
}
 
Back
Top