silverman
Goto Top

Mehrere Formulardaten über ein Funktion in Mysql speichern

Hallo,
Ich bin ein newbie in php und habe folgende Frage:

Ich habe folgender Formular:
<form ..... >

<tr>
							<td><input type="text" size="20"  name="f_i_recipient_on" /></td>  
							<td><input type="text" size="40" name="f_i_subject_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_date_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_number_on" /></td>  
							<td><input type="text" size="20" name="f_i_sender_on" /></td>  
							<td><input type="text" size="20" name="f_i_attach_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_type_on" /></td>  
							<td><input type="text" size="20" name="f_i_number_on" /></td>  
						</tr>
						<tr>
							<td><input type="text" size="20" name="f_i_recipient_on" /></td>  
							<td><input type="text" size="40" name="f_i_subject_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_date_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_number_on" /></td>  
							<td><input type="text" size="20" name="f_i_sender_on" /></td>  
							<td><input type="text" size="20" name="f_i_attach_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_type_on" /></td>  
							<td><input type="text" size="20" name="f_i_number_on" /></td>  
						</tr>
						<tr>
							<td><input type="text" size="20" name="f_i_recipient_on" /></td>  
							<td><input type="text" size="40" name="f_i_subject_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_date_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_number_on" /></td>  
							<td><input type="text" size="20" name="f_i_sender_on" /></td>  
							<td><input type="text" size="20" name="f_i_attach_on" /></td>  
							<td><input type="text" size="20" name="f_i_l_type_on" /></td>  
							<td><input type="text" size="20" name="f_i_number_on" /></td>	  
						</tr>
<input type="reset"  value="abbrechen" class="btnw"/>  
<input type="submit" name="submit" class="btnw" value="OK" onClick="return confirmSubmit()"/>  
</form>
Ich will den anwnder die Möglichkeit geben, auf einmal ähnliche Informationen zu speichern

z.b.:
Name: Mark Gerudtsdatum:10101980
Name: Philip Gerudtsdatum:12031981
Name: Nadia Gerudtsdatum:12031979

Wenn ich auf OK klicke, soll mein Programm diese Daten in eine Tabelle in der mein Mysql Db speichrn.

Hofe, ihr habt meine Frage verstanden und könnt mir helfen.

sorry für meine Ausdrucksweise .. die deutsche Sprache ist nicht meine Muttersprache.

MfG

Content-Key: 141839

Url: https://administrator.de/contentid/141839

Printed on: April 25, 2024 at 20:04 o'clock

Member: SILVERMAN
SILVERMAN Apr 30, 2010 at 12:13:52 (UTC)
Goto Top
Zitat von @SILVERMAN:

Ich will den anwnder die Möglichkeit geben, auf einmal ähnliche Informationen zu speichern

z.b.:
Name: Mark Gerudtsdatum:10101980
Name: Philip Gerudtsdatum:12031981
Name: Nadia Gerudtsdatum:12031979

Wenn ich auf OK klicke, soll mein Programm diese Daten in eine Tabelle in der mein Mysql Db speichrn.

Member: maretz
maretz Apr 30, 2010 at 12:37:50 (UTC)
Goto Top
Moin,

das ist keine Frage.

a) Weisst du nicht wie du das Forumular richtig aufbauen sollst?
b) Hast du Probleme damit jedes Feld auszulesen?
c) Hast du Probleme damit die Werte in die DB zu bekommen?
...

Also - bitte stelle mal eine konkrete Frage -> dann kann man dir auch helfen! Ich weiss nämlich nicht wo das Problem nun sein soll -> ok, du klickst auf OK und das Programm soll eben speichern... Das ist ne Aussage - aber keine Frage!
Member: dog
dog Apr 30, 2010 at 13:00:42 (UTC)
Goto Top
sorry für meine Ausdrucksweise .. die deutsche Sprache ist nicht meine Muttersprache.

Und ich hätte jetzt so gerne eine Rechtschreib-Flamewar angefangen...

