2013-03-01 59 views
1

我有一个嵌套阵列是这样的:插入_nested_阵列分成MySQL数据库用PHP

array(3) { 
[1]=> array(5) { 
    ["firstname"]=> string(2) "john" 
    ["name"]=> string(2) "dorian" 
    ["email"]=> string(2) "[email protected]" 
    ["sex"]=> string(1) "m" 
    ["size"]=> string(1) "L" } 
[2]=> array(5) { 
    ["firstname"]=> string(2) "Sam" 
    ["name"]=> string(2) "Stuard" 
    ["email"]=> string(2) "[email protected]" 
    ["sex"]=> string(1) "m" 
    ["size"]=> string(1) "S" } 
[3]=> array(5) { 
    ["firstname"]=> string(2) "vanessa" 
    ["name"]=> string(2) "sherbatzky" 
    ["email"]=> string(2) "[email protected]" 
    ["sex"]=> string(1) "w" 
    ["size"]=> string(3) "S" } } 

最外阵列的数目([1],[2],[3])可改变。

我的东西试过像

$columns = implode(", ",array_keys($insData)); 
$escaped_values = array_map('mysql_real_escape_string', array_values($insData)); 
$values = implode(", ", $escaped_values); 
$sql = "INSERT INTO `user`($columns) VALUES ($values)"; 

,但我没有得到它。 :/

+0

是$ insdata那整个数组?你需要在数组上循环来获取每个子数组,然后做你的数据库的东西。 – 2013-03-01 21:52:49

回答

1

mysql_ functions are deprecated。请不要将它们用于任何新代码。使用mysqliPDO

你会想迭代你的数组,并一次插入一行。您可以为多行插入构建一个(准备好的)语句,但是如果您对数据库不熟悉,那么从基础开始,然后从那里开始建立可能会更好。

// Create a new connection, see the manual on the details 
$conn = new PDO(/* see PHP manual for the params*/); 

// Start a new transaction. All MySQL storage engines don't support transactions, 
// so this step might be superfluous. Check your schema definition and the 
// MySQL manual. 
$conn->beginTransaction() 

// Create a prepared statement 
$stmt = $conn->prepare("INSERT INTO user (firstname, name, email, sex, size) VALUES (:firstname, :name, :email, :sex, :size)"); 

try { 
    foreach ($insData as $dataset) { 
     foreach ($dataset as $colname => $value) { 
      // Bind values for the placeholders in the prepared statement 
      $stmt->bindValue(":" . $colname, $value); 
     } 

     // Run your query 
     $stmt->execute(); 
    } 

    // Commit the changes pending in the transaction 
    $conn->commit(); 
} catch (PDOException $e) { 
    // Rollback all statements in the transaction on errors 
    $conn->rollback(); 
} 

如果您需要动态创建整个语句,那也是可以的。它只需要一个额外的步骤来创建查询的列部分。

+0

谢谢,那真棒! PDO似乎有点复杂,但当你说mysql_函数不是最新的,我会试试看。 那么,我必须检查userinput(数组是从$ _POST)还是PDO SQL注入安全? – jayce 2013-03-01 22:56:50

+0

由于实际查询和参数保持分离,所以PDO(实际上已准备好的语句)比vanilla-SQL更安全。 (两者的合并发生在数据库管理系统中。)但是你应该总是,*总是*检查你的输入。 – 2013-03-02 07:00:43

0
$columns = array_keys($insData[0]); 
$values = ""; 
foreach($insData as $data) 
    $values.= "(".$data['firstname'].",".$data['name'].",etc ."),"; 

省略括号在你插入值部分

0
$columns = array(); 
$values = array();  

foreach($insData as $row) 
{ 
    foreach($row as $columnName => $columnValue) 
    { 
     $columns[] = $columnName; 
     $values[] = $columnValue; 
    } 

    // Build query 
    $query = "INSERT INTO `user` (" . implode(",", $columns) . ") VALUES (" . implode(",", $values) . ")"; 

    // DO INSERT HERE (PREFERABLY WITH PDO OR MYSQLI) 

    // Reset columns/values 
    $columns = array(); 
    $values = array(); 
} 
+0

这也适用于我,谢谢! – jayce 2013-03-01 22:58:45