У меня обычно есть класс, расширяющий PDO, но мой класс довольно обыден. Если я его очищу и протестирую, я отправлю его позже. Однако это решение для вашей системы.
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);
Это может быть не идеально и может быть использовано для настройки. Он учитывает, что $dbh
настроен с помощью PDO Connection. В ожидании любых незначительных проблем синтаксиса, которые я сделал, это должно работать.
EDIT
На самом деле, я думаю, я поеду на ORM (или другой ORM). Когда вы настраиваете модель и добавляете туда всю валидацию, это так же просто, как:
$table = new Table();
$table->fromArray($_POST);
$table->save();
. Это должно легко заполнить содержимое. Это, конечно, с ORM, например, Doctrine.
ОБНОВЛЕНО
Сделал некоторые незначительные изменения в первом коде, например, вернул isset
назад и использовал rtrim
над substr
. Приступая к работе над предоставлением макета класса PDO Extension, нужно только макет, чтобы сделать это, и выполнить некоторые модульные тесты, чтобы убедиться, что он работает.
Эти ContextSwitchDeadlock
не обязательно означает, что Ваш код имеет проблему, просто что существует потенциал. Если Вы перейдете в Debug > Exceptions
в меню и расширитесь эти Managed Debugging Assistants
, то Вы найдете ContextSwitchDeadlock
, включен. При отключении этого VS больше не будет предупреждать Вас, когда объекты займут много времени для обработки. В некоторых случаях можно законно перенести продолжительную операцию. Также полезно, если Вы отлаживаете и остановились на строке, в то время как это обрабатывает - Вы не хотите, чтобы это жаловалось, прежде чем у Вас был шанс вырыть в проблему.
Это кажется на выполнение этого на основном потоке UI в приложении. Поток UI ответственен за нагнетание сообщений окон как прибытие, и все же потому что Ваш заблокирован в вызовах базы данных, которые это не может сделать так. Это может вызвать проблемы с сообщениями в масштабе всей системы.
необходимо посмотреть на порождение фонового потока для длительной операции и подъема некоторый, "я - занятое" диалоговое окно для пользователя, в то время как это происходит.
Если Вы не хотите отключать это исключение, все, что необходимо сделать, должен позволить приложению накачать некоторые сообщения, по крайней мере, один раз в 60 секунд. Это предотвратит это исключение для случая. Попытайтесь назвать Систему. Поточная обработка. Поток. CurrentThread. Соединение (10) время от времени. Существуют другие вызовы, которые можно сделать, которые позволяют сообщениям накачать.
Как Pedro сказал, у Вас есть проблема с отладчиком, предотвращающим насос сообщения, если Вы ступаете через код.
, Но если Вы выполняете длительную операцию на потоке UI, затем назовите Приложение. DoEvents (), который явно качает очередь сообщений и затем возвращает управление Вашему существующему методу.
Однако, если бы Вы делаете это, я рекомендовал бы при рассмотрении Вашего дизайна так, чтобы можно было выполнить обработку от потока UI так, чтобы UI остался хорошим и мгновенным.