http://php.net/mysql_query
http://php.net/manual/de/reserved.variables.post.php
http://de.wikipedia.org/wiki/SQL-Injection#PHP
Member: nxclass
nxclass Apr 30, 2010 at 18:24:05 (UTC)
Goto Top
das ist eher ein HTML Problem
<input type="text" name="name" value="" />  
<input type="text" name="gebdatum" value="" />  
Beachte die [ ] !!! - damit funktionieren auch die multi-select Boxen.
jetzt bekommst Du ein multi-dim. Array über $_POST oder $_GET zurückgeliefert.

Es ist möglich mit einer Insert Anweisung mehrere Daten einzufügen.
INSERT INTO `tabelle` (`name`, `gebdatum`) VALUES
( ' ... ', ' ...' ),  
( ' ... ', ' ... ' );  
... bei PDO ist es auch möglich eine SQL Anweisung zu übergeben und diese mit jeweils anderen Parametern wiederholt auszuführen.
INSERT INTO `tabelle` ( `name`, `gebdatum` ) VALUES ( ?, ?);
Member: SILVERMAN
SILVERMAN Apr 30, 2010 at 23:40:30 (UTC)
Goto Top
Frage:
Wie soll mein Formular aufgebaut sein, damit ich die Daten mit einem Klick wiederholt bzw nach einander in der DB Tabelle speichern?
Wie kann ich die Daten von meinem Form über POST zu eine PHP Funktion übergeben, die die Daten in meine DB speichert?

Danke
Member: SILVERMAN
SILVERMAN Apr 30, 2010 at 23:50:20 (UTC)
Goto Top
Ursprung des Problems, damit alle verstehen, was ich brauche:

Sagen wir mla ich bekomme ein Dokument mit Name und Geburtsdatum und ich habe ein PHP Form implemeniert, das die Daten in meine DB speichert.
soweit alles gut.

Wenn ich aber 10 Dokumente bekomme, möchte gerne ein einziger Formular implementieren, über den ich die 10 einträge auf ein mal in der DB speichere.

wie mache ich so was?


1
<input type="text" name="name" value="" />   
<input type="text" name="gebdatum" value="" />  

2
<input type="text" name="name" value="" />   
<input type="text" name="gebdatum" value="" />  

Wie kann ich der multi-dim array der POST übergeben?

Also ein Beipiel wäre sehr hilfreich.

Vielen Dank
Member: nxclass
nxclass May 02, 2010 at 19:02:23 (UTC)
Goto Top
<form action="" method="post">  
Name: <input type="text" name="name" value="" /> - Geb.datum: <input type="text" name="gebdatum" value="" /><br />  
Name: <input type="text" name="name" value="" /> - Geb.datum: <input type="text" name="gebdatum" value="" /><br />  
Name: <input type="text" name="name" value="" /> - Geb.datum: <input type="text" name="gebdatum" value="" /><br />  
Name: <input type="text" name="name" value="" /> - Geb.datum: <input type="text" name="gebdatum" value="" /><br />  
<!-- usw -->
  <input type="submit" name="action" value="speichern" />  
</form>
... das macht das FORM von alleine. http://de.selfhtml.org/html/formulare/auswahl.htm#listen_mehrfach - letzter Satz

Du kannst auch einen Button 'weiterer Eintrag' in dein Formular einbauen und per JS eine weitere Zeile in den FORM einfügen.
  <input type="button" value="weiterer Eintrag" onclick="this.form.innerHTML = 'Name: <input type="text" name="name" value="" /> - Geb.datum: <input type="text" name="gebdatum" value="" /><br />'+ this.form.innerHTML;" />  
... könnte so aussehen.
Member: SILVERMAN
SILVERMAN May 02, 2010 at 23:38:19 (UTC)
Goto Top
Danke sehr für die schnelle Antwort aber wir übergebe ich mein php code diese FORM werte.
Also wie soll ich via POST oder GET die Werte von allen INPUTS in variablen speichern und diese dann über INSERT in meine DB einfügen.

