Jump to content

CSV Export query with date range


83Lee83
Go to solution Solved by 83Lee83,

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

Link to comment
Share on other sites

What is the format of the dates in your db table?

Hi, I've just logged in to PHPmyAdmin and it says datetime and the entries are dispalyed like this in the table within phpmyadmin 2013-05-15 13:22:03

 

Do you know how I might be going wrong?

Link to comment
Share on other sites

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'
Link to comment
Share on other sites

 

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.

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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')
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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')
Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

 

Many thanks, I realise what you menat now, doh!.

 

Yes by echoing these values I get the coorect figures e.g)

2012-11-04

2013-05-05

So for some reason my query is not using the figures correctly within the database query for CSV export. Any ideas?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • 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'";
Link to comment
Share on other sites

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.