hello folks

I'm a greenhorn in PHP so excuse me if i'm being dumb.

I have set up a page that is pulling records out of a database table, the user viewing the page is intended the choose a number of the records on the page (using checkboxes) and download as CSV to use for referencing.The problem is that i dont know the technique to do this.

the code looks like this

<?php

include 'data.php';

try{
    $con = new PDO('mysql:host=localhost;dbname=abc', $user, $pass);
    $con->SetAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $sql=$con->prepare('select id, title, author, secondary_title, year, volume, number, pages from refs');
        $sql->execute();

        $sql->setFetchMode(PDO::FETCH_ASSOC);?>
<!doctype html>
<html style="width:100%;height:100%">

<head>


<title>Scholar</title>
<link href="authors.css" rel="stylesheet" type="text/css"/>

</head>
<body>

<div id = "container">
<form action = "<?Php echo $_SERVER['PHP_SELF'];?>" method = "post">
<?php

    while ($row = $sql->fetch()){
        $id = $row ['id'];
        $title = $row ['title'];
        $author = $row ['author'];
        $secondary_title = $row ['secondary_title'];
        $year = $row ['year'];
        $volume = $row ['volume'];
        $number = $row ['number'];
        $pages = $row ['pages'];
        //$ref = $row["'$volume' . '($number)' . '$pages'"];

        echo "<input type = 'checkbox' name='checkbox[]' value=''>$id <a href =''>$title \n </a> </br>  $author \n </br> $secondary_title $year $volume($number):$pages </br><p>";
        }?>
    <input type = "submit"   name="submit">
</div>
</body><?php
}

catch (PDOException $e){
echo 'ERROR:'. $e->getMessage();

}
$con = null;
?>

you can view the attached thumbnail.

So the user has to check some checkboxes, of which the values will then be converted to .csv and offered as a download? Or are there multiple .csv's available for download, and does the user have to select which of those he wants to download?

  • The user has to check some (random) checkboxes, of which the values will then be converted to .csv and offered as a download.

  • The user can choose not to download. Store the selected values temporarily in a variable/session.

*

Here is what I would do to improve your code a bit.

database data output:

echo '<table border="1">
            <thead>
                <tr>
                    <th>&nbsp;</th>
                    <th>ID</th>
                    <th>TITLE</th>
                    <th>AUTHOR</th>
                    <th>SECONDARY TITLE</th>
                    <th>YEAR</th>
                    <th>VOLUME</th>
                    <th>NUMBER</th>
                    <th>PAGES</th>
                </tr>
            </thead>
            <tbody>';
            while($row = $sql->fetch()){
                echo '<tr>';
                echo '<td><input type="checkbox" name="checkbox[]" value="'.$row['id'].'" /></td>';
                echo '<td>'.$row['title'].'</td>';
                echo '<td>'.$row['author'].'</td>';
                echo '<td>'.$row['secondar_title'].'</td>';
                echo '<td>'.$row['year'].'</td>';
                echo '<td>'.$row['volume'].'</td>';
                echo '<td>'.$row['number'].'</td>';
                echo '<td>'.$row['pages'].'</td>';
                echo '</tr>';
            }
            echo '</tbody>
        </table>';

Data to csv file: (this is just a example may need to changed to your needs)

if(isset($_POST['save_csv'])){

    $id = trim($_POST['id']);

    if(!empty($id) && is_numeric($id)){

        $con = new PDO('mysql:host=localhost;dbname=abc', $user, $pass);
        $con->SetAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $sql=$con->prepare('select id, title, author, secondary_title, year, volume, number, pages from refs where id={$id}');
        $sql->execute();
        $sql->setFetchMode(PDO::FETCH_ASSOC);
        $data = $sql->fetch();

        $fp = fopen('php://output', 'w');
        if ($fp) {
            header('Content-Type: text/csv');
            header('Content-Disposition: attachment; filename="export.csv"');
            fputcsv($fp, $data);
        }
    }
}

Nice piece of code :). @topic starter: Just don't forget to contain your database code within a try-catch block if you set PDO's errmode to PDO::ERRMODE_EXCEPTION, as in gabrielcastillo's example.

Thanks all. Still trying to decifer @gabrielcastillo code

A little help with that code:

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');

These headers are sent to the browser, invisible to the end user. A browser always receives headers from a web server, telling it what kind of stuff it is working with. In this case the headers tell the browser that a text/csv file is being given to it, and that it should be offered to the user as a download called export.csv.

@gabrielcastillo...Just to clarify some few issues

I take it that we have a form with a submit button named "save.csv".

on line no.10 in your second posting, why do you use {} to enclose id??

Once again forgive me for my greenhorn questions

Member Avatar for diafol

Sorry to jump in, the {} are not really needed for $id. The {braces} are usually reserved for array items or properties or to separate variables when placed directly before most characters within double quoted strings.

I imagine that the submit button would be named 'save_csv' not 'save.csv'

@gabrielcastillo. thnx, i was looking some thing like this, the code is really helpfull. :)

sorry braces are not needed.. and yes the submit button would have the name of save_csv, but the code is just an example of on method of solving the problem. You would need to wrap the table in a form as well.

Thank you very much everyone.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.