Sorry wirklich für mein Unwissen aber ich bin noch am lernen.
Member: nxclass
nxclass May 03, 2010 at 07:21:37 (UTC)
Goto Top
wie übergebe ich mein php code diese FORM werte
Diese werden an das Script welches im FORM Attribut action eingetragen ist gesendet. Innerhalb des PHP Scripts stehen dann die Werte in der Variablen $_POST, $_GET oder auch $_REQUEST.
print_r( array($_POST, $_GET, $_REQUEST) );

wie soll ich via POST oder GET die Werte von allen INPUTS in variablen speichern.
Diese sind schon in den o.g. Variablen gespeichert.

... und diese dann über INSERT in meine DB einfügen
Ich empfehle Dir das PDO ( PHP Data Objects ), damit kann man recht einfach arbeiten. http://www.php.net/manual/de/book.pdo.php
$oDb = new PDO('mysql:host=localhost;dbname=datenbank', 'benutzer', 'passwort');  
$oDbStatement = $oDb->prepare( 'INPUT INTO `tabelle` (`name`, `gebdatum`) VALUES (?, ?)' );  
// ? sind s.g. 'question marks' - also Platzhalter - diese haben den Vorteil das Du dich nicht um die Umformung und Sicherheit der einzufügenden Daten kümmern musst. 

// jetzt kannst Du in einer Schleife die $_POST Werte durchlaufen und mit
$oDbStatement ->execute( array('Musterann', '2000-01-01') );  
// wiederholt speichern

// Verbindung abbauen
$oDB = null;

Das PHP Handbuch http://www.php.net/manual/de/ kann man sich auch als CHM Datei saugen - so findet man immer schnell was man braucht.
Member: SILVERMAN
SILVERMAN May 03, 2010 at 10:29:05 (UTC)
Goto Top
Danke sehr nxclass.
Ich versuche es zu implementieren.
Member: Guenni
Guenni May 05, 2010 at 18:27:56 (UTC)
Goto Top
@Silver,

Wenn ich aber 10 Dokumente bekomme, möchte gerne ein einziger Formular implementieren,

über den ich die 10 einträge auf ein mal in der DB speichere. wie mache ich so was?

Heißt, für mich, es können auch 3 oder 7 oder 9 Dokumente sein?


Dann würde ich im Script eine kleines Formular einbauen, in das ich die Anzahl eintragen kann:

<?php
/*
* Wenn die POST-Variable **wieviel** nicht existiert, wird ein Formular zur
* Eingabe einer Anzahl Einträge gezeigt. 
*/
if(!isset($_POST['wieviel'])){  
?>
<form action="<?echo $_SERVER[PHP_SELF];?>" method="post">  
Anzahl Einträge <input type="text" name="wieviel">  
<input type="submit" name="cmd" value="Senden">  
</form>
<?php
} else { //Formularaufbau
?>

!! Mit dem else-Zweig (Formularaufbau) gehts gleich weiter !!

Anstatt diese Art Formular . . .

<form action="" method="post">  

Name: <input type="text" name="name" value="" /> - Geb.datum: <input type="text" name="gebdatum" value="" /><br />  

Name: <input type="text" name="name" value="" /> - Geb.datum: <input type="text" name="gebdatum" value="" /><br />  


<!-- usw -->

  <input type="submit" name="action" value="speichern" />  

</form>

. . . zu verwenden, würde ich ein sagen wir mal abstraktes Array nur mit Indizies verwenden. Was heißt, es gibt keine

unterschiedlichen Arrays mit Vorname, Nachname, Geburtstag etc., sondern nur ein Array mit einem Namen,

in dem jede Person mit ihren eigenen Eigenschaften über Indizies verwaltet wird. Das Array im Formular sieht dann so aus:


arrayname[userindex][eigenschaftenindex], also . . .

arrayname = Vorname Person1
arrayname[1] = Nachname Person1
arrayname[2] = Geburtstag Person1

arrayname[1] = Vorname Person2
arrayname[1][1] = Nachname Person2
arrayname[1][2] = Geburtstag Person2

. . . usw.

Beliebig viele "Personenblöcke" können dann ganz einfach mit einer for-Schleife angelegt werden.

!! Weiter mit dem else-Zweig - Formularaufbau zur Eingabe !!

<?php
}else{
/*
* Wenn eine Zahl eingegeben wurde, wird das Formular aufgebaut.
*/
?>
<form action="<?echo $_SERVER[PHP_SELF];?>" method="post">  
<?php
/*
* Eine Variable von 0 < wieviel  hochzählen.
* Für jede Eigenschaft zu einer Person wird im Formular ein Textfeld
* ausgegeben, dessen Name textfeld ist.
* Im ersten Klammerpaar wird via PHP $i ausgegeben.
* Im zweiten Klammerpaar wird via PHP  $j ausgegeben und mit einem zweiten
* Befehl hochgezählt.
* Die Variable $j wird bei jedem Schleifenlauf immer
* wieder auf 0 gesetzt.
* Dadurch entsteht ein Array, das wie folgt aussieht:
* - textfelder
* - textfelder[1]
* - textfelder[2]
* - textfelder[1]
* - textfelder[1][1]
* - textfelder[1][2]
* - textfelder[2]
* - textfelder[2][1]
* - textfelder[2][2]
* . . . usw.
*/
for($i=0;$i<$_POST['wieviel'];$i++){  
echo "Eintrag Nr.: ".($i+1)."<br>";  
$j=0;
?>
Vorname <input type="text" name="textfelder[<?php echo $i;?>][<?php echo $j; $j++;?>]"><br>  
Nachname <input type="text" name="textfelder[<?php echo $i;?>][<?php echo $j; $j++;?>]"><br>  
Geburtstag <input type="text" name="textfelder[<?php echo $i;?>][<?php echo $j; $j++;?>]"><br>  
<?php
echo "---------------------------------------------------------------------------<br>";  
}
?>
<input type="submit" name="cmd" value="Eintragen">  
</form>
<?php }?>
</body>
</html>

