Question:
I have recently made a website and have a members table in my sql. I have
an admin page that has the ability to download that with column names;
however I used to use INTO OUTFILE but that is not allowed on my host. I
came up with this code to download the file:<?php if(file_exists('downloads/members_'.date("m-d-Y").'.csv') == true){ header("Location: /downloads/members_".date("m-d-Y").".csv"); } $output=fopen('downloads/members_'.date("m-d-Y").'.csv','w+'); fputcsv($output,array( 'memberID','username','password','email', 'active','resetToken','resetComplete', 'support','supportToken' ) ); $rows =mysql_query("SELECT * FROM members;"); while($row=mysql_fetch_assoc($rows)) fputcsv($output,$row); header("Location: /downloads/members_".date("m-d-Y").".csv"); exit; ?>
This just outputs the column names and I have never used fputcsv before and am a tad confused on what I am doing wrong. I get the file to download but not with the table in it.
[EDIT] I just tried it with a valid sql query and it does not work. updated code above. Also There is stuff in the members table.
Answer:
Try this and read the comments carefully:
<?php try { /************************************** * Create sqllite3 database and * * open connections * * Coded by Mawia HL for SO Answer * **************************************/ // Create (connect to) SQLite database in file $file_db = new PDO('sqlite:messaging.sqlite3'); // Set errormode to exceptions $file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $file_db->query("CREATE TABLE IF NOT EXISTS `members` ( member_id INTEGER PRIMARY KEY, username TEXT, password TEXT, email TEXT, active TEXT, resetToken TEXT, resetComplete TEXT, support TEXT, supportToken TEXT )"); $insert = "INSERT INTO members (member_id, username, password, email,active,resetToken,resetComplete,support,supportToken) VALUES ('1', 'John', 'john123', 'john@gmail.com','2','4757ghf', '657hfd','657hdhd','857tydhdn')"; $file_db->query($insert); }catch(PDOException $e) { // Print PDOException message echo $e->getMessage(); } function getRow($result) { return $result->fetch(PDO::FETCH_ASSOC); } if (isset($_POST['download'])) { $result = $file_db->query('SELECT * FROM members'); header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename=yourcsv.csv'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); $csvoutput = fopen('php://output', 'w'); $row = getRow($result); $headers = array_keys($row);//columns from db e.g, memberID','username',... fputcsv($csvoutput, $headers); fputcsv($csvoutput, $row); while ($row = getRow($result)) { fputcsv($csvoutput, $row); } fclose($csvoutput); exit; } $listing = $file_db->query('SELECT * FROM members'); ?>
<h1>Members Listing</h1> <?php while ($row = getRow($listing)) { ?> <h2><?php echo $row['member_id']; ?></h2> <ul> <li>Member Name: <?php echo $row['username']; ?></li> <li>Password: <?php echo $row['password']; ?></li> <li>Email: <?php echo $row['email']; ?></li> <li>Active: <?php echo $row['active']; ?></li> </ul> <hr> <?php } ?> <form method="post"> <fieldset> <legend>Download Results in CSV Format</legend> <p> <input type="submit" name="download" id="download" value="Download File"> </p> </fieldset> </form>
Here is real-time demo with sqllite3 database. Uncomment the create database and insert statement in order to see the working demo. I am using sqllite3 because it is testable online. You can easily integrate it in mysql database or any other databases.