PHP Formulardaten ändern

Floletni

Commander
Registriert
Sep. 2007
Beiträge
2.332
Ich versuche mich gerade an PHP. Dabei bin ich grad an einer Stelle angekommen an der ich nicht mehr richtig weiter weiß.

Ziel:
Ziel ist es mit einer Seite, die ausgelesene Daten einer Datenbank in Formular anzeigt, Daten zu ändern. Die Auswahl passiert durch radio-Buttons. Geändert wird auf Knopf druck. Vielleicht kommt am Ende noch eine Löschfunktion rein.

Problem:
Ich hab die Daten geändert, drücke ich nun auf "Ändern" lädt er die Seite neu. Nur leider nicht mit den geänderten Daten aus der Datenbank. Die Werte wurden auch nicht in die Datenbank übernommen. Ich sitze grad so vor dem Quelltext :confused_alt:


Code:
<?php
include 'connect.php';
$aendern = "UPDATE leute Set vorname = $vorname, familienname = $familienname, wohnort = $wohnort, straße = $straße WHERE id=$auswahl";
$aenderung = mysql_query ($aendern);
echo "
<table border=\"1\">
	<form action = 'auflistungaendern.php' method = 'post'>
	<tr>
		<th>Lfd Nummer</th>
		<th>Vorname</th>
		<th>Familienname</th>
		<th>Straße</th>
		<th>Wohnort</th>
		<th>Aktionen</th>
	<tr>
";
$abfrage = "SELECT * FROM leute";
$ergebnis = mysql_query ($abfrage);
while ($row = mysql_fetch_object($ergebnis))
	{
	echo "
	<tr>
		<td><input type=\"Text\" name=\"id\" value=\"" . $row->id . "\" readonly></td>
		<td><input type=\"Text\" name=\"vorname\" value=\" " . $row->vorname . "\"></td>
		<td><input type=\"Text\" name=\"familienname\" value=\" " . $row->familienname . "\"></td>
		<td><input type=\"Text\" name=\"wohnort\" value=\" " . $row->wohnort . "\"></td>
		<td><input type=\"Text\" name=\"straße\" value=\" " . $row->straße . "\"></td>
		<td><input type=\"radio\" name=\"auswahl\" " . $row->id . "\"></td>";
	}
echo "	</table>
	
	<input name=\"aendern\" type=\"submit\" value=\"Ändern\" onclick=\"" . $aendernung . "\"></button>
	<button name=\"loeschen\" type=\"button\" value=\"Löschen\" onclick=\"alert('')>Löschen</button>
	</form>
";
echo $aenderung;
include 'disconnect.php';
?>

Ich ich bekomme kein Lösungsansatz in mein Kopf. Habt ihr Ideen/Verbesserungsvorschläge?
 
Also... einfach/simple Möglichkeit

Wenn du auf "Ändern" klickts soll die selbe Seite geladen werden aber mit einem "Switch" bsp. ?update.
Mit isset und $_GET kannst du überprüfen ob der Schalter "gesetzt" ist, wenn ja die $_POST[] Daten abfragen, kontrollieren und in ein Update Statment packen und ausführen...

-> <form action = 'auflistungaendern.php?update' method = 'post'>

Edit:
Danach wird normal das Form angezeigt. Der "Update-Prozess" steht in einem entsprechend if (isset(...)), wird also nur ausgeführt wenn du die seite mit dem entsprechenden ?update aufrufst.

Probiers mal so, gibt sicherlich noch andere Möglichkeiten, so habe ich es aber meistens bei nicht öffntliche/einfachen seiten gemacht.
 
Zuletzt bearbeitet:
In deiner dritten Zeile verwendest du Variablen, die zu diesem Zeitpunkt leer (undefiniert) sind.

Wenn du, wie in deinem Fall, das Formular per Post versendest, bekommst du die Werte in den Formularfeldern über $_POST['feldname'] (bei Get entsprechend mit $_GET). Also $_POST['id'], $_POST['vorname'] usw.

Wenn du Benutzereingaben verarbeitest, solltest du diese aber validieren bzw. entsprechend behandeln, damit niemand ungewünschten Code o.ä. ausführen kann.

Siehe dazu bspw: http://php.net/manual/de/function.mysql-real-escape-string.php
Maskiert spezielle Zeichen im unescaped_string unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung, so dass das Ergebnis ohne Probleme in mysql_query() verwendet werden kann. Wenn Sie Binärdaten einfügen wollen, müssen Sie die Funktion auf jeden Fall verwenden.

