使用 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。请不要将它们用于任何新代码。使用mysqli
或PDO
。
您需要遍历数组,并一次插入一行。您可以为多行插入构造一个(准备好的)语句,但如果您是数据库新手,最好从基础开始,然后从那里开始构建。
// 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章