Zwykle mam klasę rozszerzającą PDO, ale moja klasa jest dość niestandardowa. Jeśli to wyczyszczę i przetestuję, wyślę to później. Oto rozwiązanie dla twojego systemu.
function dbSet($fields, &$values) {
$set = '';
$values = array();
foreach ($fields as $field) {
if (isset($_POST[$field])) {
$set .= "`$field` = ?,";
$values[] = $_POST[$field];
}
}
return rtrim($set, ',');
}
$fields = explode(" ","name surname lastname address zip fax phone date");
$_POST['date'] = $_POST['y']."-".$_POST['m']."-"$_POST['d'];
$query = "UPDATE $table SET ".dbSet($fields, $values).", stamp=NOW() WHERE id=?";
$values[] = $id;
$dbh->prepare($query);
$dbh->execute($values);
To może nie być idealne i może wymagać ulepszenia. Bierze pod uwagę, że $dbh
jest skonfigurowany z połączeniem PDO. W oczekiwaniu na wszelkie drobne problemy ze składnią, które zrobiłem, powinny działać.
EDYTUJ
Naprawdę jednak myślę, że wybrałbym Doctrine ORM (albo inny ORM). Gdy konfigurujesz model i dodajesz tam całą walidację, jest to tak proste, jak:
$table = new Table();
$table->fromArray($_POST);
$table->save();
To powinno łatwo wypełnić zawartość. Dzieje się tak oczywiście z ORM, takim jak Doctrine.
ZAKTUALIZOWANE
Wprowadzono kilka drobnych poprawek w pierwszym kodzie, takich jak umieszczenie isset
z powrotem i używając rtrim
ponad substr
. Zamierzam pracować nad dostarczeniem makiety klasy PDO Extension, po prostu trzeba ułożyć odpowiedni układ i wykonać kilka testów jednostkowych, aby upewnić się, że działa.