gpt4 book ai didi

php - 使用 PHP 将 JSON 对象中的元素插入数据库

转载 作者:行者123 更新时间:2023-11-29 17:12:33 26 4
gpt4 key购买 nike

我只是一名学生,所以如果这篇文章不清楚,请提前道歉。


我正在努力将产品数据从 JSON 响应导入到产品数据库中。我的目标是将 JSON 对象中的元素插入到数据库中。

目前,我收到“ undefined index :产品”错误,更正后出现“无效的 foreach 语句”错误。真的很难理解我的错误在哪里以及什么。

如果有人可以查看这段代码并看看我做错了什么,我将不胜感激。



代码:

<?php
$params = http_build_query(array(
"api_key" => "***",
"format" => "json"
));

$result = file_get_contents(
'https://www.parsehub.com/api/v2/projects/***/last_ready_run/data?'.$params,
false,
stream_context_create(array(
'http' => array(
'method' => 'GET'
)
))
);

$result=gzdecode($result);
$parsed_result = json_decode($result, true);
$product[] = $parsed_result['product'];
foreach($product as $item){
$updated = $item['updated'];
$name = $item['name'];
$url = $item['url'];
$currentPrice = $item['currentPrice'];
$originalPrice = $item['originalPrice'];
$picture = $item['picture'];
$brand = $item['brand'];
$model = $item['model'];

require 'db_configuration.php';
$sql2 = "INSERT INTO storeA (name, url, currentPrice, originalPrice, picture, brand, model, updated) VALUES ('{$name}',{$url},{$currentPrice},{$originalPrice},{$picture},{$brand},{$model},{$updated})";
$result = run_sql($sql2);

}
?>

JSON:

{
"links": [
{
"link": "http://www.***.com",
"product": [
{
"updated": "****",
"name": "****",
"url": "****",
"currentPrice": "$****",
"originalPrice": "$****",
"picture": "http://****.jpg",
"picture_url": "****",
"brand": "***",
"extra": "****"
},
{
"updated": "****",
"name": "****",
"url": "****",
"currentPrice": "$****",
"originalPrice": "$****",
"picture": "http://****.jpg",
"picture_url": "****",
"brand": "***",
"extra": "****"
}
]
},
{
"link": "http://www.***.com",
"product": [
{
"updated": "****",
"name": "****",
"url": "****",
"currentPrice": "$****",
"originalPrice": "$****",
"picture": "http://****.jpg",
"picture_url": "****",
"brand": "***",
"extra": "****"
},
{
"updated": "****",
"name": "****",
"url": "****",
"currentPrice": "$****",
"originalPrice": "$****",
"picture": "http://****.jpg",
"picture_url": "****",
"brand": "***",
"extra": "****"
}
]
},
{
"link": "http://www.***.com",
"product": [
{
"updated": "****",
"name": "****",
"url": "****",
"currentPrice": "$****",
"originalPrice": "$****",
"picture": "http://****.jpg",
"picture_url": "****",
"brand": "***",
"extra": "****"
},
{
"updated": "****",
"name": "****",
"url": "****",
"currentPrice": "$****",
"originalPrice": "$****",
"picture": "http://****.jpg",
"picture_url": "****",
"brand": "***",
"extra": "****"
}
]
}
]
}

数据库配置

<?php
DEFINE('DATABASE_HOST', 'localhost');
DEFINE('DATABASE_DATABASE', '***');
DEFINE('DATABASE_USER', 'root');
DEFINE('DATABASE_PASSWORD', '');

$db = new mysqli(DATABASE_HOST, DATABASE_USER, DATABASE_PASSWORD, DATABASE_DATABASE);
$db->set_charset("utf8");
function run_sql($sql_script)
{
global $db;
// check connection
if ($db->connect_error)
{
trigger_error(print_r(debug_backtrace()).'.Database connection failed: ' . $db->connect_error, E_USER_ERROR);
}
else
{
$result = $db->query($sql_script);
if($result === false)
{
trigger_error('Stack Trace: '.print_r(debug_backtrace()).'Invalid SQL: ' . $sql_script . '; Error: ' . $db->error, E_USER_ERROR);
}
else if(strpos($sql_script, "INSERT")!== false)
{
return $db->insert_id;
}
else
{
return $result;
}
}
}

?>

最佳答案

从 var_dumping json_decode($result, true) 的结果开始 - 数组结构为:

array(1) {
'links' =>
array(1) {
[0]
array(2) {
'link' =>
string(18) "http://www.***.com"
'product' =>
array(2) {
...
}
}
}
}

因此,$parsed_result 是一个包含单个元素的数组,其中 links 作为键。该元素包含链接/产品对的数组。

所以,如果你想获取json响应中的所有产品,你需要这样做:

foreach ($link in $parsed_results['links']) {
foreach ($product in $link['product']) {
// construct your array
}
}

这可行 - 但您的数据库查询容易受到 SQL 注入(inject)攻击。您永远不应该使用插值将变量注入(inject) SQL 查询 - 您不应该永远这样做:

$sql2 = "INSERT INTO storeA (name, url, currentPrice, originalPrice, picture, brand, model, updated) VALUES ('{$name}',{$url},{$currentPrice},{$originalPrice},{$picture},{$brand},{$model},{$updated})";

相反,您应该使用带参数的准备好的查询:

$insertProductQuery = mysqli_prepare("INSERT INTO storeA (name, url, currentPrice, originalPrice, picture, brand, model, updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");

mysqli_stmt_bind_param($insertProductQuery, 'ssddssss', $name, $url, $currentPrice, $originalPrice, $picture, $brand, $model, $updated);

(我使用参数类型对您的数据库架构进行了假设 - 尽管您也不应该真正使用 real/float/double 来存储货币值)

更好的是,使用 PDO,您可以使用命名参数。

关于php - 使用 PHP 将 JSON 对象中的元素插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com