2013-08-02 5 views
0

Я пытаюсь экспортировать запрос mysql в csv. У меня это работает, единственное, что это не помещение пустых полей. Я их разделяю по трубам, |. Мне нужно иметь возможность загружать запрос и загружать его в другое место, поэтому мне нужно экспортировать пустые поля вместе с ним. Вот мой текущий код экспорта:Экспорт MYSQL в CSV, оставляющий пустые поля

<?php 


$from = $_REQUEST['from']; 
$to = $_REQUEST['to']; 
$filename = "APGE_ELEC_" . $to; 
header('Content-Disposition: attachment; filename="'.$filename.'".csv"'); 

    $hostname = ""; //SET SERVER/HOSTNAME 
    $dbusername = ""; //SET DATABASE USERNAME 
    $dbname = ""; //SET DATABASE NAME 
    $dbpassword = ""; //SET DATABASE USERNAME 

$dbhandle = mysql_connect($hostname, $dbusername, $dbpassword) 
    or die("Unable to connect to MySQL"); 

$selected = mysql_select_db($dbname,$dbhandle) 
    or die("Could not select Data Base"); 


$query = "SELECT * FROM v88374 WHERE date >= DATE_FORMAT('" . $from . "', '%Y%m%d') AND date <= DATE_FORMAT('" . $to . "', '%Y%m%d')"; 


$export = mysql_query ($query) or die ("Sql error : " . mysql_error()); 

$fields = mysql_num_fields ($export); 

for ($i = 0; $i < $fields; $i++) 
{ 
    $header .= mysql_field_name($export , $i) ."|" . "\t"; 
} 

while($row = mysql_fetch_row($export)) 
{ 
    $line = ''; 
    foreach($row as $value) 
    {            
     if ((!isset($value)) || ($value == "")) 
     { 
      $value = "\t"; 
     } 
     else 
     { 
      $value = str_replace('"' , '""' , $value); 
      $value = $value . '|' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r" , "" , $data); 

if ($data == "") 
{ 
    $data = "\n(0) Records Found!\n"; 

} 

print "$header\n$data"; 


exit(); 


?> 

Я надеюсь, что это не огромная проблема. Я ценю любую помощь. Спасибо.

+0

Было бы намного проще использовать 'fputcsv', который позволит вам указать разделитель и затем записать csv в файл, который будет правильно отформатирован. Кроме того, функции mysql_ * устаревают и действительно должны переходить на «PDO» или «mysqli». – aynber

+0

Можете ли вы дать мне пример использования fputcsv? – dkeeper09

+0

Конечно, я добавлю это как ответ. – aynber

ответ

0

Я думаю, что ошибка находится здесь:

if ((!isset($value)) || ($value == "")) 
    { 
     $value = "\t"; 
    } 
    else 
    { 
     $value = str_replace('"' , '""' , $value); 
     $value = $value . '|' . "\t"; 
    } 
    $line .= $value; 

Когда значение $ пусто вы сделаете это вкладка и добавить его без трубы, материал в заявлении еще не выполняется.

Также у вас есть серьезная проблема с безопасностью с вашим запросом, поэтому, если она не предназначена только для личного использования и некоторая санитария для запроса.

$from = mysql_real_escape_string($_REQUEST['from']); 
$to = mysql_real_escape_string($_REQUEST['to']); 
1

Чтобы использовать fputcsv, попробуйте следующее:

$fp = fopen('your_file_name.csv','w'); 
fputcsv($fp,$fields,'|'); // add in your header row 
while($row = mysql_fetch_row($export)) 
{ 
    if($row != NULL) 
     fputcsv($fp,$row,'|'); // Each row is already an array, so you just need to export it here 
} 
fclose($fp); 
+0

Я получаю предупреждение: fputcsv() ожидает, что параметр 2 будет массивом. null данный. Что мне делать с заголовком $? – dkeeper09

+1

Я изменил заголовок на поля, так как именно там вы помещаете поля непосредственно из запроса. Интересно, что $ row является нулевым из цикла while. Я собираюсь настроить эту линию. – aynber

+0

Подойдя ближе, я думаю. Извините за все вопросы. если я изменю его на ваши изменения выше, он теперь загружается, а просто загружается. Мне пришлось остановить его на 50 МБ. Это странно? – dkeeper09

3

Почему бы не просто сделать

SELECT whatever 
FROM your_table 
INTO OUTFILE '/directory/file.csv' 
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 

?

И от manual:

... если клиентское программное обеспечение MySQL установлен на удаленном компьютере, вы можете вместо этого использовать команду клиента, такие как MySQL -e «SELECT ...»> имя_файла для генерации файла на клиентском хосте