php数组如何在事先不知道字段名时动态地将数据插入到mysql表中?

时间:2012-05-15 12:16:19

标签: php mysql dynamic insert

我在数组中收到一些数据,这些数据将存储在mysql表中。表字段名称与数组中键/值对中的key相同,但我事先并不知道哪些键/值对将到达

// First execution
$array1 = array('a'=> 'str1', 'b'=> 'str2', 'c'=> 'str3', 'd'=> 'str4');

// second execution
$array2 = array('a'=> 'str6', 'c'=> 'str7', 'e'=> 'str5');

// third execution
$array3 = array('b'=> 'str8', 'd'=> 'str9', 'e'=> 'str10');

所以上面说明了数据的到达方式。下面是db表结构的示例

column 1 name = id (auto increment)
column 2 name = 'a'
column 3 name = 'b'
column 4 name = 'c'
column 5 name = 'd'
column 6 name = 'e'
column 7 name = 'f'

请注意,可能存在一些意外数据,但如果该意外值不存在db字段(列),则应跳过该数据。我基本上只需要插入存在列的数据,并且列的任何非存在值都应为null。我希望这对某人有意义。

如何在php中构建SQL?

2 个答案:

答案 0 :(得分:1)

您可以从数组键构造列名列表,并从数组值中构造值列表。类似的东西:

$keys = array_keys($arr);
$vals = array();
foreach ($keys as $k)
{
    $vals[] = "'".mysql_real_escape_string($arr[$k])."'";
}
$qry = "INSERT into tab1 (".implode(',', $keys).") VALUES (".implode(',', $vals).")";

您仍然需要找到一种方法来删除不在表中的键。我认为GordonM使用DESCRIBE TABLES的想法可能就是这样,然后过滤$ keys(一旦你得到列名列表,使用array_intersect())

答案 1 :(得分:0)

您可以使用作为Zend Framework一部分的Zend_Db_Table。 http://framework.zend.com/manual/en/zend.db.table.html 请注意,您可以将其用作库,您不需要使用该框架。 Zend_Db_Table有一个检索表元数据的方法,因此很容易过滤数组。它还提供了缓存元数据的功能。

一个简单的例子:

$db = new Zend_Db_Adapter_Pdo_Mysql(array(
    'host'     => 'localhost',
    'username' => 'test',
    'password' => 'test',
    'dbname'   => 'test'
));
Zend_Db_Table::setDefaultAdapter($db);
$table = new Zend_Db_Table('table_name');    
$info = $table->info();

// assuming array1 contains keys => values    
$arr = array_intersect_key($array1,array_flip($info['cols']));    
$table->insert($arr);