为了账号安全,请及时绑定邮箱和手机立即绑定

使用PDO插入/更新辅助函数

使用PDO插入/更新辅助函数

翻阅古今 2019-08-13 15:16:35
使用PDO插入/更新辅助函数我有一个非常简单的辅助函数来为传统的普通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); }像这样用过$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";它使代码非常干燥,同时也很灵活。我要问是否有人愿意分享类似的功能,利用PDO预备语句功能?我仍然怀疑,如何做到这一点。是否有一种直接而简单的方法来使用PDO预处理语句来插入数据?应该是什么形式?查询构建器助手?还是插入查询助手?它应该采取什么参数?我希望它可以很容易被用作SO的答案。因为在每个主题中我们都可以看到预备语句的使用建议,但是没有一个好的例子。真实的例子,我的意思是。键入bind_param()20次并不是一个好的编程风格我相信。甚至还有20个问号。
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我通常有一个扩展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连接设置。等待我做的任何小的语法问题,这应该工作。

编辑

真的,我想我会选择Doctrine ORM(或其他ORM)。在设置模型并在那里添加所有验证时,它就像下面这样简单:

$table = new Table();$table->fromArray($_POST);$table->save();

这应该很容易填充内容。这当然是与ORM,如Doctrine。

更新

做了一些小的调整,第一个代码,如把isset背部和使用rtrimsubstr。开始提供PDO扩展类的模拟只需要布局方式来完成它并进行一些单元测试以确保它有效。


查看完整回答
反对 回复 2019-08-13
?
慕斯王

TA贡献1864条经验 获得超2个赞

每个答案都有帮助,我希望我能分开赏金。

最后,令我惊讶的是,基于已接受的答案,我能够像以前一样制作它

$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);

它可以包装成辅助函数,但我怀疑是否有必要。它只会将代码缩短一行。

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); }


查看完整回答
反对 回复 2019-08-13
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我会扩展Core PDO Class和一个像这样的方法:

class Database extends PDO{
    public function QueryFromPost($Query,$items)
    {
        $params = array();
        $Query .= ' WHERE ';

        foreach($items as $key => $default)
        {
             $Query .= ' :' . $key. ' = ' . $key;
             if(isset($_POST[$key]))
             {
                  $params[':' . $key] = $_POST[$key];
             }else
             {
                 $params[':' . $key] = $default;
             }
        }
        $s = $this->prepare($Query);
        return $s->execute($params);
    }}

然后像这样使用

$db = new Database(/*..Default PDO Params*/);$statement = $db->QueryFromPost('SELECT * FROM employees',array('type' => 'plc'));foreach($preparedStatement->fetchAll() as $row){
    //...}

但是,正如已经说过的那样,你应该非常厌倦你想要做的事情,你需要验证你的数据,它已被消毒但你没有经过验证。


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 568 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信