2017-01-15 7 views
0

私はSQLクエリに対して簡単なfputcsvコマンドを使用しています。しかし、時には私の輸出にはより多くの行と異なる主キーがあります。私の願いは、新しい主キーを持つすべての結果を新しいCSVエクスポートに分割することです。fputcsvを使用してSQLクエリのエクスポートを分割する方法

例:

| *row 1 | row 2 | row 3 | 
|.......27 |......45 |......aa | 
|.......27 |......35 |......ab | 
|.......28 |......85 |......bb | 
|.......28 |......65 |......bc | 

実態:行1は、主キー(ORDER_ID)を有しています。私はすべての命令で毎日cronjobを実行します。したがって、ファイルには複数のオーダーがあります(上記の例では、オーダー27、オーダー28など)。私のサプライヤは、各注文にcsvファイルが必要です。ですから、 "order_idが違うと、新しいファイルを作成するなどのように、クエリを分割するコードが必要です。これは可能ですか?

<?php 
$servername = "Jarvis"; 
$username = "TonyStark"; 
$password = "iLoveIronMan"; 
$dbname = "TheAnvengers"; 

$conn = new mysqli($servername, $username, $password, $dbname); 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "SELECT o.order_id, o.customer_id, op.quantity, op.model FROM oc_order o INNER JOIN oc_order_product op ON o.order_id = op.order_id INNER JOIN oc_product p ON op.product_id = p.product_id WHERE o.order_status_id = 2 AND p.location = 1 ORDER BY o.order_id, op.model"; 

$file = fopen('../files/in/filename.csv', 'w'); 
if ($rows = mysqli_query($conn, $sql)) { 
    while ($row = mysqli_fetch_assoc($rows)) { 
     fputcsv($file, $row, ';'); 
    } 
    mysqli_free_result($rows); 
} 
mysqli_close($conn); 
fclose($file); 
?> 
+0

コードははっきりしていますが、あなたが達成しようとしているもの、たとえばSQL結果の例とそれから抜け出したいCSVファイルのように、明示的に記述してください。 –

+0

ありがとうございます。上記の元の投稿を完了;-) – 27eleven

答えて

1
<?php 
// connect to the database 
$servername = "Jarvis"; 
$username = "TonyStark"; 
$password = "iLoveIronMan"; 
$dbname = "TheAnvengers"; 

$conn = new mysqli($servername, $username, $password, $dbname); 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

// Get the data 
$sql = "SELECT o.order_id, o.customer_id, op.quantity, op.model FROM oc_order o INNER JOIN oc_order_product op ON o.order_id = op.order_id INNER JOIN oc_product p ON op.product_id = p.product_id WHERE o.order_status_id = 2 AND p.location = 1 ORDER BY o.order_id, op.model"; 

$orders = array(); // For storing the data by order_id 

// Loop through the result set and populate $orders 
if ($rows = mysqli_query($conn, $sql)) { 
    while ($row = mysqli_fetch_assoc($rows)) { 

     // This is where the split on order_id occurs 
     $orders[$row['order_id']][] = $row; 

     /* 
      $orders will now look like this after the first iteration 
      $orders = array(
       27 => array(
        0 => array(
         'order_id' => 27, 
         'customer_id' => 45, 
         'quantity' => aa, 
         'model' => someModel 
        ) 
       ) 
      ); 

      ============================== 

      $orders will look like this after the last iteration 
      $orders = array(
       27 => array(
        0 => array(
         'order_id' => 27, 
         'customer_id' => 45, 
         'quantity' => aa, 
         'model' => someModel 
        ), 
        1 => array(
         'order_id' => 27, 
         'customer_id' => 35, 
         'quantity' => ab, 
         'model' => someModel 
       ), 
       28 => array(
        0 => array(
         'order_id' => 28, 
         'customer_id' => 85, 
         'quantity' => bb, 
         'model' => someModel 
        ), 
        1 => array(
         'order_id' => 28, 
         'customer_id' => 65, 
         'quantity' => bc, 
         'model' => someModel 
       ) 

      ); 


     */ 

    } 
    mysqli_free_result($rows); 
} 
mysqli_close($conn); 

// Loop through $orders (by order_id) 
foreach($orders as $id => $order) 
{ 
    // Open the file for writing, blanking existing file or creating if non-existent - name it after the order_id 
    $f = fopen('../files/in/' . $id . '.csv', 'w'); 

    // Loop through each $row for that particular order_id and put it into the csv 
    foreach($order as $entry) 
    { 
     fputcsv($f, $entry, ';'); 
    } 

    fclose($f); 
} 

?> 
+0

あなたは私を冗談していますか?これは私の2つの問題の解決策です!どうもありがとうございました。できます。あなたの答えを理解するためにのみ:order_idによって結果を分割する部分はどこですか? – 27eleven

0

理由だけではなく、ファイル名として使用ORDER_IDループにfopenfcloseを移動し、追加モードで動作するようにfopenを変更しません。

+0

ありがとうございます。私はすでにこの願いの投稿をhttp://stackoverflow.com/questions/41666174/php-sql-value-as-filenameに持っています。しかし、これは私の問題を解決しません。サプライヤは、各注文ごとに別々のCSVを必要とし、データベースは同じリストに多くの注文を持ちます。 – 27eleven

関連する問題