【问题标题】:How to pass an array of rows to PDO to insert them?如何将行数组传递给 PDO 以插入它们?
【发布时间】:2011-06-03 01:05:47
【问题描述】:

我想使用 PDO 准备好的语句,但我发现输入非常耗时。如果有一个函数可以传递以下关联数组,那将非常有用:

array(
"title"=>$title
"userid"=>$userid
"post"=>$body
)

请记住,数组中的键始终与 SQL 表中的行匹配。回顾所有内容,这应该会减少键入 :foo 并在执行函数中再次键入它们的工作。

我说的是 INSERT 查询。

怎么做?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:
    function pdo_insert($table, $arr=array())
    {
      if (!is_array($arr) || !count($arr)) return false;
    
      // your pdo connection
      $dbh  = '...';
      $bind = ':'.implode(',:', array_keys($arr));
      $sql  = 'insert into '.$table.'('.implode(',', array_keys($arr)).') '.
              'values ('.$bind.')';
      $stmt = $dbh->prepare($sql);
      $stmt->execute(array_combine(explode(',',$bind), array_values($arr)));
    
       if ($stmt->rowCount() > 0)
       {
          return true;
       }
    
    return false;
    }
    
    pdo_insert($table, array('title'=>$title, 'userid'=>$user_id, 'post'=>$body));
    

    【讨论】:

      【解决方案2】:

      略微改进的 PDO 插入功能,同时通过防止 SQL 注入攻击来考虑安全性:

      // Insert an array with key-value pairs into a specified database table (MySQL).
      function pdo_insert($dbh,$table,$keyvals) {
          $sql = sprintf("INSERT INTO %s ( `%s` ) %sVALUES ( :%s );",
              $table,
              implode("`, `", array_keys($keyvals)), 
              PHP_EOL, 
              implode(", :", array_keys($keyvals))
          );
          $stmt = $dbh->prepare($sql);
          foreach ($keyvals as $field => $value) {
              $stmt->bindValue(":$field", $value, PDO::PARAM_STR);
          }
          $stmt->execute();
          return $dbh->lastInsertId();
      }
      
      // Convert special characters to HTML safe entities.
      function h($str) {
          return trim(stripslashes(htmlspecialchars($str, ENT_QUOTES, 'utf-8')));
      }
      

      例子:

      $dbh = new PDO($dsn);
      $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
      $keyvals = [                
          'id' => isset($_POST['id']) ? h( $_POST['id'] ) : null, 
          'title' => isset($_POST['title']) ? h( $_POST['title'] ) : null,    
          'description' => isset($_POST['description']) ? h( $_POST['description'] ) : null,
          'created_at' => time(),
          'created_by' => 1,
      ];
      $last_ids[] = pdo_insert($dbh,'products',$keyvals);
      

      【讨论】:

        猜你喜欢
        • 2013-06-17
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 2021-11-30
        • 2013-07-11
        相关资源
        最近更新 更多