PHP 循环不会遍历每一行

标签 php mysql json curl mysqli

我编写了以下脚本:它的作用是转到输出 JSON 字符串的网页,解码 JSON 字符串,并将其数据存储在我的数据库中。最外面的 for 循环迭代 $category ,而 foreach 循环紧接着迭代 $alpha ,这只是整个字母表 + %23 的数组,这是数字元素。每个解码的 JSON 字符串 $decoded->items 都包含多个项目,因此内部有一个额外的 foreach 循环来迭代这些项目。然而,当我尝试 echo $item->name 时,它仅回显 $alpha 迭代中某些的项目名称。

我知道问题不在于数据本身,因为每次运行它时都会回显不同的项目。

有什么建议吗?

这是代码(数据库查询部分已注释,但除了重点之外,错误仍然存​​在):

error_reporting(E_ERROR);

$alphas = array("%23", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");

function get_bool($string) {
    return ($string == "true") ? TRUE : FALSE;
}

$DB = new mysqli("localhost", "root", "root", "drop_logger");

echo "<pre>";
for ($category = 0; $category <= 37; $category++) {
    foreach ($alphas as $alpha) {

        // Echoing the current category and alpha
        echo "category ".$category.", alpha ".$alpha." \n";         

        // Getting data
        $curl = curl_init();
        $post_url = "http://services.runescape.com/m=itemdb_rs/api/catalogue/items.json?category=".$category."&alpha=".$alpha;
        curl_setopt($curl, CURLOPT_URL, $post_url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($curl);
        curl_close($curl);

        // Decoding the JSON data
        $decoded = json_decode($data);
        $decoded = $decoded->items;

        // Storing each new item into the database
        foreach ($decoded as $item) {
            echo $item->name."\n";/*
            $DB->query(
                "INSERT INTO GE_items (item_ID, item_name, item_icon, item_icon_large, item_type, item_type_icon, item_description, item_members)
                 VALUES ("
                    .$item->id.", '"
                    .$item->name."', '"
                    .$item->icon."', '"
                    .$item->icon_large."', '"
                    .$item->type."', '"
                    .$item->typeIcon."', '"
                    .$item->description."', "
                    .get_bool($item->members)
                 .")"
            );*/
        }

        @flush();
        @ob_flush();
    }
}
echo "</pre>";

编辑:这是输出示例:

category 4, alpha y 
category 4, alpha z 
category 5, alpha %23 
category 5, alpha a 
category 5, alpha b 
category 5, alpha c 
category 5, alpha d 
category 5, alpha e 
category 5, alpha f 
category 5, alpha g 
category 5, alpha h 
category 5, alpha i 
category 5, alpha j 
category 5, alpha k 
category 5, alpha l 
category 5, alpha m 
category 5, alpha n 
category 5, alpha o 
Oak armchair
Oak armour case
Oak bed
Oak bench
Oak bookcase
Oak cape rack
Oak chair
Oak clock
Oak costume box
Oak dining table
Oak drawers
Oak dresser
category 5, alpha p 
category 5, alpha q 
category 5, alpha r 
category 5, alpha s 
category 5, alpha t 
category 5, alpha u 
category 5, alpha v 
category 5, alpha w 
category 5, alpha x 
category 5, alpha y 
category 5, alpha z 
category 6, alpha %23 
category 6, alpha a 
category 6, alpha b 

编辑2:我检查了数据库表,在滚动时我看到: 警告:此页面上的表单有超过 1000 个字段。提交时,由于 PHP 的 max_input_vars 配置,某些字段可能会被忽略。但是,我不确定这是否与问题有关。

编辑 3: 我遇到了一些有趣的事情...我重复运行同一类别 35 的脚本。每次它都会返回完全相同的 134 个项目的数据集。该类别本身包含 164 个项目。我在本页http://services.runescape.com/m=itemdb_rs/catalogue?cat=35浏览了该类别下的项目,并且脚本似乎省略了其中 30 个项目(每次都是相同的 30 个项目)。我使用了 sleep(),我什至更改了脚本以不迭代具有 0 个项目的 $alpha,并且我不断获得相同的 134 个项目...

对于类别 35,我检查了上面链接的页面,并将其中列出的项目与我的脚本输出的项目进行了比较。上http://pastebin.com/9Aj9AtWL ,我发布了所有 164 项的文件;前面标有两个星号的那些在我的输出中丢失了。该模式似乎是在 12 个相同 $alpha 项(它们以字母开头)之后,该 $alpha 的其余项被省略。我什至尝试了该类别的其他数字,并且模式是相同的:只有每个 $alpha 的前 12 个项目在我的文件中输出...

最佳答案

API 记录如下: http://services.runescape.com/m=rswiki/en/Grand_Exchange_APIs

我猜你给服务器打电话太多了,这就是为什么在几次通话后服务器就忽略你了。

首先,我会改进我的代码,通过如下查询询问给定类别的可用字母:

http://services.runescape.com/m=itemdb_rs/api/catalogue/category.json?category=1

它将为您提供该类别的所有可用字母。这样您就不会对不可用的字母进行不成功的查询。 (并减少向服务器发送垃圾邮件)。

如果还不够,您可以尝试在代码中使用 sleep() 来减慢请求速度。

关于PHP 循环不会遍历每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29574305/

相关文章:

mysql - 带有 JOIN 的 SQL,如果全局 WHERE 未填满,则一个表的列为空

sql - 检查 Postgres jsonb 是否包含以下值之一

javascript - 将 .json 文件中的项目分配给 javascript 中的变量

java - 在将 Json 对象转换为 POJO 之前验证它 - 使用 @requestBody

php - 存储在 PHP 数组或 mySQL 中

javascript - 使用 mysql 和 javascript 计算链接的点击次数

php - Mongo Map Reduce 第一次

php - Nominatim API中有多少索引排名

php - 将数组中的数据插入到mysql

python - 如何加快 MySQL (InnoDB) 插入速度?