【问题标题】:Smart way to insert in php插入php的聪明方法
【发布时间】:2013-11-21 13:23:39
【问题描述】:

我正在使用 codeigniter,并且我有一个包含很多列的大表,我想在其中插入大量数据。有没有比写每列的名称更好的方法,然后将插入每列的值。例如,一个 php 函数,它获取表列并将它们放入一个数组中,并有另一个数组具有指向每一列的值...

codeigniter 示例:

$data = array('column_name1'=>'value1', 'column_name2' =>'value2'....);
$this->db->insert('table_name', $data);

普通的php

mysql_query("INSERT INTO table_name (column_name1, column_name2) VALUES ("Value1"....)");

【问题讨论】:

  • 你说的是多少列?只输入它们可能比输入这个问题更容易。
  • 多个表至少在 30 到 40 列之间
  • mysql_query 已弃用。

标签: php mysql sql codeigniter


【解决方案1】:

使用您的数据示例:

$data = array('column_name1'=>'value1', 'column_name2' =>'value2'....);
$this->db->insert('table_name', $data);

您可以像这样构建您的查询:

private function buildInsertSql($data, $table) {
    $columns = "";  
    $holders = "";  
    foreach ($data as $column => $value) {  
       $columns .= ($columns == "") ? "" : ", ";  
       $columns .= $column;  
       $holders .= ($holders == "") ? "" : ", ";  
       $holders .= ":$column";  
    }  
    $sql = "INSERT INTO $table ($columns) VALUES ($holders)";  
    return $sql; 
}

您应该使用 PDO 运行它,因为 mysql_query 已被弃用。 您可以阅读 PDO 如何将值绑定到“持有者”等。 另外,不要忘记其他形式的清理,例如将列名列入白名单等。

【讨论】:

    【解决方案2】:

    在模型构造函数中,我将实例化一个属性,并将我的列名存储在那里。我将多次重用该数组,这就是它在构造函数中的原因

    $this->table_col = $this->db->list_fields('table_name');
    

    在insert方法内部,以这样的数组作为参数

    $data = array(
       array('column_name1'=>'value1', 'column_name2' =>'value2'....),
       array('column_name1'=>'value1', 'column_name2' =>'value2'....),
       array('column_name1'=>'value1', 'column_name2' =>'value2'....)
    );
    

    我将过滤列,删除每个无效字段。您可以将它包装在一个函数中,因为您将在其他地方使用它(更新、插入单个、where 子句)

     foreach($data as &$single)
     {
         $invalid_keys = array_diff(array_keys($single), $this->table_col);
    
         if(!empty($invalid_keys))
         {
            $single = array_diff_key($single,array_flip($invalid_keys));
         }
     }
    

    如果我想确保每个查询都顺利进行,我将使用事务。否则只需 insert_batch

    $this->db->trans_begin();
    
    $this->db->insert_batch('table_name', $data); 
    
    if ($this->db->trans_status() === FALSE)
    {
        $this->db->trans_rollback();
    }
    else
    {
        $this->db->trans_commit();
    }
    

    【讨论】:

      【解决方案3】:

      也许你正在寻找类似的东西

      $data = array(
         array(
            'title' => 'My title' ,
            'name' => 'My Name' ,
            'date' => 'My date'
         ),
         array(
            'title' => 'Another title' ,
            'name' => 'Another Name' ,
            'date' => 'Another date'
         )
      );
      
      $this->db->insert_batch('mytable', $data); 
      
      // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
      

      来源:http://ellislab.com/codeigniter/user-guide/database/active_record.html

      或者这只是可以作为扩展的基础

      ------------在第一次评论后编辑-------------

      因此,要获取您的表名列,您可以使用 CI 中的 Active Record 类方法应用类似的内容

      SELECT column_name
      FROM information_schema.columns
      WHERE table_name='Yourtablename'
      

      这样你就可以按照你的描述创建列数组并继续它

      【讨论】:

      • 感谢您的回复。但是,我尽量避免输入列的名称,因为我有很多表,大约有 30 到 40 列
      【解决方案4】:
      $data = array('column_name1'=>'value1', 'column_name2' =>'value2'....);
      
      foreach($data as $key as $value){
       $sql = "INSERT INTO $table ($key) VALUES ($value)";  
          return $sql; 
      }
      

      ...我希望我能给你一些想法:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 2014-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多