2017-03-09 2 views
1

データベースをループして100行しか処理しない場合は、RAMを使い果たしてしまいます。複数のSQLクエリーをループする?

しかし私の問題は、私のスクリプトが開始と終了の制限を増やさない理由はわかりません。ですから、私は1回のリターンしか得られず、開始と終了のリミットを+100ずつ増やしてデータベースをループさせません。

私の失敗は誰にも見えますか?

$count_values = mysqli_num_rows($values_gk); 
$count_values = intval($count_values); 
$myfile = fopen("httpdocs/wp_all_import.txt", "a"); 

if($values_gk === FALSE){ 
    fwrite($myfile, "SQL Error\n"); 
} 

$start = -100; 
$end = 0; 

do{ 
$start = $start + 100; 
$end = $end + 100; 

if($end > $count_values){ 
    $end = $count_values; 
} 

$values_gkw = $database_gk->query("SELECT `ID` FROM `fWR6qIN_posts` where post_type = 'product' AND post_status = 'publish' limit $start, $end"); 

fwrite($myfile, "Entered 1. While Loop\n"); 

while($row = $values_gkw->fetch_assoc()){ 

    if($row["ID"] != null){ 
     //do something with the values 
     //code removed to reduce the text here 
    } 
} 

fwrite($myfile, "\n+++ Start: " .$start. " Limit: " .$end. " +++\n\n"); 

} while ($end <= $count_values); 

カウント値:(すべての行の量を取得するために無制限に確認してください)

$values_gk = $database_gk->query("SELECT `ID` FROM `fWR6qIN_posts` where post_type = 'product' AND post_status = 'publish'"); 
$count_values = mysqli_num_rows($values_gk); 
$count_values = intval($count_values); 

挨拶とありがとうございました!

+2

「100行しか処理しないと、RAMが使い果たされる」 。 。もっと教えてください。これは1980年ではありません。 –

+0

このコードは問題ありません。どの値に '$ count_values'が格納されていますか? –

+0

'$ end> $ count_value'の場合に問題が発生します。次に、 '$ end'を' $ count_value'に設定します。しかし、あなたのdo-whileループは '$ end <= $ count_values'の間にループします。あなたがそれらを等しく設定してから本当です。 **無限ループ**が発生します。 – kaldoran

答えて

0

制限構文はLIMIT offset, count NOT LIMIT offset_start, offset_endです。 ループの最初の反復では100の行が選択されますが、2番目の反復では$end = 200、3番目の反復では300行というように、ループの2番目の反復で200行が選択されます。

そして、kalrodanによって指定されたコードは、無限ループを生成します。

コードでいくつかの修正を加えました。これを試してみてください:

$start = -100; 
$limit = 100;//constant never changes 
$count = 0; 
do{ 
    $start = $start + 100; 
    $count = $count + 100;//see changes here 

    if($count > $count_values){//see changes here 
     $limit = $count_values - $start;//see changes here 
    } 

    $values_gkw = $database_gk->query("SELECT `ID` FROM `fWR6qIN_posts` where post_type = 'product' AND post_status = 'publish' limit $start, $limit");//$start, $limit here 

    fwrite($myfile, "Entered 1. While Loop\n"); 

    while($row = $values_gkw->fetch_assoc()){ 

     if($row["ID"] != null){ 
      //do something with the values 
      //code removed to reduce the text here 
     } 
    } 

    fwrite($myfile, "\n+++ Start: " .$start. " Limit: " .$end. " +++\n\n"); 

} while ($count < $count_values);//condition change here too 
+0

私はまだ無限ループに終わります。彼はちょうど続けるがもちろん、選択するものはない。しかし、私は失敗を得ることはありませんか? – ThisIsDon

+0

@ThisIsDonこの正確なコードをローカルデータベースでテストしたところ、うまくいきました。私がちょっと警告するのは、 '$ end'を削除したが' fwrite'行から削除するのを忘れてしまったので '$ end'が' fwrite'行に定義されていないということです。そして、まったく同じコードを使用していることを確認してください。do-whileループの状態も変更することを忘れないでください。私は多くの場所で修正を加えたので、コード全体をコピーして試してみてください。 – Zeus

関連する問題