2015-10-23 4 views
0

У меня есть следующий сценарий:PHP скрипт петли не работает

<?php 
ini_set('max_execution_time', 0); 
include("../includes/mysqli.php"); 
$pointsvar = 50000; 
$inserts = 0; 
$locationvar = 32000006; 

while($locationvar <= 32000260){ 

    while($pointsvar >= 20000){ 

     $url = "http://185.112.249.77:9999/Api/Search?search=&level=0&min=1&max=50&points=$pointsvar&loc=$locationvar"; 
     $jsondata = file_get_contents($url); 
     $data = json_decode($jsondata, true); 

     $in=$data['clanList']; 
     $results = $data['results']; //max is 64 
     $i = 0; 

     while($i + 1 <= $results){ 

      $clanid = $in[$i]['id']; 
      $clanname = mysqli_real_escape_string($con,$in[$i]['name']); 
      $clanplayerCount = $in[$i]['playerCount']; 
      $clanwarswon = $in[$i]['warsWon']; 
      $clanwarslost = $in[$i]['warsLost']; 
      $clanwarstied = $in[$i]['warsTied']; 
      $clanLocation = mysqli_real_escape_string($con,$in[$i]['clanLocation']); 
      $clanlevel = $in[$i]['level']; 
      $score = $in[$i]['score']; 

      $sql = "INSERT INTO activeclans(id, name, location, playercount, clanlevel, warswon, warslost, warstied, score) 
      VALUES('$clanid', '$clanname', '$clanLocation', '$clanplayerCount', '$clanlevel', '$clanwarswon', '$clanwarslost', '$clanwarstied', $score)"; 

      mysqli_query($con, $sql); 
      $i++; 
      $inserts++; 
     } 
     $pointsvar = $pointsvar-500; 
     sleep(1); 
    } 
    $locationvar++; 
    sleep(1); 
} 
echo "Inserted $inserts"; 
?> 

Когда я запускаю его я жду его, чтобы пройти через каждое место и в каждом месте я ожидаю, что это -500 от $pointsvar до тех пор, пока не достигнет 20000. Он работал до тех пор, пока я не перешел через каждое место в замкнутом цикле, и теперь он просто выдает Inserted 0

Я увеличил максимальное время выполнения, так как это может занять время автономной работы. Этот скрипт будет запускаться в cron каждый день или неделю.

Ожидаемый результат будет Inserted и очень очень очень большое число ..

Спасибо за любую помощь вы можете предоставить: D

+2

Какая отладка вы сделали. Если он говорит «Inserted 0», то он не входит в ваш третий цикл while. Проверьте, что ваши переменные возвращают то, что вы ожидаете от них, и что условия фактически проходят. –

+0

@JonStirling работает, когда у меня нет первого цикла while, и у меня просто устанавливается 'locationvar' ... И я уверен, что это правильно, поэтому я смущен. –

+0

