Jump to content

Recommended Posts

I have a database CSV export working fine, but I want the user to be able to select a date range (date created) for the export process.

Here is my HTML part for the date select (format of date on the form is mm/dd/yyyy):

<form action="csv_export_arp.php">
<p>Select a date range from </p><label style="color:#FFF;" for="from">From</label>
<input type="text" id="from" name="from" value="from" />
<label style="color:#FFF;" for="to" >to</label>
<input type="text" id="to" name="to" value="to"/>
<input name="export" type="submit" value="Export Pending ARP CSV" />
</form>

My CSV export which works apart from the date range (two different files for script:

 

Part 1 (connect ot db)

<?php

$host = 'xxxxx'; // MYSQL database host adress
$db = 'wxxxxx'; // MYSQL database name
$user = 'xxxxx'; // Mysql Datbase user
$pass = 'xxxxxx'; // Mysql Datbase password
$from_data = $_POST['from']; //Should be sanitized before use in the query, or use PDO.
$to_data   = $_POST['to']; //Should be sanitized before use in the query, or use PDO. 
// Connect to the database
$link = mysql_connect($host, $user, $pass);
mysql_select_db($db);

require 'scripts/exportcsv_arp.inc.php';

$table="support_users"; // this is the tablename that you want to export to csv from mysql.

exportMysqlToCsv($table);

?>

Part two(exportcsv_arp.inc.php):

<?php
function exportMysqlToCsv($table,$filename = 'export_arp.csv')
{
$csv_terminated = "\n";
$csv_separator = ",";
$csv_enclosed = '"';
$csv_escaped = "\\";
$sql_query = "SELECT ticket_number AS 'Ticket number', first_name AS 'First name', surname AS 'Last name', 
email AS 'Email address', product AS 'Product', retailer AS 'Retailer', dop AS 'Date of purchase', message AS
 'Message', address AS 'Postal address', DATE_FORMAT(created, '%m/%d/%Y') AS 'Date created', status AS 'Status', 
action AS 'Action', comment AS 'Comment', resolution AS 'Resolution' FROM $table WHERE status='Pending ARP' 
created >= DATE_FORMAT('" . $from_data . "', '%d/%m/%Y') AND created <  DATE_FORMAT('" . $to_data . "', '%d/%m/%Y')" ;
// Gets the data from the database
$result = mysql_query($sql_query);
$fields_cnt = mysql_num_fields($result);
$schema_insert = '';
for ($i = 0; $i < $fields_cnt; $i++)
{
    $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed,
        stripslashes(mysql_field_name($result, $i))) . $csv_enclosed;
    $schema_insert .= $l;
    $schema_insert .= $csv_separator;
} // end for
$out = trim(substr($schema_insert, 0, -1));
$out .= $csv_terminated;
// Format the data
while ($row = mysql_fetch_array($result))
{
    $schema_insert = '';
    for ($j = 0; $j < $fields_cnt; $j++)
    {
        if ($row[$j] == '0' || $row[$j] != '')
        {
            if ($csv_enclosed == '')
            {
                $schema_insert .= $row[$j];
            } else
            {
                $schema_insert .= $csv_enclosed .
                str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed;
            }
        } else
        {
            $schema_insert .= '';
        }
        if ($j < $fields_cnt - 1)
        {
            $schema_insert .= $csv_separator;
        }
    } // end for
    $out .= $schema_insert;
    $out .= $csv_terminated;
} // end while
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Length: " . strlen($out));
// Output to browser with appropriate mime type, you choose 
//header("Content-type: text/x-csv");
//header("Content-type: text/csv");
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$filename");
echo $out;
exit;
 }
 ?>

I can't figure out how to get the query to link in with the selected date range from my form (at the top), I feel this is the important line of my csv export script and this is what I tried, probably quite a way off with it  (if the date range query part is removed, the CSV export works fine with the right staus only (pending arp) exported):

 FROM $table WHERE status='Pending ARP' created >= DATE_FORMAT('" . $from_data . "', '%d/%m/%Y') AND created
 <  DATE_FORMAT('" . $to_data . "', '%d/%m/%Y')" ;

