2012-05-15 41 views
3

我收到數據中的一些數據,這些數據將存儲在mysql表中。該表的字段名稱是一樣的,在數組中的鍵/值對的key,但我不事先知道哪一個鍵/值對將抵達php數組如何在字段名稱未知時提前將數據動態插入到mysql表中?

// 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'); 

所以上面的指示方式,其中,數據可以到達。下面是分貝表結構的

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' 

注意,可能有一些意想不到的數據,但如果一個分貝字段(列)不爲意外的值存在,則數據應跳過的例子。我基本上只需要插入一個列存在的數據,任何不存在的值應該爲列的空值。我希望這對某人有意義。

我該如何在PHP中構造SQL?

+2

從理論上講,你可以做任何插入之前describe表,但我真的建議反對的是,當你真的要,如果你要傷害性能與很多表格進行交互。你可能會更好地實現一組知道底層表佈局的類 – GordonM

回答

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的想法很可能是要走的路,然後過濾$鍵(一旦獲得了列名稱列表,請使用array_intersect())

0

您可以使用Zend_Db_Table,它是Zend的一部分框架。 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); 
相關問題