Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Formulardaten -> array -> MySQL DB





Frage

Hi, ich habe ein HTML-Formular erstellt mit vorname, name, ort ect.. Bsp.: <input name='Adresse[ort]' type='text' maxlength='30' size='30' value='' > Das Formular wird dynamisch per schleife und echo erstellt, dewegen nur die einfachen ' . Wenn Das Formular augefüllt ist sollen die Daten in Array Adresse stehen. Nun möchte ich die Daten in die DB schreiben: $db = mysql_connect("", "", ""); $sqlab='insert into tbl_technik ('.array_keys($_POST[adresse).') values ('.implode("','",$_POST[adresse).')'; mysql_db_query("***", "$sqlab"); $num = mysql_affected_rows(); if ($num>0) echo "Der Datensatz wurde erfolgreich in die Datenbank eingetragen<p>"; else echo "Es ist ein Fehler aufgetreten: <br> ".mysql_error()."; <p><br>"; mysql_close($db); Fehlermeldung: Parse error: syntax error, unexpected ')', expecting ']' in C:\xampp\htdocs\new\adresse_db.php on line 13 Wo liegt der Fehler? Bin für jede Hilfe dankbar...

Antwort 1 von Misantrophe

Hallo,

sorry das war die falsche Fehlermeldung.

Nun die richtige:

Es ist ein Fehler aufgetreten:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '','Ja','','1)' at line 1;

