2017-09-20 12 views
2

私はodbc_execを使用して2つの異なるクエリの結果を収集し、2つのクエリの情報を組み合わせたJSONファイルを作成する必要がある場所を作成しようとしているWebアプリケーションを持っています。(PHP)ODBC結果セットの破棄を防ぐ方法は?

(接続とクエリは省略) ...

$result = odbc_exec($c, $q); 
$result1 = odbc_exec($c, $q1); 
$resultRows = array(); 
$response = array(); 

while($row = odbc_fetch_array($result)) { 
    $tempResult = $result1; 
    $value = "0"; 
    $other = $row['FIELD']; 
    while($row1 = odbc_fetch_array($tempResult)) { 
     if($row['FIELD'] == $row1 ['FIELD']) { 
      $value = $row1['FIELD']; 
     } 
    } 
    if($value != "0") { 
     $resultRows[] = array('FIELD'=>$value, 'OTHER'=>$other); 
    } 
} 

$response['data'] = $resultRows; 

$fp = fopen('somefile.json', 'w'); 
fwrite($fp, json_encode($response)); 
fclose($fp); 

の下にこれに伴う問題は、それが通じ最初のループの後にネストされたwhileループに入る停止するということです。私はodbc_fetch_arrayが結果セットからデータを削除することを知っています。なぜ私は大きなループごとにリセットされる結果セットへの参照を作成しようとしましたが、それでも問題は解決しません。

すべての情報は非常に役立つでしょう!前もって感謝します!

+0

結果セットを一時的な値に割り当てることは、私がやっている方法でも結果セットをクリアしますか? –

+0

whileループの直前に結果セットの行数をチェックすると、常に同じ値が返されます。 –

答えて

1

$tempResult = $result1; は、元のオブジェクトへの参照によって、オブジェクトのディープコピー、単にコピーを作成していないので、後でodbc_fetch_array($tempResult)を呼び出すとき、それはあなたがしかのオブジェクトを持っていることを意味odbc_fetch_array($result1)と同じことは本当にです。したがって、その後のodbc_fetch_arrayへの呼び出しはどちらの変数でも使い果たされます。あなたは毎回オブジェクトをcloneすることができますが、もっと効率的なアプローチは、一度それを繰り返して値を配列に保存することだと思います。次に、ネストされたループの配列を再実行することができます。

$result = odbc_exec($c, $q); 
$result1 = odbc_exec($c, $q1); 
$resultRows = array(); 
$response = array(); 

// save this to a regular array for re-use later 
$innerQueryResult = array(); 
while($rowTemp = odbc_fetch_array($result1)) { 
    $innerQueryResult []= $rowTemp; 
} 

while($row = odbc_fetch_array($result)) { 
    $value = "0"; 
    $other = $row['FIELD']; 

    // iterate through the inner query result set 
    foreach ($innerQueryResult as $row1) { 
     if($row['FIELD'] == $row1 ['FIELD']) { 
      $value = $row1['FIELD']; 
     } 
    } 
    if($value != "0") { 
     $resultRows[] = array('FIELD'=>$value, 'OTHER'=>$other); 
    } 
} 

$response['data'] = $resultRows; 

$fp = fopen('somefile.json', 'w'); 
fwrite($fp, json_encode($response)); 
fclose($fp); 
+1

悪くない! Jeffに感謝します。私は説明もありがたいです。このような状況では助けになるだけでなく、私が似たようなことをしなければならない場合には、あまりにも多くの人がダウンしてしまいます。 –

関連する問題