SQL PHP: Daten in mySQL speichern. Merkwürdiger Fehler..

Rockhound

Lt. Commander
Registriert
Jan. 2003
Beiträge
1.597
[edit]
Hat sich erledigt. Entschuldigt bitte.

Hallo,
das Script:
PHP:
// Datenbankverbindung
	include("dbcon.php");

// Kundenupdate
	$editmember		= $_POST['editmember'];
	if ($editmember == "true") {
	$m_id 			= $_POST['idmember'];
	$m_vorname		= $_POST['vorname'];
	$m_nachname		= $_POST['nachname'];
	$m_geschlecht		= $_POST['geschlecht'];
	$m_zusatz		= $_POST['zusatz'];
	$m_strasse 		= $_POST['strasse'];
	$m_plz	 		= $_POST['plz'];
	$m_stadt 		= $_POST['stadt'];
	$m_land 		= $_POST['land'];
	$m_telefon 		= $_POST['telefon'];
	$m_telefon2 		= $_POST['telefon2'];
	$m_email 		= $_POST['email'];
	$m_geburtstag		= $_POST['geburtstag'];
	$m_mitglied		= $_POST['mitglied'];
	$m_vertrag 		= $_POST['vertrag'];
	$m_schule		= $_POST['schule'];

// Eintrag in Datenbank
	$sqlab =  "update mitglieder ";
	$sqlab .= "set vorname	 = '$m_vorname', ";
	$sqlab .= "nachname	 = '$m_nachname', ";
	$sqlab .= "geschlecht	 = '$m_geschlecht', ";
	$sqlab .= "zusatz	 = '$m_zusatz', ";
	$sqlab .= "strasse 	 = '$m_strasse', ";
	$sqlab .= "plz	 	 = '$m_plz', ";
	$sqlab .= "stadt	 	 = '$m_stadt', ";
	$sqlab .= "land	 	 = '$m_land', ";
	$sqlab .= "telefon 	 = '$m_telefon', ";
	$sqlab .= "telefon2	 = '$m_telefon2', ";
	$sqlab .= "email	         = '$m_email', ";
	$sqlab .= "geburtstag    = '$m_geburtstag', ";
	$sqlab .= "mitglied 	 = '$m_mitglied', ";
	$sqlab .= "schule 	 = '$m_schule', ";
	$sqlab .= "vertrag 	 = '$m_vertrag' ";
	$sqlab .= " where id	 = $m_id";
	
	echo $sqlab;
	
	$statement = $dbpdo->prepare($sqlab);
	$statement->execute();
	}

Ausgabe SQLAB:
Code:
update mitglieder set vorname	= 'Max', nachname	= 'Mustermann', geschlecht	= '1', zusatz	= '', strasse = 'Musterstrasse 1', plz	= '12345', stadt	= 'Musterstadt', land	= '1', telefon = '0123456789', telefon2	= '78945612', email	= 'max@email.de', geburtstag	= '1981-05-12', mitglied = '2015-12-14', schule = '1', vertrag = '2' where id	= 10

Entsprechender Auszug aus dem HTML Formular um den es geht:
HTML:
<label for="vertrag" class="control-label">Vertrag</label>
<select class="form-control" id="vertrag" name="vertrag">
	<option value="1">Vertrag 1</option>
	<option value="2">Vertrag 2</option>
</select>

Das ganze HTML Formular spar ich mal. Da ist auch nicht das Problem.

Sondern:
Nach dem das HTML Formular ausgefüllt wurde, wird die PHP Datei aufgerufen. Alle Daten werden geändert in der mySQL Datenbank bis auf das Feld "Vertrag" wenn ich im HTML Formular "Vertrag 2" auswähle. Wie es in der SQLAB-Ausgabe der Fall ist. Mache ich dann einen Reload der PHP-Seite (Browser fragt ob er die Daten nochmal senden soll) klappt es auf einmal.
Noch kurioser ist es aber: Ist der "Vertrag 2" schon ausgewählt und ich wähle im HTML-Formular den "Vertrag 1" und sende es an das PHP-Skript, klappt es gleich beim ersten mal.

