2012-01-06 10 views
0

私は私のプロジェクトで使用するためにカスタムデータベースクラスを構築していますに移動しmysql_fetch_assocメソッドを取得します。私は、whileループ内で呼び出すときしかし、それは次のレコードに移動していない、fetchAssoc()メソッドを構築しました。スクリプトがタイムアウトするまで、最初のレコードを繰り返し呼び出します。以下
は、関連するコードです:PHP MYSQLデータベースクラス - 次のレコード

方法:

function runQuery($q) 
{ 
    $this->numQueries++; 
    $this->query = ($q); 
    $this->setResult($q); 
    $this->result; 
} 

function fetchAssoc($q = NULL) 
{ 
    if($q == NULL) 
    { 
     $q = $this->query; 
    } 
    $this->setResult($q); 
    if($q == NULL || mysql_num_rows($this->result) < 1) 
    { 
     return NULL;  
    } 
    else 
    { 
     return mysql_fetch_assoc($this->result); 
    } 
} 
    function setResult($q = NULL) 
{ 
    if($q == NULL) 
    { 
     $q = $this->query; 
    } 
    if($q == NULL) 
    { 
     return FALSE; 
    } 
    else 
    { 
     $this->result = @mysql_query($q); 
    } 
} 

SCRIPT:

//runQuery -- Should run the query and store the Result and Query 
$q = "SELECT * FROM make ORDER BY make"; 
$db->runQuery($q); 

//fetchAssoc -- return current row of result set and move pointer ahead 
foreach($db->fetchAssoc() as $key => $value) 
{ 
echo $value." has a foreign key of: ".$key."<br />";  
} 
//Also tried 
while($row = fetchAssoc()) 
{ 
    echo $value." has a foreign key of: ".$key."<br />";  
} 
+0

私も試みます。while($行= fetchAssoc())が、それはあなたが 'setResult'方式を投稿することができ超えると – Stewie

+0

上で同じ結果を返しますか? –

+0

関数setResult($ Q = NULL) \t {\t \t場合($ Q == NULL) \t \t { \t \t \t $ Q =の$ this - >クエリ。 \t \t \t} \t \t($ Q == NULL) \t \t { \t \t \t戻りFALSEであれば、他\t \t \t} \t \t \t \t { \t \t \tの$ this - >結果= @mysql_query($のQ); \t \t \t \t – Stewie

答えて

2

あなたはfetchAssoc関数(呼び出すたびは、少なくともそれが何であるのクエリを実行しているためであります私はあなたのコードを見て、setResultがやっていると思います)。クエリがリセットされた後、配列から結果を取得して最初の関連付けを返します。それはあなたの結果の最初の関連が得られ続けるのでmax_execution時間に到達するまでのコードがループし続けて設定します。

fetchAssocは、私はあなたのコードが正しい理解すれば結果にthis->の戻りmysql_fetch_assoc、より多くの何もしてはなりません。

私はあなたのためにそれを打破します:コードの一部で

//first lines of fetchAssoc 
if($q == NULL) 
{ 
    $q = $this->query; 
} 

を、この機能を使用して$ qは常にます$ this->クエリであるので、あなたは何の$ qを渡しません。

次に、あなた自身のコメントに従って、setResultを呼び出して、クエリを実行し、this-> resultを設定します。ですから、fetchAssoc関数を呼び出す場合は、ます$ this->クエリが毎回実行され、その結果は、そのクエリ毎回のための結果に更新されます。 $ qはnullになることはありませんので

if($q == NULL || mysql_num_rows($this->result) < 1) 
{ 
    return NULL;  
} 
else 
{ 
    return mysql_fetch_assoc($this->result); 
} 

は、ここでの唯一のチェックがNUM_ROWSにあります(その場合、以前にそれに価値を与えました)。その場合、fetch_assocで$ this-> resultの最初の行を返します。これは、各呼び出しと同じようにクエリと結果を更新するので、常に同じ行です。

+0

私は、クエリを実際に変数に割り当てるときに実行されたとは思わなかった。実際にクエリを実行するには、 "またはdie()"を指定するか、if(!$ result)を呼び出す必要があると思いました。 – Stewie

+0

クエリへの関数呼び出しはクエリ実行のトリガーではありません。あなたが言及する2つのことは、クエリの実行が計画どおりに行かない場合に何かをするための構造です。 – hoppa

+0

あなたは正しいです。私は$ this-> setResult($ q)を取り出し、正常に動作しています。ありがとう。 – Stewie

関連する問題