2

I have a table on HTML/PHP that extract data from mySQL. Please see in this link. For example, please search this shipment code to get the result inside the table: 42-7278954.

After that, I want to export the result to excel (you also can see the button there).

Below is my table code in view (I've deleted some columns to shorten the code):

$body = "";

$display =  "<table class='table_searchshipment' id='table_searchshipment' cellpadding='0' cellspacing='0' border='0'>";

            echo $display;
            $body .= $display;

            $display  = "<thead>
                        <tr>
                          <th>CN No.</th>
                          <th>Doc No.</th>
                        </tr>
                      </thead>";
            echo $display;
            $body .= $display;  

            while($row = mysqli_fetch_array($result)) {
                $CN_no= $row['CN_no'];
                $doc_no= $row['doc_no'];

                $display  = "<tr>
                        <td>".$CN_no."</td>
                        <td>".$doc_no."</td>
                      </tr>";
               echo $display;
               $body .= $display;
            }

            $display  = "</table>";
            echo $display;
            $body .= $display;
            $body = htmlspecialchars($body);

            echo '<form action = "setheader" method = "post">
                    <input type = "hidden" name = "body" value = "<?php echo $body ; ?>">
                <input type = "submit" name = "submit" Value = "Export to excel">
            </form>'; 

            if(isset($_POST['submit'])){ 
                    $body = $_POST['body'];
                    setHeader("export.xls");

                    echo $body;
                }

And in the controller, I make function setheader:

public function setheader($excel_file_name)//this function used to set the header variable
{   
    header("Content-type: application/octet-stream");//A MIME attachment with the content type "application/octet-stream" is a binary file.
    //Typically, it will be an application or a document that must be opened in an application, such as a spreadsheet or word processor. 
    header("Content-Disposition: attachment; filename=$excel_file_name");//with this extension of file name you tell what kind of file it is.
    header("Pragma: no-cache");//Prevent Caching
    header("Expires: 0");//Expires and 0 mean that the browser will not cache the page on your hard drive
   }

The download pop-up is appear, but it only download "setheader" file that contains of error notification. Please see it here.

10
  • Try using $this->setHeader("export.xls"); Commented Dec 28, 2016 at 6:30
  • I try to add it inside the setheader function, but I get Internal Server Error. Commented Dec 28, 2016 at 6:34
  • if(isset($_POST['submit'])){ $this->setHeader("export.xls"); } Commented Dec 28, 2016 at 6:37
  • oh, you mean in view. haha. I've replaced setHeader("export.xls"); to become $this->setHeader("export.xls"); but the result is still same. Commented Dec 28, 2016 at 6:39
  • public function setheader($excel_file_name="export.xls"){ Commented Dec 28, 2016 at 6:44

1 Answer 1

2

Firstly,

This line needs to change from:

echo '<form action = "setheader" method = "post">
        <input type = "hidden" name = "body" value = "<?php echo $body ; ?>">
    <input type = "submit" name = "submit" Value = "Export to excel">
</form>';

to:

echo '<form action = "setheader" method = "post">
        <input type = "hidden" name = "body" value = "'.$body.'">
    <input type = "submit" name = "submit" Value = "Export to excel">
</form>';

Secondly, $body = htmlspecialchars($body); is most likely returning an empty string.

From the PHP Docs

If the input string contains an invalid code unit sequence within the given encoding an empty string will be returned, unless either the ENT_IGNORE or ENT_SUBSTITUTE flags are set.

Without knowing what data is coming from the database, it is hard to test that further.

But you could try:

$body = htmlspecialchars($body, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); to see if it solves that issue.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.