2017-01-15 1 views
0

У меня есть простая команда fputcsv для моего SQL-запроса. Но иногда мой экспорт имеет больше строк и разных первичных ключей. Мое желание состоит в том, чтобы разделить каждый результат с другим первичным ключом на новый экспорт csv.Как разделить экспорт sql-запроса с fputcsv

Пример:

| *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

Вы что, шутите? Это решение для моих двух проблем! Большое спасибо. Оно работает. Только для понимания вашего ответа: где часть, которая разбивает результаты по order_id? – 27eleven

0

Почему бы просто не использовать order_id как имя файла, переместите fopen и fclose в петлю, и изменить fopen для работы в режиме добавления.

+0

Спасибо за ваше предложение. У меня уже есть сообщение с этим желанием http://stackoverflow.com/questions/41666174/php-sql-value-as-filename. Но это не решит мою проблему. Поставщику требуется для каждого заказа отдельный csv, и база данных имеет много заказов в том же списке. – 27eleven

Смежные вопросы