这是我目前的代码:
// 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",
}
如何让它循环遍历所有行并插入所有行?还有,一种方法以相反的顺序插入它们(从最后一个开始,到第一个结束)?
非常感谢任何帮助:)
答案 0 :(得分:5)
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 :(得分:0)
为了使用foreach()
在数组变量上插入多行数据或数据数组,你必须迭代,这样它就会以单行循环,以便您可以执行您想要执行的操作。
您可以使用mysqli.*
或PDO
或使用prepared statements
插入数据。您可以决定在哪种情况下插入数据取决于您。
<强>的mysqli:强>
<?php
$data = json_decode($jsondata, true);
foreach($data as $single_data)
{
$insertstatement = mysqli_query($con,"INSERT INTO `table` (`id`, `name`, `status`) VALUES ('".$single_data['id']."', '".$single_data['name']."', '".$single_data['status']."');");
}
?>
准备好的声明:
<?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 :(得分:-1)
使用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注入的更多信息:How can I prevent SQL injection in PHP?。
答案 3 :(得分:-1)
您应该使用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 ...&amp;以上其他有用的补充。您还应该确保您的数据被正确转义/来自100%安全的来源。如果状态包含“'; TRUNCATE TABLE ... ”等未转义的状态,则可能会遇到麻烦。
编辑:其他两个解决方案也可以工作并插入所有行。但是,我的版本会在一个查询中插入所有行。根据数据的大小,运行 - 比方说 - 1000个查询而不是一个查询可能是不可行的。