Antwort 2 von son_quatsch

 $sqlab='insert into tbl_technik ('.array_keys($_POST[adresse).') values ('.implode("','",$_POST[adresse).')';[/code]

...muss mindestens zu dem hier werden:

 $sqlab= 'insert into tbl_technik ('. array_keys( $_POST['adresse'] ). ') values (\''. implode('\', \'', $_POST['adresse']. '\')';


Antwort 3 von son_quatsch

(nochmal, diesmal nur das richtige - und übersichtlicher):
 
$sqlab= 'insert into tbl_technik ('
      . array_keys( $_POST['adresse'] )
      . ') values (\''
      . implode('\', \'', $_POST['adresse'])
      . '\')';


Antwort 4 von Misantrophe

Danke son_quatsch

Die nun folgende Fehlermeldung:

Column count doesn't match value count at row 1;

Was hat die zu bedeuten?

Antwort 5 von gast08154

Hallo Misantrophe,

überprüfe mal ob die Anzahl der eingegebenen Werte mit der Anzahl der Spalten in deiner DB überein stimmen.

Antwort 6 von son_quatsch

...weil du als Spaltennamen ein Feld übergibst, statt dessen Elemente.
Lösung:

$sqlab= 'insert into tbl_technik ('
      . implode(', ', array_keys( $_POST['adresse'] ) )
      . ') values (\''
      . implode('\', \'', $_POST['adresse'])
      . '\')';


Zur Sicherheit kannst du danach ja mal folgende Zeile einfügen:
die( $sqlab );

und überprüfen, ob das SQL-Kommando syntaktisch korrekt ist.


Und danach machst du dir am besten gedanken, was passiert, wenn ein Element der POST-Daten folgende Inhalte annehmen könnte:
  1. McDonald's
  2. ; DROP DATABASE; ##


Antwort 7 von Misantrophe

danke son_quatsch,

so langsam komme ich voran. Allerdings eine Frage habe ich noch:

Beim INSERT - Befehl müssen doch genau die Feldnamen aus der DB angegeben werden. Wie mache ich das hier? Denn es wird nichts in die DB geschrieben.



Zitat:
und überprüfen, ob das SQL-Kommando syntaktisch korrekt ist.


Und danach machst du dir am besten gedanken, was passiert, wenn ein Element der POST-Daten folgende Inhalte annehmen könnte:

McDonald's

; DROP DATABASE; ##


Ist zweifels ohne ein ganz wichtiger Punkt den du da ansprichst, aber darum kümmere ich mich das Skript das macht was es soll

Antwort 8 von son_quatsch

Dann überprüfe mal, ob

print_r( array_keys( $_POST['adresse'] );


all die Spaltennamen auflistet, die auch in das INSERT-Statement wandern sollen. Andernfalls schreibst du sie am besten von Hand rein.

Antwort 9 von Misantrophe

Hallo son_quatsch

danke für Deine Hilfe es klappt soweit. Jetzt giubt es nur noch ein Problem, und zwar :

Das Array technik[ ] fasst die keys + einem Wert pro key und schreibt diesen in DB. Aber da ich ja nun mehere Zeilen gleichzeitig in die DB schreiben will muss ich noch was ändern.

Meine Idee:

Formular:
Das Array Technik welches ja die Daten (1 Zeile) enthält, muss so geändert werden, dass das Adresse wieder ein Array ist.
z.B.
<input name='Adresse[ort[]]' type='text' maxlength='30' size='30' value='' >

und der SQL-Skript:

bisher: $sqlab= 'insert into tbl_technik ('
. implode(', ', array_keys( $_POST['technik'] ) )
. ') values (\''
. implode('\', \'', $_POST['technik'])
. '\')';

jetzt:

$sqlab='insert into tbl_technik ('
.implode(',', array_keys($_POST['technik']))
.') values (\''
.implode('\',\",(\''
. implode('\', \'', $_POST['technik'])
. '\')';

Aber es klappt nicht so wie ich gedacht habe, was mache ich flalsch?

Antwort 10 von son_quatsch

Da überschlägst du dich etwas. Wenn du in deinem Web-Formular mal auf den Senden-Button klickst, dann werden alle POST-Daten entsprechend den Namen aller INPUTs aufbereitet und versandt. Eben diese Daten bekommt auch dein PHP-Skript und kann sie auswerten. Verschachtelte Felder gehören bestimmt nicht zum Standard - im Zweifelsfall würde ich gänzlich auf Feldnamen in INPUTs verzichten.

Daher folgender Ratschlag: schreib in dein PHP-Skript einfach mal

print_r( $_POST );


Füll also dein Web-Formular aus, klick auf Senden, und die Ergebnisseite guckst du dir nicht im Browser an - sondern dessen Quelltext. Dann siehst du in einer schönen Feldhierarchie, wie deine Daten übergeben wurden. Anhand dieser kannst du dann auch prüfen, ob überhaupt und in welcher Struktur sie ankommen, bevor du sie übereilig mit der IMPLODE-Funktion wieder zu einem String zusammenfasst.

Immer schön der Reihe nache :-)

Antwort 11 von Misantrophe

Zitat:
Immer schön der Reihe nache :-)


stimmt

Antwort 12 von Misantrophe

Array ( [technik] => Array (

[id_1] => Array ( [0] => 14 [1] => 15 [2] => 16 )

[id_2] => Array ( [0] => [1] => [2] => ) [v3] => Array ( [0] => GMA55 [1] => GMA66 [2] => GMA77 )

[v4] => Array ( [0] => Nein [1] => Ja [2] => Nein )

[v5] => Array ( [0] => 23 [1] => 0.86 [2] => 0.20 )

[v6] => Array ( [0] => 1 [1] => 2 [2] => 2 )

[v7] => Array ( [0] => test [1] => test [2] => test ) )
quote

Ausgabe print_r($_POST);

solangsam bekomme ich nen knoten in den Kopf ;)

Antwort 13 von son_quatsch

Öhm, wenn dir die Ausgabe gar nicht hilft, dann wird es schwierig.

Wenn du das ganze jetzt in eine Tabelle der Datenbank speichern wollen würdest, müsste es (sinngemäß) so aussehen:

$spalten= '';
foreach ( $_POST['technik'] as $key=> $val ) {
  $spalten= $key. ', ';
}
$spalten= substr( $spalten, 0, -2 );

$anzahl= count( $_POST['technik']['id_1'] );
for ( $i= 0; $i< $anzahl; $i++ ) {
  $teil= '';
  foreach ( $_POST['technik'] as $key=> $val ) {
    $teil.= '\''. $val[$i]. '\', ';
  }
  $teil= substr( $teil, 0, -2 );

  $sql= 'INSERT INTO TABELLE('. $spalten. ') VALUES ('. $teil. ')';
  ...in tabelle einfügen...
}


Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: