簡體   English   中英

PHP循環不會遍歷每一行

[英]PHP Loop Does Not Iterate Over Every Row

我已經編寫了以下腳本:它的作用是轉到一個輸出JSON字符串,解碼JSON字符串並將其數據存儲在我的數據庫中的網頁。 最外面的for循環在$category for迭代,而foreach循環在$alpha之后進行迭代, $alpha只是整個字母+ %23 (即number元素)的數組。 每個解碼的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:我檢查了數據庫表,並在滾動時看到: Warning: a form on this page has more than 1000 fields. On submission, some of the fields might be ignored, due to PHP's max_input_vars configuration. Warning: a form on this page has more than 1000 fields. On submission, some of the fields might be ignored, due to PHP's max_input_vars configuration. 但是,我不確定這是否與問題有關。

編輯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個項目的文件; 我的輸出中缺少帶有兩個星號的標記。 模式似乎是在相同$alpha 12個項目(它們以開頭的字母)之后,該$alpha的其余項目被省略。 我什至嘗試了該類別的其他數字,並且模式是相同的:每個$ alpha的前12個項目僅在我的文件中輸出...

每個解碼的JSON字符串$ decoded-> items都包含多個項目,因此內部存在一個額外的foreach循環來迭代這些項目。

現在,例如,查看這兩個URL的來源。

查看源代碼: http : //services.runescape.com/m=itemdb_rs/api/catalogue/items.json?category=5&alpha=o

查看源代碼: http : //services.runescape.com/m=itemdb_rs/api/catalogue/items.json?category=4&alpha=y

首先根據需要工作。 但是第二個返回空項目。

{"total":15,"items":[]}

因此,大多數URL僅返回空數組。 看:

視圖源: http : //services.runescape.com/m=itemdb_rs/api/catalogue/items.json?category=4&alpha= c視圖源: http : //services.runescape.com/m=itemdb_rs/api /catalogue/items.json?category=4&alpha=d視圖源: http://services.runescape.com/m=itemdb_rs/api/catalogue/items.json?category=4&alpha=e視圖源: HTTP:/ /services.runescape.com/m=itemdb_rs/api/catalogue/items.json?category=4&alpha=h

我發現了你的問題!

  1. 添加set_time_limit(0); 開始編寫腳本。
  2. 運行腳本,等待10-20秒
  3. 嘗試打開我之前發布的所有URL。 只需單擊其中之一。 您將看到空白頁。 OOOOPS! 您的網絡服務器掉線了:)

最大的問題是服務器響應時會顯示空白頁,但有效標頭狀態為200 OK

實際上,服務器不是您的,最好的解決方案是使用sleep();。 -例如,請每隔5秒建立一次連接,並希望服務器可以正常使用。

嘗試這個。 我也在這里嘗試重用CURL連接。 這很慢,因為sleep(); 但這是唯一的方法。

<?php
set_time_limit(0); // <--- SET NO TIME LIMIT
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;
}

// Getting data
$curl = curl_init();

// Open the text file
$f = fopen("data.txt", "w");

for ($category = 0; $category <= 37; $category++) {
    foreach ($alphas as $alpha) {
        fwrite($f, "category ".$category.", alpha ".$alpha." \n");

        $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);
        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'Connection: Keep-Alive',
            'Keep-Alive: 300'
        ));
        $data = curl_exec($curl);

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

        // Storing each new item into the database
        foreach ($decoded as $item) {
            fwrite($f, $item->name."\n");
        }

        sleep(5);
    }
}

// Close the text file
fclose($f);

curl_close($curl);

echo "DONE";
?>

此處記錄了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()來減慢請求的速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM