0

だからここに私がやっていることがあります。

  1. for ループで 1 行ずつ読み取ります。(共有ホスティングを使用しているため、一度にすべてを実行するとリソースが消費されるためです。) 2. 変数に適切なフィールド データを取得します。3.抽出されたフィールドに依存する必要なデータを操作します。4.filed=extracted data である新しいフィールドを更新します。

さらに、現在の位置をファイルに追加して、スクリプトが次に実行されるときにそこから続行できるようにします。

問題 : 機能していないようです。counter.txt は 3 ~ 4 のような値を取得しますが、そこに存在するだけです。私のデータベースには100万行ほどあります。

私のコード:

require ("dbconnect.php");
header("refresh:29;url=process.php"); // so it doesnt ever end. I cant use max_execution_time here for some reason.
$count = mysql_query("SELECT COUNT(*) FROM collection ");
$data = mysql_fetch_array($count);
$count = $data[0];
echo $count;

$countfile = fopen("counter.txt", "r");
$counter = fgets($countfile);
echo fgets($countfile);

while (fgets($countfile) <= $count)
 {
$i = fgets($countfile);
$takeword = mysql_query("SELECT word FROM collection WHERE id='$i'") or die();
$wd = mysql_fetch_array($takeword);
$data = $wd[0];

$d1 = hash($algorith='md2',$data);
$d2 = hash($algorith='md4',$data);



$write = mysql_query("UPDATE collection SET md2='$d1', md4='$d2' WHERE id='$i'") or die(mysql_error());

//opens, empties and write the new pointer to the file. closes, and open the file in readmode for the next read at the loop.
$counts = fopen("counter.txt", "w+");
fwrite($counts, $counter + 1);
fclose($counts);
$countfile = fopen("counter.txt", "r");
}

任意の助けをいただければ幸いです:)コードの最適化を探し、エラーを殺します。提案はそうするでしょう.:)

4

2 に答える 2

0

さて、私はこのようなことをしたいと思います(応答が遅れて申し訳ありません、私は忘れていました)

<?php
    //main execution
    $sql = mysql_connect(...);
    if (!$sql)
        die ("No database connection");

    if (!mysql_select_db(..., $sql))
        die ("Database does not exist in this schema");

    //Run the query for this iteration.
    processQuery();
    //---

    function getQueryOffset($file)
    {
        $offset = 0; //default offset
        if (file_exists($file)) //check if the counter file exists
        {
            $contents = file_get_contents($file); //get the contents of the counter
            if ($contents !== FALSE && is_numeric($contents)) //check if an appropriate counter value
                $offset = intval($contents);
        }
        return $offset;
    }

    function processQuery()
    {
        $table = "collection"; //table to update
        $counter = "counter.txt"; //where to look for the last execution's offset.
        $maxrows = 10000; //update 10,000 rows each time this file is loaded.
        $sql = $GLOBALS['sql'];

        //calculate the number of rows in the table
        $qCount = mysql_query("SELECT COUNT(*) max FROM $table", $sql);
        $aCount = mysql_fetch_assoc($qCount);
        mysql_free_result($qCount);
        $max = $aCount["max"];

        $offset = getQueryOffset($counter); //calculate the offset (or a default 0)
        if ($offset < $max) //if offet >= max, we're done.
        {
            $qUpdate = mysql_query("SELECT word, id FROM $table LIMIT $offset, $maxrows", $sql); //get the next "maxrows" rows from the table.
            if ($qUpdate) 
            {
                $assoc = NULL;
                while (($assoc = mysql_fetch_assoc($qUpdate)) != NULL)
                {
                    $md4 = hash("md4", $assoc["word"]); //calculate the hashes
                    $md2 = hash("md2", $assoc["word"]); 
                    $id = $assoc["id"]; //id the row
                    mysql_query("UPDATE $table SET md2='$md2', md4='$md4' WHERE id=$id", $sql); //update the table columns
                }
                //update the offset in the counter file.
                file_put_contents($counter, ($offset + mysql_num_rows($qUpdate)));
                mysql_free_result($qUpdate);
            }
        }
    }

    mysql_close($sql);
?>
于 2012-04-29T17:12:15.540 に答える
-1

私がここで見ている1つの問題:

更新クエリを確認してください-それは間違っているようです。私によると、「SET md2 ='$ d1' AND md4='$d2'」である必要があります

私がよくわからない別の問題:

md2とmd4がハッシュアルゴリズムの有効な名前であるかどうかはわかりません

これを行うためのより良い方法:1。ファイルに書き込まないでください!2. SQLに「status」という名前で追加の列を作成します。デフォルト値は0です。更新時に、その値を1に変更します。3。クエリ「SELECTword FROM collection WHERE status =0limit」に基づいて編集する行を検索します。 0,1 "4.または、元のテーブルの列md2およびmd4が空の場合、クエリは" SELECT word FROM collection WHERE md2 ='' and md4 =''limit0,1"にすることもできます。

お役に立てれば。

于 2012-04-18T09:29:36.880 に答える