在php中插入的智能方式

时间:2013-11-21 13:23:40

标签: php mysql sql codeigniter

我正在使用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"....)");

4 个答案:

答案 0 :(得分: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如何将值绑定到“持有者”等。 此外,不要忘记其他形式的清理,例如列出您的列名称等。

答案 1 :(得分:0)

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

$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

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

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

因此,要获取yourtablename列,您可以在CI

中应用类似于Active Record Class方法的内容
SELECT column_name
FROM information_schema.columns
WHERE table_name='Yourtablename'

这样您可以按照描述创建列数组并继续

答案 2 :(得分:0)

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

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

我会过滤删除每个无效字段的列。你可以将它包装在一个函数中,因为你将在其他地方使用它(update,insert_single,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 :(得分:0)

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

foreach($data as $key as $value){
 $sql = "INSERT INTO $table ($key) VALUES ($value)";  
    return $sql; 
}

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