Если он работал до того, как вы добавили цикл while ($ locationvar <= 32000260) {', тогда проблема должна быть в этом новом добавленном коде. Удалите его и проверьте, что код все еще работает, а затем снова добавьте петлю местоположения. – RiggsFolly

ответ

2

Используйте for петли вместо while петель, чтобы убедиться, что переменные инициализируются правильно каждый раз.

$inserts = 0; 
for ($locationvar = 32000006; $locationvar <= 32000260; $locationvar++){ 

    for ($pointsvar = 50000; $pointsvar >= 20000; $pointsvar -= 500){ 

     $url = "http://185.112.249.77:9999/Api/Search?search=&level=0&min=1&max=50&points=$pointsvar&loc=$locationvar"; 
     $jsondata = file_get_contents($url); 
     $data = json_decode($jsondata, true); 

     $in=$data['clanList']; 
     $results = $data['results']; //max is 64 

     for ($i = 0; $i < $results; $i++){ 

      $clanid = $in[$i]['id']; 
      $clanname = mysqli_real_escape_string($con,$in[$i]['name']); 
      $clanplayerCount = $in[$i]['playerCount']; 
      $clanwarswon = $in[$i]['warsWon']; 
      $clanwarslost = $in[$i]['warsLost']; 
      $clanwarstied = $in[$i]['warsTied']; 
      $clanLocation = mysqli_real_escape_string($con,$in[$i]['clanLocation']); 
      $clanlevel = $in[$i]['level']; 
      $score = $in[$i]['score']; 

      $sql = "INSERT INTO activeclans(id, name, location, playercount, clanlevel, warswon, warslost, warstied, score) 
        VALUES('$clanid', '$clanname', '$clanLocation', '$clanplayerCount', '$clanlevel', '$clanwarswon', '$clanwarslost', '$clanwarstied', $score)"; 

      mysqli_query($con, $sql); 
      $inserts++; 
     } 
     sleep(1); 
    } 
    sleep(1); 
} 
echo "Inserted $inserts"; 

Кроме того, может быть, внутренний цикл должен быть foreach ($data['clanList'] as $clan) - может количество родов в массиве clanList отличаться от $data['results']?

И вы можете ускорить INSERT запросов, вставив несколько строк с помощью одного запроса:

INSERT INTO tablename (columns...) VALUES (...), (...), (...), ... 

Так что в вашем скрипте, можно сцепить все значения во время цикла по кланам, а затем вставить эту партию в конец этого цикла. Таким образом, это будет выглядеть так:

 $values = array(); 
     for ($i = 0; $i < $results; $i++){ 

      $clanid = $in[$i]['id']; 
      $clanname = mysqli_real_escape_string($con,$in[$i]['name']); 
      $clanplayerCount = $in[$i]['playerCount']; 
      $clanwarswon = $in[$i]['warsWon']; 
      $clanwarslost = $in[$i]['warsLost']; 
      $clanwarstied = $in[$i]['warsTied']; 
      $clanLocation = mysqli_real_escape_string($con,$in[$i]['clanLocation']); 
      $clanlevel = $in[$i]['level']; 
      $score = $in[$i]['score']; 

      $values[] = "('$clanid', '$clanname', '$clanLocation', '$clanplayerCount', '$clanlevel', '$clanwarswon', '$clanwarslost', '$clanwarstied', $score)"; 
     } 
     $sql = "INSERT INTO activeclans(id, name, location, playercount, clanlevel, warswon, warslost, warstied, score) 
       VALUES " . implode(', ', $values); 
     mysqli_query($con, $sql); 
     $inserts += count($values); 
+0

гораздо более читабельны и не нужно беспокоиться о условиях реселлинга или бесконечных циклах. – DarkBee

+0

Не понимаю, что вы имеете в виду о запросах, хотя это выглядит интересно. Ухаживать за расширением? :) –

+0

И нет, '$ data ['results'];' такое же, как количество кланов в 'clanList' –

0

Вы не сброс $pointsvar = 50000;, когда второй цикл завершается. Я ожидал бы, что второй цикл, следовательно, будет работать только в первый раз по внешнему циклу. Так

<?php 
ini_set('max_execution_time', 0); 
include("../includes/mysqli.php"); 
$pointsvar = 50000; 
$inserts = 0; 
$locationvar = 32000006; 

while($locationvar <= 32000260){ 

    while($pointsvar >= 20000){ 

     $url = "http://185.112.249.77:9999/Api/Search?search=&level=0&min=1&max=50&points=$pointsvar&loc=$locationvar"; 
     $jsondata = file_get_contents($url); 
     $data = json_decode($jsondata, true); 

     $in=$data['clanList']; 
     $results = $data['results']; //max is 64 
     $i = 0; 

     while($i + 1 <= $results){ 

      $clanid = $in[$i]['id']; 
      $clanname = mysqli_real_escape_string($con,$in[$i]['name']); 
      $clanplayerCount = $in[$i]['playerCount']; 
      $clanwarswon = $in[$i]['warsWon']; 
      $clanwarslost = $in[$i]['warsLost']; 
      $clanwarstied = $in[$i]['warsTied']; 
      $clanLocation = mysqli_real_escape_string($con,$in[$i]['clanLocation']); 
      $clanlevel = $in[$i]['level']; 
      $score = $in[$i]['score']; 

      $sql = "INSERT INTO activeclans(id, name, location, playercount, clanlevel, warswon, warslost, warstied, score) 
      VALUES('$clanid', '$clanname', '$clanLocation', '$clanplayerCount', '$clanlevel', '$clanwarswon', '$clanwarslost', '$clanwarstied', $score)"; 

      mysqli_query($con, $sql); 
      $i++; 
      $inserts++; 
     } 
     $pointsvar = $pointsvar-500; 
     sleep(1); 
    } 
    $locationvar++; 

    // RESET The pointsvar counter 
    $pointsvar = 50000; 

    sleep(1); 
} 
echo "Inserted $inserts"; 
?> 
Смежные вопросы