使用 PHP 将 _nested_ 数组插入 MySQL 数据库

Posted

技术标签:

【中文标题】使用 PHP 将 _nested_ 数组插入 MySQL 数据库【英文标题】:Insert _nested_ array into MySQL database with PHP 【发布时间】:2013-02-16 12:39:48 【问题描述】:

我有一个这样的嵌套数组:

array(3)  
[1]=> array(5)  
    ["firstname"]=> string(2) "john" 
    ["name"]=> string(2) "dorian" 
    ["email"]=> string(2) "john@example.something" 
    ["sex"]=> string(1) "m" 
    ["size"]=> string(1) "L"  
[2]=> array(5)  
    ["firstname"]=> string(2) "Sam" 
    ["name"]=> string(2) "Stuard" 
    ["email"]=> string(2) "sammy@some.thing" 
    ["sex"]=> string(1) "m" 
    ["size"]=> string(1) "S"  
[3]=> array(5)  
    ["firstname"]=> string(2) "vanessa" 
    ["name"]=> string(2) "sherbatzky" 
    ["email"]=> string(2) "vanessa@bla.bla" 
    ["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)";

但我没听懂。 :/

【问题讨论】:

$insdata 是整个数组吗?您需要在数组上循环以获取每个子数组,然后执行您的数据库操作。 【参考方案1】:
$columns = array_keys($insData[0]);
$values = "";
foreach($insData as $data)
   $values.= "(".$data['firstname'].",".$data['name'].",etc ."),";

在插入值部分省略括号

【讨论】:

【参考方案2】:
$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(); 

【讨论】:

【参考方案3】:

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

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

【讨论】:

谢谢,太棒了! PDO 似乎有点复杂,但是当您说 mysql_ 函数不再是最新的时,我会尝试一下。那么,我必须检查用户输入(数组来自 $_POST)还是 PDO sql 注入安全? PDO(实际准备好的语句)比 vanilla-SQL 注入更安全,因为实际查询和参数是分开的。 (两者的合并发生在 DBMS 中。)但是您应该始终始终检查您的输入。

以上是关于使用 PHP 将 _nested_ 数组插入 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用数组插入 MYSQL 时出现 PHP 错误

如何将数组插入一行?

PHP中的MongoDB - 如何将项目插入集合中的数组?

如何使用PHP Wordpress将沙箱Paypal返回值插入MySQL表?

数组到字符串 PHP?

防止使用php插入查询