!! Auswertung des Arrays nach Absenden. !!

<?php
/*
* Prüfen, ob die Textfelder gesendet wurden
*/
if(isset($_POST['textfelder'])){  
 /*
 * Wenn Textfelder gesendet wurden, das Post-Array
 * in einer Variablen ablegen . . . 
 * (Muß nicht sein, ist aber einfacher zu händeln :-) )
 */
 $textfelder=$_POST['textfelder'];  
 /*
 * . . . und in einer foreach-Schleife den Index und den
 * Wert in Variablen ablegen, wobei hier wiederum
 * Arrays entstehen, von denen aber nur das Werte-Array
 * weiterverarbeitet wird.
 */
 foreach($textfelder as $keys => $values){
  /*
	* In einer Variablen wird die linke Klammer gespeichert
	* und das erste Element aus dem Werte-Array.
	* ************* KnowHow *******************************************************
	* Warum wird die Variable in "'  '" eingeschlossen? 
	* Mit '  ' kann man Text ausgeben, aber keine Variablen: 
	* - echo 'Text' ergibt Text, echo '$var' ergibt $var. 
	* Mit "  " kann man Text UND Variablen ausgeben: 
	* - echo "Text" ergibt Text, echo "Vorname: $var" ergibt Vorname: Heinz(z.B.) 
	* Innerhalb "  " passiert also folgendes: 
	* - Die '  ' werden als Text interpretiert UND der Variableninhalt wird ausgegeben. 
	* - Somit ist $valuestr.="'$values'"; gleichbedeutend mit $valuestr.='Heinz'; 
	* Somit wird der MySQL-Syntax entsprochen:
	* insert into tabelle(feld1, feld2 . . . usw.) values('Heinz','Schmitz', . . . usw) 
	* ************* KnowHow Ende ***************************************************
	*/
  $valuestr.="(";  
	$valuestr.="'$values'";  
	$i=1;
	/*
	* Solange das Werte-Array einen Wert liefert, werden der
	* Variablen $valuestr nacheinander ein Komma und der nächste
	* Wert angehangen.
	*/
	while($value=$values[$i++]){
	 $valuestr.=","."'$value'";  
	}
	/*
	* Am Schluß werden die rechte Klammer und ein Komma angehangen.
	*/
	$valuestr.="),";  
 }
 /*
 * Das letzte Komma muß noch entfernt werden . . . 
 */
 $valuestr=substr($valuestr,0, -1);
 /*
 * . . . und die Variable kann nun an das Insert-Statement angehangen werden.
 */
 $query="insert into tabelle6(vorname,nachname,geburtstag) values ".$valuestr;  
 /*
 * Statement überprüfen . . . 
 */
 echo $query;
 /*
 * . . . und absenden.
 */
 //mysql_query($query);
}
?>


