2016-07-05 10 views
0

基本的に私はダウンロードする前にメモリとZIPに異なるcsvファイル(テーブルあたり1つのcsvファイル)を生成するプロジェクト用のダウンロードボタンを作成します。それはうまく動作しますが、問題は、データベースに格納されている数に応じて行を返すはずの各mysql_fetch_arrayで1行(最終結果)しか得られないということです。このコードは償却されています。申し訳ありません。事前にmysql_fetch_arrayはクエリの最後の値を返すだけです

<?php 

require("../includes/connection.php"); 
require("../includes/myLib.php"); 
//get the ID that is passed 
$ID = $_REQUEST['q']; 
$ID = xdec($ID); 

//All queries to fetch data 
$query = mysql_query("SELECT * FROM `ge2`.`projects` WHERE `projects`.`proj_id`='$ID'"); 
$query2 = mysql_query("SELECT * FROM `ge2`.`attributes` WHERE `attributes`.`proj_id`='$ID'"); 
$query3 = mysql_query("SELECT * FROM `ge2`.`category` WHERE `category`.`proj_id`='$ID'"); 
$query4 = mysql_query("SELECT * FROM `ge2`.`multipletarget` WHERE `multipletarget`.`proj_id`='$ID'"); 
$query5 = mysql_query("SELECT * FROM `ge2`.`data_cut` WHERE `data_cut`.`proj_id`='$ID'"); 
$query6 = mysql_query("SELECT * FROM `ge2`.`raw` WHERE `raw`.`proj_id`='$ID'"); 

//getting all array 
    while($row = mysql_fetch_array($query)){ 

      $proj_alias = $row['proj_alias']; 
      $proj_id = $row['proj_id']; 
      $date_added = $row['date_added'];   
    } 

    while($row1 = mysql_fetch_array($query2)){ 

      $attrib_param_id = $row1['param_id']; 
      $attrib_proj_id = $row1['proj_id']; 
      $attrib_cat_id = $row1['cat_id']; 
      $attrib_val_id = $row1['val_id']; 
      $attrib_name = $row1['name']; 
      $attrib_isCust = $row1['isCust'];   
     } 

    while($row2 = mysql_fetch_array($query3)){ 

      $category_cat_id = $row2['cat_id']; 
      $category_name = $row2['name']; 
      $category_proj_id = $row2['proj_id']; 
      $category_desc = $row2['desc']; 
     } 
     while($row3 = mysql_fetch_array($query4)){ 

      $multipletarget_id = $row3['id']; 
      $multipletarget_proj_id = $row3['proj_id']; 
      $multipletarget_mtarget1 = $row3['mtarget1']; 
      $multipletarget_mtarget2 = $row3['mtarget2']; 
     } 
    while($row4 = mysql_fetch_array($query5)){ 

      $data_cut_id = $row4['id']; 
      $data_cut_proj_id = $row4['proj_id']; 
      $data_cut_name = $row4['name']; 
      $data_cut_param = $row4['param']; 
      $data_cut_lvl = $row4['lvl']; 
      $data_cut_val = $row4['val']; 
     } 

    while($row5 = mysql_fetch_array($query6)){ 

      $raw_id = $row5['raw_id']; 
      $raw_proj_id = $row5['proj_id']; 
      $raw_p_id = $row5['p_id']; 
      $raw_url = $row5['url']; 
      $raw_ip = $row5['ip']; 
      $raw_pos = $row5['pos']; 
      $raw_datetaken = $row5['datetaken']; 
      $raw_used = $row5['used']; 
      $raw_fdc_id = $row5['fdc_id']; 
      $raw_dq = $row5['dq']; 
     } 



     // some data to be used in the csv files 
     $records = array(
      $proj_alias, $proj_id, $date_added 
     ); 
     $records2 = array(
      $attrib_param_id, $attrib_proj_id, $attrib_cat_id, $attrib_val_id, $attrib_name, $attrib_isCust 
     ); 

     $records3 = array(
      $category_cat_id, $category_name, $category_proj_id, $category_desc 
     ); 
     $records4 = array(
      $multipletarget_id, $multipletarget_proj_id, $multipletarget_mtarget1, $multipletarget_mtarget2 
     ); 
     $records5 = array(
      $data_cut_id, $data_cut_proj_id, $data_cut_name, $data_cut_param,$data_cut_lvl,$data_cut_val 
     ); 
     $records6 = array(
      $raw_id, $raw_proj_id, $raw_p_id, $raw_url,$raw_ip,$raw_pos,$raw_datetaken,$raw_used,$raw_fdc_id,$raw_dq 
     ); 
