我有一个非常简单的辅助函数来为传统的普通mysql驱动程序用法生成SET语句:
function dbSet($fields) {
$set='';
foreach ($fields as $field) {
if (isset($_POST[$field])) {
$set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
}
}
return substr($set, 0, -2);
}
Run Code Online (Sandbox Code Playgroud)
像这样用过
$id = intval($_POST['id']);
$fields = explode(" ","name surname lastname address zip fax phone");
$_POST['date'] = $_POST['y']."-".$_POST['m']."-".$_POST['d'];
$query = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id";
Run Code Online (Sandbox Code Playgroud)
它使代码非常干燥,同时也很灵活.
我要问是否有人愿意分享类似的功能,利用PDO预备语句功能?
我仍然怀疑,如何做到这一点.
是否有一种直接而简单的方法来使用PDO预处理语句来插入数据?应该是什么形式?查询构建器助手?还是插入查询助手?它应该采取什么参数?
我希望它可以很容易被用作SO的答案.因为在每个主题中我们都可以看到预备语句的使用建议,但是没有一个好的例子.真实的例子,我的意思是.键入bind_param()20次并不是一个好的编程风格我相信.甚至还有20个问号.
Jim*_* W. 10
我通常有一个扩展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);
Run Code Online (Sandbox Code Playgroud)
这可能不完美,可以使用调整.它考虑了$dbh使用PDO连接设置.等待我做的任何小的语法问题,这应该工作.
编辑
真的,我想我会选择Doctrine ORM(或其他ORM).在设置模型并在那里添加所有验证时,它就像下面这样简单:
$table = new Table();
$table->fromArray($_POST);
$table->save();
Run Code Online (Sandbox Code Playgroud)
这应该很容易填充内容.这当然是与ORM,如Doctrine.
更新
做了一些小的调整,第一个代码,如把isset背部和使用rtrim过substr.开始提供PDO扩展类的模拟只需要布局方式来完成它并进行一些单元测试以确保它有效.
谢谢大家.
每个答案都有帮助,我希望我能分开赏金.
最后,令我惊讶的是,基于已接受的答案,我能够像以前一样制作它
$fields = array("login","password");
$_POST['password'] = MD5($_POST['login'].$_POST['password']);
$stmt = $dbh->prepare("UPDATE users SET ".pdoSet($fields,$values)." WHERE id = :id");
$values["id"] = $_POST['id'];
$stmt->execute($values);
Run Code Online (Sandbox Code Playgroud)
它可以包装成辅助函数,但我怀疑是否有必要.它只会将代码缩短一行.
pdoSet代码:
function pdoSet($fields, &$values, $source = array()) {
$set = '';
$values = array();
if (!$source) $source = &$_POST;
foreach ($fields as $field) {
if (isset($source[$field])) {
$set.="`$field`=:$field, ";
$values[$field] = $source[$field];
}
}
return substr($set, 0, -2);
}
Run Code Online (Sandbox Code Playgroud)