Mittels Array eine SQL- Insert zusammenbauen

atlantyz

Erfahrenes Mitglied
Hallo Leute,

ich hänge gerade an einem Problem und komme nicht weiter. Ich habe ein Formular mit lauter Checkboxen und einer handvoll Textboxen dazwischen.

Nun möchte ich gerne, wenn die Checkbox aktiviert ist eine 1 in die Datenbank eintragen (in das entsprechende Feld). Da ich nicht wirklich 30 Checkboxen auf ihre Existenz prüfen will, hab ich mir gedacht, dass ich den SQL- insert evtl. auch automatisch erstellen lassen kann.

Mit array_keys($POST) habe ich schonmal den Namen der Checkboxen ausgelesen und den Wert dazu (der ja "on" ist, wenn die Checkbox existiert).

Da die Felder in der Datenbank den gleichen namen haben wie die Checkboxen sollte ich nun doch daraus den SQL- Insert basteln können, oder? Ich weiß nur nicht wie...

Bisher habe ich folgendes:

PHP:
$i = 0;
foreach($_POST as $variable) {
	$name = array_keys($_POST);
	echo "Name: ".$name[$i].", Wert: ".$variable."<p>";
	
	$i=$i+1;
}

zur Ermittlung des Namens und des Wertes. Da kommt z.B. folgendes raus:
PHP:
Name: pat_id, Wert:

Name: pat_name, Wert:

Name: pat_vorname, Wert:

Name: geburtsdatum, Wert:

Name: timestamp, Wert: 1304931787

Name: datum, Wert: 09.05.2011

Name: uhrzeit, Wert: 11:03

Name: naw, Wert: on

Name: rtw, Wert: on

Name: zu_fuss, Wert: on

Name: konsil, Wert: on

Nun möchte ich daraus einen Insert machen, aber ich weiß nicht, wie ich das ganze so flexibel gestalte, dass es keine Fehlermeldung gibt, wenn es ein Feld nicht gibt und er mir das dann auch nicht in die falschen Felder schreibt.

Ich hoffe ihr versteht, was ich meine.
 
Da je nach Feldtype der Insert-Teil für den Value anderst aussehen kann, solltest du mindestens die Feldtypen der Felder definieren.

Ich hab mal ein kleines Testbeispiel geschrieben
PHP:
<?php
//Test
$_POST = array(
    'feld_1' => NULL, 
    'feld_2' => 1, 
    'feld_3' => 'test',
    'feld_4' => 1304931787
);

//Feldtypen definieren
define('C_FIELD_TYPE_STRING', 1);
define('C_FIELD_TYPE_TIMESTAMP', 2);
define('C_FIELD_TYPE_NUMBER', 4);
define('C_FIELD_NOT_NULLABLE', 8);

//Felder definieren
$fieldTypes = array(
    'feld_1' => C_FIELD_TYPE_STRING,
    'feld_2' => C_FIELD_TYPE_NUMBER + C_FIELD_NOT_NULLABLE,
    'feld_3' => C_FIELD_TYPE_STRING,
    'feld_4' => C_FIELD_TYPE_TIMESTAMP
);

//Array mit den formatierten Werten erstellen
foreach($_POST as $fieldName => $value){
    $fieldType = $fieldTypes[$fieldName];
    //NULL-Check
    if(is_null($value)){
        //Prüfen ob NULL im Feld erlaubt ist
        if(($fieldType & C_FIELD_NOT_NULLABLE) and is_null($value)){
            throw new Exception("Feld {$fieldName} darf nicht leer sein");
        }       
    }else{
        //Felder anhand des Feldtypes formatieren
        if($fieldType & C_FIELD_TYPE_STRING)        $values[$fieldName] = "'$value'"; 
        elseif($fieldType & C_FIELD_TYPE_TIMESTAMP) $values[$fieldName] = "FROM_UNIXTIME($value)";
        elseif($fieldType & C_FIELD_TYPE_NUMBER)    $values[$fieldName] = "$value";
    }
}
$sql = 'INSERT INTO mytable ('.implode(',', array_keys($values)).') VALUES ('.implode(',', $values).');';
echo $sql;
?>
 
Zurück