2013-01-10 41 views
2

假設列我有一個非常大的數組的信息對用戶:INSERT到表上存在的

$user=array(
"name"=>"john", 
"ip"=>"xx.xx.xx.xx", 
"email"=>"[email protected]", 
//lots more values 
) 

讓我們也假設這一信息需要進入多個表。例如,一個username需要去表usersaddress需要進入一個details表等

現在,我用一定的自制功能,插入我的表是數組鍵相匹配的列名數組值與輸入值。一些與此類似:

function insert_sql($table, arr $values){ 
    GLOBAL $dbc; 
    $sql="INSERT INTO `$table` (".implode(array_keys($values), ", ").") VALUES (".implode(array_values($values), ", ").")"; 
    $dbc->prepare($sql)->execute(); 
    return $dbc->lastInsertId(); 

} 
//I don't actually use this function, just trying to show you what is being accomplished. 

的問題是,我的函數使用所有按鍵所有的值,所以當我需要的只是陣列放入多個表的某些部分,它不工作。

的問題是:

如何讓我的INSERT語句忽略的列,如果它不存在?因此,如果我將name,email,address插入表users,但該表沒有地址列,我需要它插入帶有名稱和電子郵件的行,但只是忽略地址列不存在的事實。

編輯:另一種選擇是與表的列進行數組並使用它來過濾值數組。雖然我不確定如何設置。

回答

1

查找指定表的列名:

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

然後就是白名單你的鑰匙在$values陣列

例子:

function insert_sql($table, array $values){ 
     global $connection; 
     $query = "SELECT column_name FROM information_schema.columns WHERE table_name = :tablename"; 
     /* @var $stmt PDOStatement */ 
     $stmt = $connection->prepare($query); 
     $stmt->execute(array(
      'tablename' => $table 
     )); 
     $columns = array_flip($stmt->fetchAll(PDO::FETCH_COLUMN, 0)); 
     $values = array_intersect_key($values, $columns); 
     var_dump($values); 
    } 
+0

謝謝!我有列作爲數組$列的值。根據$列過濾$值的最佳方法是什麼(記住數組$ values的鍵是列)。 – hellohellosharp

+0

沒關係,我找到了這個答案:http://stackoverflow.com/questions/4260086/php-how-to-use-array-filter-to-filter-array-keys – hellohellosharp

+0

@hellohellosharp我提供了一個例子,使用'array_intersect_key'但array_filter也很好 –

1

如何讓我的INSERT語句忽略列如果不存在? 因此,如果我將表名,電子郵件地址插入到表用戶中,但此表 沒有地址列,我需要它插入具有 名稱和電子郵件地址的行,但完全忽略地址列爲 不在那裏。

不能

相反,你應該將數據映射到具有獨立插入相應的表。

+0

當然,可以使用單獨的INSERTS,我想我只是在尋找一種方法來動態分割數組,然後才能得到正確的值。 – hellohellosharp