Any guidance on getting this working would be much appreciated.

Link to comment
https://forums.phpfreaks.com/topic/277946-csv-export-query-with-date-range/
Share on other sites

I'm still not managing to get this to work.

 

This is how I have changed things. My form date format outputs like this e.g.) 2013-03-01, I'm using date picker jquery plugin for my form.

<script>
$(function() {
$( "#from" ).datepicker({
defaultDate: "+1w",
changeMonth: true,
numberOfMonths: 3,
dateFormat: "yy-mm-dd",
onClose: function( selectedDate ) {
$( "#to" ).datepicker( "option", "minDate", selectedDate );
}
});
$( "#to" ).datepicker({
defaultDate: "+1w",
changeMonth: true,
numberOfMonths: 3,
dateFormat: "yy-mm-dd",
onClose: function( selectedDate ) {
$( "#from" ).datepicker( "option", "maxDate", selectedDate );
}
});
});
</script>

And my HTML for the form

<form action="http://www.xxxx.com/csv_export_arp.php">
    <p>Select a date range from </p><label style="color:#FFF;" for="from">From</label>
<input type="text" id="from" name="from" value="from" />
<label style="color:#FFF;" for="to" >to</label>
<input type="text" id="to" name="to" value="to"/>
    <input name="export" type="submit" value="Export Pending ARP CSV" />
</form>

I changed the script file ( csv_export_arp.php) to this (GET rather than post)
 

<?php

$host = 'localhost'; // MYSQL database host adress
$db = 'xxxxx'; // MYSQL database name
$user = 'xxxxx'; // Mysql Datbase user
$pass = 'xxxxxx'; // Mysql Datbase password
$from_data = $_GET['from']; //Should be sanitized before use in the query, or use PDO.
$to_data = $_GET['to']; //Should be sanitized before use in the query, or use PDO.
// Connect to the database
$link = mysql_connect($host, $user, $pass);
mysql_select_db($db);

require 'scripts/exportcsv_arp.inc.php';

$table="support_users"; // this is the tablename that you want to export to csv from mysql.

exportMysqlToCsv($table, $from_data, $to_data);

?>

So i then changed my script query part to the following, to the same  date ormat. this is part of the file : exportcsv_arp.inc.php

$sql_query = "SELECT ticket_number AS 'Ticket number', first_name AS 'First name', surname AS 'Last name', email AS 'Email address', product AS 'Product',
 retailer AS 'Retailer', dop AS 'Date of purchase', message AS 'Message', address AS 'Postal address', DATE_FORMAT(created, '%Y-%m-%d') AS 'Date created',
 status AS 'Status', action AS 'Action', comment AS 'Comment', resolution AS 'Resolution' FROM $table WHERE status='Pending ARP' created >= DATE_FORMAT
('" . $from_data . "', '%Y-%m-%d') AND created <  DATE_FORMAT('" . $to_data . "', '%Y-%m-%d')" ;
// Gets the data from the database

Can any of you good people see why this isn't working, if I take the date queries out I get the right status(pending ARP) exported to the CSV, so somewhere my date selctions aren't been transfered corractly to the CSV file as well as the status selction.

try

SELECT ticket_number AS 'Ticket number', 
    first_name AS 'First name', 
    surname AS 'Last name', 
    email AS 'Email address', 
    product AS 'Product',
    retailer AS 'Retailer', 
    dop AS 'Date of purchase', 
    message AS 'Message', 
    address AS 'Postal address', 
    DATE(created) AS 'Date created',
    status AS 'Status', 
    action AS 'Action', 
    comment AS 'Comment', 
    resolution AS 'Resolution' 
