This code is working without problem if page doesn’t contain any other content. When i add a html form, it gives only html content to excel. I need to use that form to customize query. How can i make this code working with html content?
<?php if (isset($_POST['excel'])){ mysql_connect("localhost", "root", "") or die(mysql_error()); mysql_select_db("dbname") or die(mysql_error()); mysql_query("SET NAMES 'LATIN5'"); mysql_query("SET character_set_connection = 'LATIN5'"); mysql_query("SET character_set_client = 'LATIN5'"); mysql_query("SET character_set_results = 'LATIN5'"); $select = "query here"; $export = mysql_query ( $select ) 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"; } header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=your_desired_name.xls"); header("Pragma: no-cache"); header("Expires: 0"); print "$headern$data"; } ?>
Advertisement
Answer
As mentioned in the comments, combining HTML and CSV is not possible
However, it seems you’re only outputing CSV if a form is posted ($_POST[‘excel’]). You should ‘stop’ the PHP script after outputting the CSV, like this:
if($_POST['excel']) { // query and output CSV //... exit(); //done outputting csv } // regular HTML form here; will only be output if NO form is sent
With this approach, your script will:
- output a HTML form if visited without sending a form
- output CSV if the form has been submitted.
However, you may re-consider putting both functionality in the same PHP script. It’s probably a better approach to output the CSV in another script (e.g. download_csv.php) and set the ‘action’ of your form to that location;
<form action='download_csv.php'>
[update] To output HTML or CSV depending on the form-input, you may consider this:
if($_POST['excel']) { // query and output CSV include 'csv-exporter.php'; exit(); //done outputting csv } else if ($_POST['html']) { // query and output HTML include 'html-exporter.php'; exit(); //done outputting html }
However, this way the ‘query’ part will be duplicated. In which case, it’s probably best to separate the querying and ‘formatting’ parts. You can do so by putting them in a function and use the result of that, something like:
if($_POST['excel']) { outputCSV(getResultsFromDatabase()); exit(); } else if ($_POST['html']{ outputHtmlList(getResultsFromDatabase()); exit(); }
Those functions can be put in separate files and included using the ‘include’ functionality of PHP.
Both are just for illustration all purposes, and a bit off-topic for your original question.