2011-12-15 5 views
1

У меня есть таблица, которая показывает некоторые данные mysql, каждая запись имеет флажок для выбора отдельных записей, теперь я хочу иметь возможность экспортировать выбранные записи в файл xml или txt , я пробовал это:Экспорт mysql в txt/xml файл и загрузка его

<?php 
if ($_POST['exporttxt']) { 
    for ($i = 0; $i < count($_POST['checkbox']); $i++) { 
     $export_id = $checkbox[$i]; 

     $sql = "SELECT * FROM table WHERE id='$export_id'"; 
     $result = mysql_query($sql); 
    } 


    $output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n"; 
    if ($result->num_rows > 0) { 
     while ($myrow = $result->fetch_assoc()) 
     { 
      $output .= "\t<row>\n"; 
      foreach ($myrow as $_name => $_value) 
      { 
       $output .= "\t\t<$_name>$_value</$_name>\n"; 
      } 
      $output .= "\t</row>\n"; 
     } 
    } 
    $output .= "</root>"; 
} 

header('content-type: text/xml'); 
header('content-disposition: attachment; filename=data_export.xml'); 
echo $output; 
exit; 

?> 

Но это вообще не сработало, никаких намеков?

Я изменил код немного, я теперь использую это

<?php 
if ($_POST['exporttxt']) { 
for($i=0;$i<count($_POST['checkbox']);$i++){ 
    $export_id = $checkbox[$i]; 
$text = mysql_query("SELECT code FROM ticket WHERE id='$export_id'"); 
$text = mysql_fetch_assoc($text); 
$text = $text["code"]; 

ob_end_flush(); 
header("Content-type: text/plain"); 
header("Content-disposition: attachment;filename=\"filename.txt\""); 
    header("Content-Type: application/force-download"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Type: application/download"); 
    header("Content-Description: File Transfer"); 
    header("Content-Length: ".strlen($output).";\n"); 



echo($text); 


} 
} 


?> 

я теперь получить надлежащий выход на моем экране, но он не будет предлагать мне скачать файл?

+0

Как не работает? – Repox

+0

вы можете эхо $ export_id, чтобы убедиться, что вы попадаете в цикл. Кроме того, это не очень хорошая идея для count в аргументах for. Установите $ count = count ($ _ POST ['checkbox']) перед циклом for вы получите лучшую производительность. – Robert

+0

echoing $ export_id работает - отчасти, он показывает идентификаторы из отмеченных флажков, хотя только 1, почему это так? но кроме этого, если я выберу ID 305, например, и нажмите «Отправить», он отобразит «305», так что это должно быть хорошо? – user990767

ответ

1

Ваш исходный код был запрашивая каждый из checkboxed идентификаторов в отдельности (долгий и трудоемкий способ справиться с этим) и пытается сбросить результаты отдельно для каждого (не будет хорошо работать для вас).

Попробуйте это. (Примечание: проверялось, но должно дать вам хорошую отправную точку для разработки.)

if($_POST['exporttxt']){ 

    if(count($_POST['checkbox'])>0){ 

    // If the checkbox values are meant to all be integers, you might want to perform some validation/sanitisation/filtering here 
    // Up to you to do that 

    // Collapse the IDs from the checkboxes into a comma-delimited string 
    $export_ids = implode(',' , $_POST['checkbox']); 

    // Template the SQL Query 
    $sqlTpl = 'SELECT code FROM ticket WHERE id IN (%s)'; 
    // Compile the SQL Query String 
    $sqlStr = sprintf($sqlTpl , $export_ids); 

    // Execute the SQL Query 
    if(!($sqlRes = mysql_query($sqlStr))){ 
     // SQL Error - Log it, Handle it 
    }elseif(mysql_num_rows($sqlRes)==0) { 
     // No Rows Returned - Log it, Handle it 
    }else{ 
     // We have results - process them 
     $text = array(); 
     while($r = mysql_fetch_assoc($sqlRes)){ 
     // Looping through the returned rows, adding them to the $text array 
     $text[] = $r['code']; 
     } 
     // Collapse the $text array down into a normal string, with one element per line 
     $output = implode("\n" , $text); 

     // Output Handling from @narcisradu's answer 
     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private",false); 
     header("Content-Transfer-Encoding: binary;\n"); 
     header("Content-Disposition: attachment; filename=\"filename.txt\";\n"); 
     header("Content-Type: application/force-download"); 
     header("Content-Type: application/octet-stream"); 
     header("Content-Type: application/download"); 
     header("Content-Description: File Transfer"); 
     header("Content-Length: ".strlen($output).";\n"); 
     echo $output; 

     die; // Prevent any further output 
    } 

    }else{ 
    // No Checkboxes Checked 
    echo 'You must select one or more checkboxes to export something, muppet.'; 
    } 

} 
0

Прежде всего:

for($i=0;$i<count($_POST['checkbox']);$i++){ 
$export_id = $checkbox[$i]; 

$sql = "SELECT * FROM table WHERE id='$export_id'"; 
$result = mysql_query($sql);} 

Этот фрагмент кода будет на самом деле сделать запрос для каждого элемента в _POST [ «Флажок»] массив, но тогда вы используете результат последнего запроса, и вы не анализируя результат каждого запроса.

Пожалуйста, убедитесь, что сгенерированный XML хорошо сформирован, и на самом деле у вас есть некоторые данные, отображая их непосредственно в браузере.

После этого вы можете попытаться заставить скачать:

header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header("Content-Transfer-Encoding: binary;\n"); 
    header("Content-Disposition: attachment; filename=\"".urlencode(basename($file_name))."\";\n"); 
    header("Content-Type: application/force-download"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Type: application/download"); 
    header("Content-Description: File Transfer"); 
    header("Content-Length: ".strlen($output).";\n"); 
    ob_end_flush(); 
+0

Я вообще не получаю никакого вывода - повторяю $ output, я использую почти тот же запрос для обновления значений, также с флажками, там он работает нормально, я не понимаю, в чем проблема? – user990767

+0

используйте var_dump, чтобы проверить свои переменные и посмотреть, где ошибка. Для первой части моего ответа: вопрос не является проблемой, проблема в том, что вы выполняете запрос для каждого флажка, и вы переопределяете переменную $ result, так что вы фактически получите только результат последнего запроса в цикле. –

+0

Не могли бы вы проверить мой первоначальный вопрос, я отредактировал его с помощью кода, который я использую сейчас, теперь это работает, также со всеми блоками выбора единственная проблема, с которой я сталкиваюсь, это то, что я не предлагаю загрузить файл, я также пробовал заголовки, отправленные, безрезультатно. я также был бы признателен, если бы вы могли сказать мне, как я могу получить разрывы строк между выводами. – user990767

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