mysql_real_escape_string() ruft die Funktion mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit einem Backslash ('\') versieht: \x00, \n, \r, \, ', " und \x1a.

Die Funktion muss immer (mit wenigen Ausnahmen) verwendet werden, um Daten abzusichern, bevor sie per Query an MySQL übermittelt werden.
Stichwort SQL-Injection:

http://de.wikipedia.org/wiki/SQL-Injection
http://www.php.net/manual/de/security.database.sql-injection.php
 
Zuletzt bearbeitet:
Hi,

ich würde dir empfehlen, als "Ziel" deines Formulares eine eigene Seite anzusteuern, auf der du dann die Funktionen ausführst.

So hast du eine Trennung zwischen Darstellung und Funktion. Also eine "Seite01.php" und eine dazugehörige "Seite01_Action.php". Funktioniert meiner Erfahrung nach am besten, der Seite übergibst du deine gewüschte Aktion ("Update", "Delete", etc) und die Daten, lässt da dein SQL-Skript laufen, gibst am Ende aus "Daten wurden geändert" und leitest wieder au die ursprüngliche Seite zurück.

VG,
Mad
 
Floletni schrieb:
Code:
$aendern = "UPDATE leute Set vorname = $vorname, familienname = $familienname, wohnort = $wohnort, straße = $straße WHERE id=$auswahl";
$aenderung = mysql_query ($aendern);
Ich erspare dir jetzt mal Kritik am Code, du bist ja erst dabei PHP neu zu lernen... ;-)

Falls du nicht register_globals explizit in der php.ini aktiviert hast kommst du so nicht an deine Formularwerte. (solltest du auch nicht aktivieren!!!) Da du dein Formular per POST Methode abschickst, musst du auf das $_POST Array zugreifen. Deine Variablen sind also folgendermaßen abrufbar:

Code:
$aendern = "UPDATE leute SET vorname = '" . mysql_real_escape_string($_POST['vorname']) . "', familienname = '" . mysql_real_escape_string($_POST['familienname']) . "', wohnort = '" . mysql_real_escape_string($_POST['wohnort']) . "', straße = '" . mysql_real_escape_string($strasse) . "' WHERE id = " . intval($_POST['auswahl']);


Ich empfehle dir dazu http://php-faq.de/ , da findest du auch Infos zum sicheren Umgang mit Formular Variablen etc., eine wirklich sehr gute Seite.

P.S.: PHP Variablen dürfen nur aus a-z A-Z 0-9 und _ bestehen, also kein ß! Das solltest du auch bei Datenbankfeldern und Tabellennamen beachten.
 
Ich hab ein wenig dran rumgefuscht. Das ist bei rausgekommen: Der Code wurde nen Stück besser geschrieben. Beim Drücken von "Ändern" wird jetzt eine if-Anweisung mit den zu ändernden Sachen ausgeführt.
Folgendes neues Problem ist dabei aufgetreten: Wegen der Schleife würde er bei einer aktualisierung immer nur den letzten Datensatz nehmen.

Ich habs probiert auf diesem Weg es zu lösen:
Code:
<html>
<?php
include 'connect.php';
echo "
<table border='1'>
	<form action = 'auflistungaendern.php' method = 'post'>
	<tr>
		<th>Lfd Nummer</th>
		<th>Vorname</th>
		<th>Familienname</th>
		<th>Wohnort</th>
		<th>Straße</th>
		<th>Aktionen</th>
	<tr>
";
$abfrage = "SELECT * FROM leute";
$ergebnis = mysql_query ($abfrage);
while ($row = mysql_fetch_object($ergebnis))
	{
	echo "
	<tr>
		<td><input type='Text' name='id' readonly value='".$row->id."'></td>
		<td><input type='Text' name='vorname_".$row->id."' value=' " . $row->vorname . "'></td>
		<td><input type='Text' name='familienname_".$row->id."' value=' " . $row->familienname . "'></td>
		<td><input type='Text' name='wohnort_".$row->id."' value=' " . $row->wohnort . "'></td>
		<td><input type='Text' name='strasse_".$row->id."' value=' " . $row->strasse . "'></td>
		<td><input type='radio' name='auswahl' value=' ".$row->id."'></td>";
	}
echo "	</table>
	
	<input type='submit' name='aendern' value='&Auml;ndern'>
	<button name='loeschen' type='button' value='L&ouml;schen' onclick='alert('')>Löschen</button>
	</form>
";
if (isset($_POST[aendern]))
	{
	
	$aendern = "UPDATE leute Set vorname = '" .mysql_real_escape_string($_POST['vorname_$auswahl']) ."', familienname = '" .mysql_real_escape_string($_POST['familienname_$auswahl']) ."', wohnort = '" .mysql_real_escape_string($_POST['wohnort_$auswahl']) ."', strasse = '".mysql_real_escape_string($_POST['strasse_$auswahl'])."' WHERE id=".intval($_POST['auswahl']);
	echo $aendern;
/*mysql_query ($aendern);*/
	}
include 'disconnect.php';
?>
</hmtl>

Laufen tut es immer noch nicht. Ist auch erstmal nen Denkansatz. Für weitere Verbesserungsvorschläge bin ich offen.
 
