Export an array in .csv using - php

I have a problem with my .csv. So I tried to generate a .csv from an array using php. In the view I have :
<form id="form_logistique" action="myroute" method="post">
<div class="form-group " style="float: left;">
<label class="control-label" for="" style="display: inline-block; padding-right: 20px;">Date min</label>
<input type="text" id="date_min" name="date_min.name" value="date_min" placeholder="Date min" class="form-control datepicker" />
</div>
<div class="form-group" style="float: left;padding-left: 20px;">
<label class="control-label" for="" style="display: inline-block; padding-right: 20px;">Date max</label>
<input type="text" id="date_max" name="date_max" value="{{ date_max" placeholder="Date max" class="form-control datepicker" />
</div>
<input type="submit" class="btn btn-primary" style="margin-top: 25px;margin-left: 20px;" value="Rechercher"></input>
<input type="submit" class="btn btn-succes" style="margin-top: 25px;margin-left: 20px;" name="export" value="Exporter"></input>
</form>
In php :
public function getLogistique()
{
$this->form_logistique = new Form\Form(
new Form\Field\Text('date_min', '', true),
new Form\Field\Text('date_max','',true),
);
$date_min = '';
$date_max = '';
if ($this->getRequest()->isPostMethod() && $this->form_logistique->bind($_POST)){
$date_min = $this->form_logistique->date_min->getValue();
$date_max = $this->form_logistique->date_max->getValue();
}
$interdit = array(";", ",", ":", "*", "/", "|", "?", '"', "<", ">", "!", "_", "#", "[", "]", "\\", "{", "}", "~");
$aGifts = Gain::getGiftForLogistique($date_min, $date_max, $statut);
foreach($aGifts as $gift){
$date = explode(' ', $gift['date_gain']);
$gift['ref_article'] = $gift['ref_article'];
$gift['nom'] = str_replace($interdit,"",$gift['nom']);
$gift['prenom'] = str_replace($interdit,"",$gift['prenom']);
$gift['pseudo'] = $gift['pseudo'];
$gift['numero'] = trim(str_replace(";",",",str_replace("\\"," ",$gift['numero'])));
$gift['rue'] = str_replace($interdit,"",$gift['rue']);
$gift['complement'] = str_replace($interdit,"",$gift['complement']);
$gift['code_postal'] = $gift['code_postal'];
$gift['ville'] = str_replace(";",",",str_replace("\\"," ",$gift['ville']));
$gift['pays'] = $gift['pays'];
$gift['email'] = Gain::getEmailByIdm($gift['pseudo']);
$gift['tel'] = str_replace(";",",",str_replace("\\"," ",$gift['tel']));
$gift['id_instant_gagnant'] = $gift['id_instant_gagnant'];
$gift['date_gain'] = $date[0];
$aFilterGifts[] = $gift;
}
$this->aFilterGifts = $aFilterGifts;
if (isset($_POST['export'])) {
$output = fopen('php://output', 'w');
$sFileName = 'Fichier_de_logistique.csv';
header('Content-Disposition: attachement; filename="' . $sFileName . '";');
header('Content-Type: application/download');
fwrite($output, "sep=;\n");
fputcsv($output, array(''Nom', 'Prenom'), ";");
foreach ($aFilterGifts as $value) {
fputcsv($output, $value, ";");
}
fpassthru($output);
fclose($output);
}
return $this->render('template/customer_service/member/logistique.twig');
}
The .csv is generated, but the problem is that after the array in .csv I have all content .html of page and I don't understand where is the problem.Please help me! Thx in advance

The problem problem lies here:
if (isset($_POST['export'])) {
$output = fopen('php://output', 'w');
$sFileName = 'Fichier_de_logistique.csv';
header('Content-Disposition: attachement; filename="' . $sFileName . '";');
header('Content-Type: application/download');
fwrite($output, "sep=;\n");
fputcsv($output, array('Nom', 'Prenom'), ";");
foreach ($aFilterGifts as $value) {
fputcsv($output, $value, ";");
}
fpassthru($output);
fclose($output);
}
return $this->render('template/customer_service/member/logistique.twig');
The function writes headers and the content of the CSV file to STDOUT (php://output), but then the whole circus goes on. This function returns content of a template to it's parent function and this probably renderes it to STDOUT as well (using echo, print or something else). The easiest thing to do here (but not the correct) would be to put die(); after fclose($output);:
if (isset($_POST['export'])) {
$output = fopen('php://output', 'w');
$sFileName = 'Fichier_de_logistique.csv';
header('Content-Disposition: attachement; filename="' . $sFileName . '";');
header('Content-Type: application/download');
fwrite($output, "sep=;\n");
fputcsv($output, array('Nom', 'Prenom'), ";");
foreach ($aFilterGifts as $value) {
fputcsv($output, $value, ";");
}
fpassthru($output);
fclose($output);
die();
}
return $this->render('template/customer_service/member/logistique.twig');
The correct way in my opinion is to create a new route and controller action for CSV exports, that has no HTML output.

Your question isn't very clear, but it may be you want to terminate the execution of the script after the fclose().

its because at some point in the code you may have echo or print something. A better approach would be to write the csv to a file. And then send that file as Content-Disposition: attachment. Like in the code below where file is the path of file.
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}

fputcsv($output, array(''Nom', 'Prenom'), ";");
typo here - double single quote before Nom.

Related

Php Textbox output is printing instead of downloading

This problem is different of the other question problem. That problem was about IF condition. But this problem, instead of downloading file, it is printing on next page. Please don't confuse this question with others.
I have wrote a script which download output of text box. This script works fine on local server, it download the file successfully but when I put script on live server, the download file does not work. When download output button is clicked, instead of downloading file the output of page is shown on next page.
See live script here: http://www.globalitsoft.net/scripts/test.php
Here is the code of script:
<?php
error_reporting(0);
$mytext = "";
$txt = preg_replace('/\n+/', "\n", trim($_POST['inputtext']));
$text = explode("\n", $txt);
$output = array();
if(isset($_POST["submit"]) || isset($_POST["download"]) ) {
for($i=0;$i<count($text);$i++) {
$output[] .= trim($text[$i]) . ' AAAAA'.PHP_EOL;
}
}
if(isset($_POST["download"]) ) {
ob_clean();
$filename = "file-name-" .date('mdY-His'). '.txt';
$handle = fopen('php://output', "w");
fwrite($handle, implode($output));
fclose($handle);
header('Content-Description: File Transfer');
header("Content-type: application/force-download");
header("Content-Type: application/octet-stream charset=utf-8");
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
header('Pragma: public');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen(implode($output)));
readfile($filename);
exit();
}
?>
<form method="POST" action="test.php">
<textarea name="inputtext" rows="10" cols="100" placeholder="Enter Any Text!" required><?php if(!empty($_POST["inputtext"])) { echo $_POST["inputtext"]; } ?></textarea>
<br><br>
<input type="submit" name="submit" value="Do it!">
<br><br>
<p>Output goes here. </p>
<textarea name="oputputtext" rows="10" cols="100" ><?php echo implode($output);?></textarea>
<input type="submit" name="download" value="Download Output">
</form>
This works for me:
$handle = fopen("file.txt", "w");
fwrite($handle, "text1.....");
fclose($handle);
header('Content-Type: application/octet-stream');
//You dont need to enclose the filename value in quotes
header('Content-Disposition: attachment; filename='.basename('file.txt'));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');
exit;

PHP Download Button Not Working Generate Empty File

I have two button in the form, one is to submit and second button download the output shown in the textarea.
The submit works fine but download button create empty file and does not write data of output text area.
Here is code:
<?php
error_reporting(0);
$mytext = "";
$txt = preg_replace('/\n+/', "\n", trim($_POST['inputtext']));
$text = explode("\n", $txt);
$output = array();
if(isset($_POST["submit"]))
{
for($i=0;$i<count($text);$i++)
{
$output[] .= trim($text[$i]) . ' Text added with output'.PHP_EOL;
}
}
if(isset($_POST["download"]) ) {
$handle = fopen("file.txt", "w");
fwrite($handle, implode($output));
fclose($handle);
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment;filename='.basename('file.txt'));
header('Expires: 0');
ob_end_clean();
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');
exit;
}
?>
<form method="POST" action="test.php">
<textarea name="inputtext" rows="10" cols="100" placeholder="Enter Any Text!" required><?php if(!empty($_POST["inputtext"])) { echo $_POST["inputtext"]; } ?></textarea>
<br><br>
<input type="submit" name="submit" value="Do it!">
<br><br>
<p>Output goes here. </p><textarea name="oputputtext" rows="10" cols="100" ><?php echo implode($output);?></textarea>
<input type="submit" name="download" value="Download Output">
</form>
You have to generate the output also if downloading (unless you take it from the second textarea), so use if(isset($_POST["submit"]) || isset($_POST["download"]) ) in the test, instead of only if(isset($_POST["submit"]))
The final code would look like this:
<?php
error_reporting(0);
$mytext = "";
$txt = preg_replace('/\n+/', "\n", trim($_POST['inputtext']));
$text = explode("\n", $txt);
$output = array();
/* CHANGED HERE */
if(isset($_POST["submit"]) || isset($_POST["download"]) ) {
for($i=0;$i<count($text);$i++) {
$output[] .= trim($text[$i]) . ' Text added with output'.PHP_EOL;
}
}
if(isset($_POST["download"]) ) {
$handle = fopen("file.txt", "w");
fwrite($handle, implode("\r",$output));
fclose($handle);
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename('file.txt'));
header('Expires: 0');
ob_end_clean();
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');
exit;
}
?>
<form method="POST" action="test.php">
<textarea name="inputtext" rows="10" cols="100" placeholder="Enter Any Text!" required><?php if(!empty($_POST["inputtext"])) { echo $_POST["inputtext"]; } ?></textarea>
<br><br>
<input type="submit" name="submit" value="Do it!">
<br><br>
<p>Output goes here. </p>
<textarea name="oputputtext" rows="10" cols="100" ><?php echo implode($output);?></textarea>
<input type="submit" name="download" value="Download Output">
</form>

Mysql insert query runs many time on download after form submit

Mysql run more than once while i try to download with download manager.
if(isset($_POST["fname"]) && isset($_SESSION['token']) && $_POST["token"] == $_SESSION['token']){
// after submit it runs two times
$sql = "INSERT INTO testpage SET
username = 'test',
name = 'xyz'
";
if(!mysqli_query($db_conx, $sql)){
echo mysqli_error($db_conx);
exit;
}
$fullPath = 'user/pdf/xyz.pdf';//let the path is this
$basefile_name = "abcd" ;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($basefile_name.".pdf"));
header('Content-Transfer-Encoding: binary');
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache");
header('Expires: 0');
header('Content-Length: ' . filesize($fullPath));
ob_clean();
flush();
readfile($fullPath);
exit;
}
if (function_exists('mcrypt_create_iv')) {
$token = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
} else {
$token = bin2hex(openssl_random_pseudo_bytes(32));
}
$_SESSION['token'] = $token;
and the html part is
<div class="container">
<form method="post">
First name: <input type="text" name="fname"><br><br>
Last name: <input type="text" name="lname"><br>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="Submit">
</form>
</div>
Still have problen even after adding token where i am wrong .
thanx in advance . php mysql.

Export MySQL table to CSV with custom header

Why when i try to export MySql table to CSV with header('Content-Disposition:attachment; filename="'.$filename.'"'); It doesn't get done properly:
it does create the CSV file
however it does it on the beginning of the file, where the page code is
and after the code the is table content
This is the code witch exports it:
$this->view->table = $model->info('name');
$is_csv = $this->_getParam('csv');
if ($this->_request->isPost() && $is_csv) {
$fichier = 'file.csv';
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename="'.$fichier.'"');
$fp = fopen('php://output', 'w+');
$data = $model->fetchAll();
foreach ($data as $fields) {
fputcsv($fp, $fields->toArray());
}
fclose($fp);
}
And here i'm calling this with button:
<form method="post">
<input type="hidden" name="table" value="<?php echo $this->table ?>" />
<button type="submit" class="btn" name="csv" value="csv">
<?php echo Core_Locale::translate('CSV')?>
</button>
</form>
put this code up in your application then application create view.
I had same issue but i solved it this way..
i put peace of code to function/block and place it over echo or render html
put exit; on the end of function/block
if(isset($_POST['submit'])) {
$csv = new Csv();
$filename = $csv->generateFileDate();
if($filename !== false) {
$data = file_get_contents($csv->folder .'reports/'. $filename);
header('Content-Type: application/csv; charset=utf-8');
header('Content-Disposition: attachement;filename="'.$filename.'";');
echo $data;
exit;
}
}
?>
<!doctype html>
<html lang="us">
<head> .........
hope this help to you

Download document from sqlite through website

I have store a sample document inside my local server named template.doc. Then I store the file directory inside my sqlite table. I manage to call out the path of the file directory but how can I allow the user to download it?
Codes
<form id="List" name="List" method="post" action="">
<select name="List" id="List">
<?php
if ($Choice !="No")
{
$path = $_SERVER['DOCUMENT_ROOT']."/WEB/";
$fullPath = $path.$_GET['$Choice'];
echo "<form id=\"form7\" name=\"form7\" method=\"post\" action=\"\">";
echo "<input type=\"submit\" name=\"Download\" id=\"Download\" value=".$fullPath."/>";
if (file_exists($fullPath))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($fullPath));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($fullPath));
ob_clean();
flush();
readfile($fullPath);
echo "<label>".$fullPath."</label>";
echo "<input type=\"submit\" name=\"Download\" id=\"Download\" value=".$fullPath."/>";
exit;
echo '</form>';
}
}
?>
How to create a button below the list form and download the microsoft word? It now flushes out the Microsoft word text on the website now, not on the button.
Kindly advise if it's possible to do it. Just for local testing. Thanks alot!
You can use readfile and set the appropriate headers to force a download.
Example from readfile domestication page:
<?php
$file = 'monkey.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
Your form should look something like this
<form name="download" action="download.php" method="post">
<input type="hidden" name="fileID" value="some file identifier" />
<input type="submit" name="submit" value="Download File" />
</form>
Then, in download.php
if(isset($_POST["submit"])) {
$file = $_POST['fileID'];
// download file
}

Categories