//making an array to be used in loop  
     $set = array($records,$records2,$records3,$records4,$records5,$records6); 
//names to be named for each csv file  
     $names = array('projects', 'attributes', 'category', 'multipletarget', 'data_cut', 'raw'); 

     // create zip file 
     $zipname = $proj_alias; 
     $zip = new ZipArchive; 
     $zip->open($zipname, ZipArchive::CREATE); 

     // loop to create csv files 
     $n = 0; 
     foreach ($set as $setk=>$sets) { 
     $n+= 1; 
      $fd = fopen('php://temp/maxmemory:1048576', 'w'); 
      if (false === $fd) { 
       die('Failed to create temporary file'); 
      } 

       fputcsv($fd, $sets); 

      // return to the start of the stream 
      rewind($fd); 

      // add the in-memory file to the archive, giving a name 
      $zip->addFromString('BrainLink-'.$proj_alias."-".$names[$setk].'.csv', stream_get_contents($fd)); 
      //close the file 
      fclose($fd); 
     } 
     // close the archive 
     $zip->close(); 


     header('Content-Type: application/zip'); 
     header('Content-disposition: attachment; filename='.$zipname.'.zip'); 
     header('Content-Length: ' . filesize($zipname)); 
     readfile($zipname); 

     // remove the zip archive 
     // you could also use the temp file method above for this. 
     unlink($zipname); 
     ?> 

ありがとう:

は、ここに私のコードです。

答えて

0

まあ、あなたは、すべてのクエリ結果を独立して繰り返し、変数を何度も上書きしているようです。だから最後には、最後のテーブルの結果しか使えません。

あなたは一つの大きなクエリ結果の行のすべてのアイテムを取得するためにMySQLでJOIN OR UNION SELECTを使用してみてください:

$query = mysql_query('SELECT proj.*, attrs.* 
FROM `projects` AS proj 
JOIN `attributes` AS attrs ON (attrs.project_id=proj.project_id) 
<..more tables to join in the same manner..> 
WHERE proj.`proj_id`= ' . $projectId); 

そして、あなただけの唯一の単一のクエリのリソースを反復処理する必要があります。

while ($row = mysql_fetch_array($query)) { 
//your code here 
} 

JOIN「EDというテーブルが同じカラム名を持っている場合、彼らはお互いを 『上書き』になると、あなたが 『オンザフライ』で彼らに自分の名前を変更する必要がありますことに注意してください。そのよう

SELECT proj.field, proj.another_field, proj.conflicting_field_name AS unique_field_name 
0

私はあなたのコードのすべてを読んでいないが、各whileループでは、あなただけの最後のレコードを保存します。それはこのようなものでなければなりません。

while($row = mysql_fetch_array($query)){ 

      $proj_alias[] = $row['proj_alias']; 
      $proj_id[] = $row['proj_id']; 
      $date_added[] = $row['date_added'];   
    } 

および上記の他のもの。

+0

私は試してみましたが、csv出力ファイルの "array"を表示します。 –

+0

@AlexCheddar、もちろん、今は配列です。 '$ proj_alias []'、 '$ attrib_param_id []' ...を配列として使用し、残りのコードを変更する必要があります。 あなたの質問に答えました。「mysql_fetch_arrayはクエリの最後の値を返すだけです。私はあなたに手がかりを与えました。 – Amir

関連する問題