Gruß
Günni
Member: dog
dog May 05, 2010 at 20:20:49 (UTC)
Goto Top
<?echo $_SERVER[PHP_SELF];?>

1. Anfängerfehler: Nie Short Open Tags benutzen
2. Anfängerfehler: Nie PHP_SELF so benutzen wie du es gemacht hast. Stichwort: XSS

$query="insert into tabelle6(vorname,nachname,geburtstag) values ".$valuestr;

3. Anfängerfehler: Nie Werte vom Benutzer ohne Escaping/Kontrolle übergeben. Stichwort: SQL-Injection
Member: SILVERMAN
SILVERMAN May 05, 2010 at 21:48:25 (UTC)
Goto Top
Günni 1000 dank für die ausführliche Erklärung .. ich werde dein code probieren und mein feedback geben.
Member: SILVERMAN
SILVERMAN May 05, 2010 at 21:48:48 (UTC)
Goto Top
Danke für den Tip gegen SQL-injection.
Member: Guenni
Guenni May 08, 2010 at 12:05:09 (UTC)
Goto Top
Zitat von @dog:
> <?echo $_SERVER[PHP_SELF];?>

1. Anfängerfehler: Nie Short Open Tags benutzen
2. Anfängerfehler: Nie PHP_SELF so benutzen wie du es gemacht hast. Stichwort: XSS

> $query="insert into tabelle6(vorname,nachname,geburtstag) values ".$valuestr;

3. Anfängerfehler: Nie Werte vom Benutzer ohne Escaping/Kontrolle übergeben. Stichwort: SQL-Injection


Das ist ja schön und gut, aber Silverman wollte wissen, wie man 1 - n Personen in ein Formular packt und wie

dieses Formular serverseitig verarbeitet wird. Eine mögliche Lösung dazu habe ich geschrieben, die funktioniert

auch, und fertig. Was erwartest du denn ? Dass ich hier 'ne vollständige Softwarelösung präsentiere ?

Na, da setz' dich mal selber dran face-smile


Wenn weitere Fragen bezüglich der o.g. Themen seitens Silverman auftauchen, sehen wir mal weiter.

Ansonsten: Schönes, SQL-Injection-freies Wochenende.


Apropos SQL-Injection: Die ganzen Beispiele über SQL-Injection, zu denen hier immer wieder gern in Kommentaren verlinkt wird,

erscheinen mir etwas zu konstruiert. Hier haben wohl die Autoren selber in ihrer eigenen PHP/MySQL-Umgebung Tür und Tor

geöffnet, damit ihre Beispiele funktionieren.


Gruß
Günni
Member: dog
dog May 08, 2010 at 13:50:39 (UTC)
Goto Top
So, was ist denn bitte an:
mysql_query("SELECT * FROM user WHERE username = '".$_POST['user']."' AND password = '".$_POST['pass']."'");  
deiner Meinung nach konstruiert? face-smile
Den Code findet man in haufenweise Anfänger-Anwendungen, und sobald ich als Passwort
abc' OR 1=1
eingebe kann ich mir Admin-Zugriff erschleichen.

Das einzige was viele dieser Programmierfehler davon abhält auseinander zufliegen ist derzeit magic_quotes und das fliegt bald raus...

SQL-Injection und XSS gehören zu den Top 5 der am meisten ausgenutzten Sicherheitslücken in Webapps.
Member: SILVERMAN
SILVERMAN May 11, 2010 at 11:02:58 (UTC)
Goto Top
danke noch mal Günni
Es hat geklappt und es ist genau das, was ich brauche.