FROM $table 
WHERE status='Pending ARP' 
    AND DATE(created) BETWEEN '$from_data' AND '$to_data'

 

try

SELECT ticket_number AS 'Ticket number', 
    first_name AS 'First name', 
    surname AS 'Last name', 
    email AS 'Email address', 
    product AS 'Product',
    retailer AS 'Retailer', 
    dop AS 'Date of purchase', 
    message AS 'Message', 
    address AS 'Postal address', 
    DATE(created) AS 'Date created',
    status AS 'Status', 
    action AS 'Action', 
    comment AS 'Comment', 
    resolution AS 'Resolution' 
FROM $table 
WHERE status='Pending ARP' 
    AND DATE(created) BETWEEN '$from_data' AND '$to_data'

Hi Many thanks for your effort, but doing this just returned a blank CSV with just headings, if I remove the line

AND DATE(created) BETWEEN '$from_data' AND '$to_data'

The CSV lists the entries but for all dates. I notice on the CSV table once exported date formate is as follows : 05/03/2011 = dd/mm/yyyy

 

not sure if this is where the issue is.

After you create the $sql_query string that you are passing to mysql_query().

 

After echoing the string you could put

 

exit;

 

to halt the script.

 

Okay thanks this is what I did:

<?php
function exportMysqlToCsv($table, $from_data, $to_data, $filename = 'export_arp.csv')
{
    $csv_terminated = "\n";
    $csv_separator = ",";
    $csv_enclosed = '"';
    $csv_escaped = "\\";    
    $sql_query = "SELECT ticket_number AS 'Ticket number', first_name AS 'First name', surname AS 'Last name', email AS 
'Email address', product AS 'Product', retailer AS 'Retailer', dop AS 'Date of purchase', message AS 
'Message', address AS 'Postal address', DATE_FORMAT(created, '%Y-%m-%d') AS 'Date created', status AS 
'Status', action AS 'Action', comment AS 'Comment', resolution AS 'Resolution' FROM $table 
WHERE status='Pending ARP' AND created >= DATE_FORMAT('" . $from_data . "', '%Y-%m-%d') AND created
 <  DATE_FORMAT('" . $to_data . "', '%Y-%m-%d')" ;
    
    // Gets the data from the database
    $result = mysql_query($sql_query);
    exit;
    $fields_cnt = mysql_num_fields($result);
    $schema_insert = '';
    for ($i = 0; $i < $fields_cnt; $i++)
    {
        $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed,
            stripslashes(mysql_field_name($result, $i))) . $csv_enclosed;
        $schema_insert .= $l;
        $schema_insert .= $csv_separator;
    } // end for
    $out = trim(substr($schema_insert, 0, -1));
    $out .= $csv_terminated;
    // Format the data
    while ($row = mysql_fetch_array($result))
    {
        $schema_insert = '';
        for ($j = 0; $j < $fields_cnt; $j++)
        {
            if ($row[$j] == '0' || $row[$j] != '')
            {
                if ($csv_enclosed == '')
                {
                    $schema_insert .= $row[$j];
                } else
                {
                    $schema_insert .= $csv_enclosed .
                    str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed;
                }
            } else
            {
                $schema_insert .= '';
            }
            if ($j < $fields_cnt - 1)
            {
                $schema_insert .= $csv_separator;
            }
        } // end for
        $out .= $schema_insert;
        $out .= $csv_terminated;
    } // end while
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    // Output to browser with appropriate mime type, you choose 
    //header("Content-type: text/x-csv");
    //header("Content-type: text/csv");
    header("Content-type: application/csv");
    header("Content-Disposition: attachment; filename=$filename");
    echo $out;
    exit;
}
?>


I added end after my $result = mysql_query($sql_query); ad I got a blank page with the URL myurl.com/csv_export_arp.php?from=2012-06-04&to=2013-05-01&export=Export+Pending+ARP+CSV

 

So from that string I see my dates form the for are been put in the query.

 

