3

我在一个数组中收到一些数据,这些数据将存储在一个 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 字段(列)不存在,则应跳过数据。我基本上只需要在存在列的位置插入数据,并且该列的任何不存在的值都应该为空。我希望这对某人有意义。

如何在 php 中构造 SQL?

4

2 回答 2

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())

于 2012-05-15T12:36:53.990 回答
0

您可以使用 Zend 框架的一部分 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);
于 2012-05-15T13:37:57.177 回答