Ich hoffe Ihr habt das Problem verstanden.
Ich hatte solch einen Fehler bisher noch nie und hoffe ihr habt eine Idee.

Vielen Dank.

PS: Kopiere ich die SQLAB-Ausgabe ins phpMyAdmin und führe diese aus, klappt es gleich beim ersten mal. Egal ob Vertrag 1 oder 2. :freak:


[edit]
okidoki. Man muss es wohl erst aufschreiben damit man weiter nach den Dingen sucht die noch falsch sein könnten.
ich hatte ein zweites Formular versteckt in der HTML-Seite das auch ein select-Feld "Vertrag" hatte. Ich dachte ja das er daraus keine Informationen weiterschicken würde ans PHP-Skript weil es ja in einem seperatem [form]-Tag steckte mit einem anderen 'name' & 'id'. Aber dem war dann doch nicht so.
Entschuldigt bitte fürs Grübeln. Man kann das Thema hier auch gerne wieder löschen.
 
Zuletzt bearbeitet:
Ok, auch wenn das eigentlich problem gelöst ist solltest du dir wenn ich mir deinen Code so anschaue dringen Gedanken um das Thema "SQL Injection" machen. In dem Zusammenhang am besten auch mal nach "prepared Statements" schauen (wie man sie richtig benutzt).

Das was ich da jedenfalls aktuell an Code sehe ist hochgradig gefährlich...
 
Jepp, an sich benutzt du ja schon ein prepared Statement, setzt den String aber immer noch komplett als Text zusammen. Den großen Vorteil des Parameter Binding nutzt du dagegen (noch) nicht. Aber auf dem Weg umgehst du viele Probleme hinsichtlich SQL-Injection (da die Datenbankschnittstelle die Werte automatisch als Wert und nicht als Teil des Statement interpretiert)
 
So richtig?
PHP:
<?php
// Datenbankverbindung
	include("dbcon.php");

// Kundenupdate
	$editmember	= $_POST['editmember'];
	if ($editmember == "true") {

// Eintrag in Datenbank
	$sqlab =  "update mitglieder ";
	$sqlab .= "set vorname	 	= :vorname, ";
	$sqlab .= "nachname	 	= :nachname, ";
	$sqlab .= "geschlecht		= :geschlecht, ";
	$sqlab .= "zusatz		= :zusatz, ";
	$sqlab .= "strasse 		= :strasse, ";
	$sqlab .= "plz	 		= :plz, ";
	$sqlab .= "stadt	 		= :stadt, ";
	$sqlab .= "land	 		= :land, ";
	$sqlab .= "telefon 		= :telefon, ";
	$sqlab .= "telefon2		= :telefon2, ";
	$sqlab .= "email	 		= :email, ";
	$sqlab .= "geburtstag		= :geburtstag, ";
	$sqlab .= "mitglied 		= :mitglied, ";
	$sqlab .= "schule 		= :schule, ";
	$sqlab .= "vertrag 		= :vertrag ";
	$sqlab .= " where id	 	= :id";
	
	$statement = $dbpdo->prepare($sqlab);
	
	$statement->bindParam(':vorname', $_POST['vorname']);
	$statement->bindParam(':nachname', $_POST['nachname']);
	$statement->bindParam(':geschlecht', $_POST['geschlecht']);
	$statement->bindParam(':zusatz', $_POST['zusatz']);
	$statement->bindParam(':strasse', $_POST['strasse']);
	$statement->bindParam(':plz', $_POST['plz']);
	$statement->bindParam(':stadt', $_POST['stadt']);
	$statement->bindParam(':land', $_POST['land']);
	$statement->bindParam(':telefon', $_POST['telefon']);
	$statement->bindParam(':telefon2', $_POST['telefon2']);
	$statement->bindParam(':email', $_POST['email']);
	$statement->bindParam(':geburtstag', $_POST['geburtstag']);
	$statement->bindParam(':mitglied', $_POST['mitglied']);
	$statement->bindParam(':schule', $_POST['schule']);
	$statement->bindParam(':vertrag', $_POST['vertrag']);
	$statement->bindParam(':id', $_POST['idmember']);
	
	$statement->execute();
	} 
?>

Es funktioniert zumindestens :)
 
Zurück
Oben