Überleg mal, was du da via $_POST bekommen möchtest. Jedenfalls nicht die Formularfelder (siehe mein Beitrag oben).


Auch macht ein einzelner Radiobutton wenig Sinn. Radiobuttons sind dazu da, sich zwischen mehreren Optionen zu entscheiden. Wenn es nur einen Button gibt, dann gibts nichts zu entscheiden. Wenn es nur eine Option gibt, die man an- oder abwählen kann, benutzt man Checkboxen.

 
Zuletzt bearbeitet:
vielleicht mal mit

print_r($_POST);

Die daten angucken. Wo kommt $auswahl her?

auch $_POST['blabla__$auswahl'] geht meines wissen nicht.
 
Hanni2k schrieb:
Die daten angucken. Wo kommt $auswahl her?

auch $_POST['blabla__$auswahl'] geht meines wissen nicht.

Hanni hat recht, es müsste so heissen:

$_POST['einfeld_' . $auswahl] --- ODER ---
$_POST["einfeld_$auswahl"] (achte auf die doppelten Anführungszeichen!)

dann wird $auswahl ersetzt und es kommt sowas wie $_POST['einfeld_3'] heraus.
 
@MrSnoot
Dadurch das es eine Schleife ist, die mehrere Datensätze ausgibt, hab ich mehr als ein Radiobutton.

@Hanni2k
$auswahl kommt vom radiobutton und soll die id als Nummer übernehmen.

@tassekaffee
Genau in die Richtung soll es laufen. Jeder Datensatz bekommt durch die id eine bestimmte Nummer. Also vorname_3. Bei der Aktualierung muss er dann die Nummer durch die Auswahl der Radiobox übernehmen.
 
Zuletzt bearbeitet:
Stimmt natürlich ;)

Beim Update musst du dir aber überlegen, was du da tust. Du versuchst auf eine Variable $auswahl zuzugreifen, die du vorher nicht definiert hast.
PHP:
mysql_real_escape_string($_POST['vorname_$auswahl'])

Speicher dir die vorher ab:
PHP:
$auswahl = $_POST['auswahl'];
Oder setz den Feldnamen gleich zusammen:
PHP:
$vorname = "vorname_" . $_POST['auswahl'];
$familienname = "familienname_" . $_POST['auswahl'];
$wohnort = "wohnort_" . $_POST['auswahl'];
$strasse = "strasse_" . $_POST['auswahl'];

Und verwende die Variablen dann weiter.
 
Es ist vollbracht. Folgender Code bringt ein Ergebnis: Sogar das richtige. :lol:


Code:
<?php
include 'connect.php';
echo "
<table border='1'>
	<form action = 'auflistungaendern.php' method = 'post'>
	<tr>
		<th>Lfd Nummer</th>
		<th>Vorname</th>
		<th>Familienname</th>
		<th>Wohnort</th>
		<th>Straße</th>
		<th>Aktionen</th>
	<tr>
";
$abfrage = "SELECT * FROM leute";
$ergebnis = mysql_query ($abfrage);
while ($row = mysql_fetch_object($ergebnis))
	{
	echo "
	<tr>
		<td><input type='Text' name='id' readonly value='".$row->id."'></td>
		<td><input type='Text' name='vorname_".$row->id."' value='".$row->vorname."'></td>
		<td><input type='Text' name='familienname_".$row->id."' value=' ".$row->familienname."'></td>
		<td><input type='Text' name='wohnort_".$row->id."' value='".$row->wohnort."'></td>
		<td><input type='Text' name='strasse_".$row->id."' value='".$row->strasse."'></td>
		<td><input type='radio' name='auswahl' value='".$row->id."'></td>";
	}
echo "	</table>
	
	<input type='submit' name='aendern' value='&Auml;ndern'>
	<button name='loeschen' type='button' value='L&ouml;schen' onclick='alert('')>Löschen</button>
	</form>
";
if (isset($_POST[aendern]))
	{
	$auswahl = $_POST['auswahl'];
	$vorname = "vorname_" . $_POST['auswahl'];
	$familienname = "familienname_" . $_POST['auswahl'];
	$wohnort = "wohnort_" . $_POST['auswahl'];
	$strasse = "strasse_" . $_POST['auswahl'];
	$aendern = "UPDATE leute Set vorname = '" .mysql_real_escape_string($_POST[$vorname]) ."', familienname = '" .mysql_real_escape_string($_POST[$familienname]) ."', wohnort = '" .mysql_real_escape_string($_POST[$wohnort]) ."', strasse = '".mysql_real_escape_string($_POST[$strasse])."' WHERE id=".intval($_POST['auswahl']);
	echo $aendern;
	mysql_query ($aendern);
	}
include 'disconnect.php';
?>

Ans löschen muss ich mich jetzt noch machen. Zur Kontrolle hab ich noch nen echo mit dem Änderungsbefehl gelassen.
 
Zuletzt bearbeitet:
Zurück
Oben