The full script is above if this helps.

Edited by 83Lee83

Where's the echo?

 

You need to echo the query string just before the exit;

Doing that this is what the page delivers.

SELECT ticket_number AS 'Ticket number', first_name AS 'First name', surname AS 'Last name', email AS 'Email address', product AS 'Product', 
retailer AS 'Retailer', dop AS 'Date of purchase', message AS 'Message', address AS 'Postal address', DATE_FORMAT(created, '%Y-%m-%d') 
AS 'Date created', status AS 'Status', action AS 'Action', comment AS 'Comment', resolution AS 'Resolution'
 FROM support_users WHERE status='Pending ARP' AND created >= DATE_FORMAT('', '%Y-%m-%d') AND created <  DATE_FORMAT('', '%Y-%m-%d')

I see you ignored my query changes.

 

Anyway, you can now see that both $from_data and $to_data are empty.

 

AND created >= DATE_FORMAT('', '%Y-%m-%d') AND created < DATE_FORMAT('', '%Y-%m-%d')

 

I have just used your string and it delivers this result.

SELECT ticket_number AS 'Ticket number', 
    first_name AS 'First name', 
    surname AS 'Last name', 
    email AS 'Email address', 
    product AS 'Product',
    retailer AS 'Retailer', 
    dop AS 'Date of purchase', 
    message AS 'Message', 
    address AS 'Postal address', 
    DATE(created) AS 'Date created',
    status AS 'Status', 
    action AS 'Action', 
    comment AS 'Comment', 
    resolution AS 'Resolution' 
FROM support_users 
WHERE status='Pending ARP' 
    AND DATE(created) BETWEEN '' AND ''

Still empty, any idea where i go from here. Many thanks for your continued help by the way.

Check the values before this line

exportMysqlToCsv($table, $from_data, $to_data);

to see if it getting the form values correctly

That just returns a blank page.

 

But my selected dates do show up in the URL string again.

Edited by 83Lee83

So, did $from_data and $to_data contain the expected values just prior to calling the export function?

No it didn't, I did this and just gt a blank page.

<?php
echo "<pre>$sql_query</pre>";
	exit;
function exportMysqlToCsv($table, $from_data, $to_data, $filename = 'export_arp.csv')

As you are echoing the wrong thing in the wrong place then no surprise there.

 

Check the two variables by echoing them in the place I suggested.

Sorry for the misunderstnading, so where do I put

echo "<pre>$sql_query</pre>";
    exit;

To check the two variables?

Check the values before this line

exportMysqlToCsv($table, $from_data, $to_data);

to see if it getting the form values correctly

 

 

So, did $from_data and $to_data contain the expected values just prior to calling the export function?

 

 

 

Check the two variables by echoing them in the place I suggested.

this thread reads like the page is being requested twice, once with and once without the get query string on the url or you have multiple different included/required files floating around.

 

posting your entire form page would help (javascript/jquery you have on there could be doing this) and post the current php code.

 

how exactly are you viewing the csv output that is showing the dates in the 05/03/2011 format?

 

setting php's error_reporting to E_ALL and display_errors to ON may also help with the debugging.

  • Solution

Managed to get this working, I figured this was an issue with the query. Tried a few things and this is what I came up with. I changed my date format to YYYY-MM-DD on my date form.

$sql_query = "SELECT ticket_number AS 'Ticket number', first_name AS 'First name', surname AS 'Last name', 
email AS 'Email address', product AS 'Product', retailer AS 'Retailer', dop AS 'Date of purchase', message AS
 'Message', address AS 'Postal address', DATE_FORMAT(created, '%d/%m/%Y') AS 'Date created', status AS 'Status', 
action AS 'Action', comment AS 'Comment', resolution AS 'Resolution' FROM $table WHERE status='Pending ARP' AND created BETWEEN 
'$from_data 00:00:00' AND '$to_data 00:00:00'";
This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.