2016-10-02 130 views
1

这里是我当前的代码:使用PHP插入数组到MySQL数据库?

// 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
  • 要遍历数组,您必须使用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循环:

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?

-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,','); 

您还可以继续从对重复KEY阅读... &上述其他有用的补充。您还应该确保您的数据正确转义/来自100%安全的来源。如果状态包含诸如“”; TRUNCATE TABLE ...“未转义,您可能会遇到麻烦。

编辑:另外两个解决方案也工作并插入所有行。然而,我的版本在一个查询中插入了所有的行。根据数据的大小,运行 - 例如 - 1000查询而不是一个查询可能不太可行。

+0

你忘了正确格式化你的SQL。这将导致广泛的不良结果 - 从语法错误到sql注入。然而,“truncate table”查询尤其不会造成麻烦。 –

0

为了插入多行数据或数组的数组,你必须迭代上的数组变量使用foreach(),这样它会循环你单行,以便您可以执行m您想要执行的操作。

您可以使用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'] 
)); 
} 
?> 

希望所以我的解释对于更好地理解所有这三种类型的陈述都是很清楚的。