使用PHP将数组插入到MySQL数据库?

4
以下是我的当前代码:
// connect to database  
$con = mysqli_connect("localhost","username","password","database");
if (!$con) {
    die('Could not connect: ' . mysqli_error());
}

// get the json file
$jsondata = file_get_contents('http://www.example.com');

// convert json to php array
$data = json_decode($jsondata, true);

// assign each of the variables
$id = $data['0']['id'];
$name = $data['0']['name'];
$status = $data['0']['status'];

$insertstatement = mysqli_query($con,"INSERT INTO `table` (`id`, `name`, `status`) VALUES ('".$id."', '".$name."', '".$status."');");

技术上这段代码是有效的,但它只添加了第一个项目。

例如,这里是正在导入的原始json:

[
   {
      "id":"19839",
      "status":"active",
      "name":"First Name",
   },
   {
      "id":"19840",
      "status":"active",
      "name":"Second Name",
   },
   {
      "id":"19841",
      "status":"active",
      "name":"Another Name",
   },
   {
      "id":"19842",
      "status":"active",
      "name":"Last Name",
   }
]

我的代码只会将这个插入到数据库中:

{
 "id":"19839",
 "status":"active",
 "name":"First Name",
}

我该如何让它循环遍历它们并插入所有行?此外,是否有一种方法可以倒序插入它们(从最后一个开始,以第一个结束)?
4个回答

8
  • 要迭代数组,您需要使用foreach运算符。
  • 要执行多次插入操作,您需要使用预处理语句

因此,尽管所有其他草率编写的答案都是这样说的,但代码应该是

$stmt = $con->prepare("INSERT INTO `table` (`id`, `name`, `status`) VALUES (?,?,?)");
$stmt->bind_param("sss", $id, $name, $status);
foreach ($data as $row)
{
    $id = $row['id'];
    $name = $row['name'];
    $status = $row['status'];
    $stmt->execute();
}

1
为了插入多行数据或数组数据,您需要使用foreach()循环遍历数组变量,以便它会逐行循环,以便您可以执行所需的操作。
您可以使用mysqli.*PDO或使用prepared statements来插入数据。由您决定在哪种情况下插入数据。 MYSQLI with Prepared Statements:
<?php
$query = $con->prepare("INSERT INTO `table` (`id`, `name`, `status`) VALUES (?,?,?)");
$query->bind_param("sss", $id, $name, $status);
foreach ($data as $row)
{
    $id = $row['id'];
    $name = $row['name'];
    $status = $row['status'];
    $result->execute();// This will execute the statement. 
}
?>

PDO预处理语句:
<?php
$link = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbusername,$dbpassword);
$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
    VALUES(:id, :name, :status)");
foreach($data as $row)
{
$statement->execute(array(
    "id" => $row['id'],
    "name" => $row['name'],
    "status" => $row['status']
));
}
?>

希望我的解释能够清晰地说明三种语句的区别,以便更好地理解。


-2
用一个 foreach 循环:
foreach($data as $index => $row){
    $insertstatement = mysqli_query($con,"INSERT INTO `table` (`id`, `name`, `status`) VALUES ('". $row['id'] ."', '". $row['name'] ."', '". $row['status'] ."');");
}

然而请注意,当您插入来自不受信任的来源的数据时,应该小心,因为这会使您容易受到SQL注入攻击。在此处了解有关SQL注入的更多信息:如何在PHP中防止SQL注入?


-2

你应该使用MySql的多行插入。

INSERT INTO tbl_name (col1,col2) VALUES(1,2), (3,4);

MySql插入参考: http://dev.mysql.com/doc/refman/5.7/en/insert.html

在php中,你可以像这样做(修改了你的代码)

// connect to database  
$con = mysqli_connect("localhost","username","password","database");
if (!$con) {
    die('Could not connect: ' . mysqli_error());
}

// get the json file
$jsondata = file_get_contents('http://www.example.com');

// convert json to php array
$data = json_decode($jsondata, true);

$query = "INSERT INTO `table` (`id`, `name`, `status`) VALUES ";

foreach($data as $d) {
$query .= "('".$d['id']."', '".$d['name']."', '".$d['status']."'),";
}
// Query. Note the trim to remove the last ,
$insertstatement = mysqli_query($con, trim($query,',');

你也可以继续阅读关于ON DUPLICATE KEY…和其他有用内容的信息。你还应该确保数据被正确转义/来自100%安全的源。如果状态包含类似“;'TRUNCATE TABLE ...”这样未转义的内容,那么你可能会遇到麻烦。

编辑:另外两种方法也能够工作并且插入所有行。然而我的版本是通过单个查询插入所有行。根据你的数据量大小来决定是否使用一次性查询而不是一千次查询等等。


你忘记正确格式化你的SQL语句了。这会导致各种不良结果,从语法错误到SQL注入。然而,“truncate table”查询永远不会引起麻烦。 - Your Common Sense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接