【问题标题】:Insert _nested_ array into MySQL database with PHP使用 PHP 将 _nested_ 数组插入 MySQL 数据库
【发布时间】: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 是整个数组吗?您需要在数组上循环以获取每个子数组,然后执行您的数据库操作。

标签: php mysql arrays insert nested


【解决方案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 中。)但是您应该始终始终检查您的输入。
      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2012-07-21
      • 2016-05-26
      • 2014-12-02
      • 1970-01-01
      相关资源
      最近更新 更多