PHP 不会为所有结果解析完整的 JSON 文件

PHP will not parse full JSON file for all results

php 脚本可能只会解析 1 到 2 个结果,而不是整个文件。 JSON 文件中有大约 200 个结果。

这是 php 文件

$url = 'http://ironcentral.org/carnivore/api/nation_data/iron_nations';
$content = file_get_contents($url);
$json = json_decode($content, true);
$con = mysqli_connect("localhost", "user", "pass", "iron");
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

foreach($json as $item) {
    $sql = "INSERT INTO nations (nationid, ruler, nation, gov, religion, tech, infra, land, mode, resource1, resource2, strength, defcon, soldiers, tanks, cruise, nukes, slots) VALUES ('$item[nationid]','$item[ruler]','$item[nation]','$item[gov]','$item[religion]','$item[tech]','$item[infra]','$item[land]','$item[mode]','$item[resource1]','$item[resource2]','$item[strength]','$item[defcon]','$item[soldiers]','$item[tanks]','$item[cruise]','$item[nukes]','$item[slots]')";

}
mysqli_query($con, $sql) or die(mysqli_error($con));
mysqli_close($con);

您对 mysqli_query() 的调用在您的循环之外,因此在循环完成执行后仅 运行 nce。将其移动到循环内:

foreach($json as $item) {
    $sql = "INSERT INTO nations (nationid, ruler, nation, gov, religion, tech, infra, land, mode, resource1, resource2, strength, defcon, soldiers, tanks, cruise, nukes, slots) VALUES ('$item[nationid]','$item[ruler]','$item[nation]','$item[gov]','$item[religion]','$item[tech]','$item[infra]','$item[land]','$item[mode]','$item[resource1]','$item[resource2]','$item[strength]','$item[defcon]','$item[soldiers]','$item[tanks]','$item[cruise]','$item[nukes]','$item[slots]')";
    mysqli_query($con, $sql) or die(mysqli_error($con));
}

您也可以将其设为一个查询并在一条语句中执行所有操作:

$sql = "INSERT INTO nations (nationid, ruler, nation, gov, religion, tech, infra, land, mode, resource1, resource2, strength, defcon, soldiers, tanks, cruise, nukes, slots) VALUES ";
foreach($json as $item) {
    $sql .= "('$item[nationid]','$item[ruler]','$item[nation]','$item[gov]','$item[religion]','$item[tech]','$item[infra]','$item[land]','$item[mode]','$item[resource1]','$item[resource2]','$item[strength]','$item[defcon]','$item[soldiers]','$item[tanks]','$item[cruise]','$item[nukes]','$item[slots]'), ";
}
$sql = rtrim($sql, ',');
mysqli_query($con, $sql) or die(mysqli_error($con));

$sql = "INSERT INTO nations (nationid, ruler, nation, gov, religion, tech, infra, land, mode, resource1, resource2, strength, defcon, soldiers, tanks, cruise, nukes, slots) VALUES ";
$inserts = [];
foreach($json as $item) {
    $inserts[] = "('$item[nationid]','$item[ruler]','$item[nation]','$item[gov]','$item[religion]','$item[tech]','$item[infra]','$item[land]','$item[mode]','$item[resource1]','$item[resource2]','$item[strength]','$item[defcon]','$item[soldiers]','$item[tanks]','$item[cruise]','$item[nukes]','$item[slots]') ";
}
$sql .= implode(',', $inserts);
mysqli_query($con, $sql) or die(mysqli_error($con));

bind_param 是转义的另一种选择。这个答案假设了很多事情: 1. .json 中的所有列都按照您需要插入的顺序排列。 (必须是真的,否则你必须做一些事情才能让它发挥作用) 2.所有列都是字符串(有点容易修复。"ssssssssssssssssss"中的s都对应于您要插入的列。如果该列,请将任何s替换为i是一个整数)

$insertColumns = array("nationid", "ruler", "nation", "gov", "religion", "tech", "infra", "land", "mode", "resource1", "resource2", "strength", "defcon", "soldiers", "tanks", "cruise", "nukes", "slots"); 
$sql = "INSERT INTO skill (" . implode(",",$insertColumns) . ") VALUES (" . implode(",",array_fill(0,count($insertColumns),"?")) . ")";

if($stmt = mysqli_prepare($con,$sql)) {
    foreach($json  as $item) {
        call_user_func_array("mysqli_stmt_bind_param", refValues(array_merge(array($stmt, "ssssssssssssssssss"),array_values($item))));

        mysqli_stmt_execute($stmt);
    }
}

// shameless borrowing 
function refValues($arr) {
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}
?>