Springen naar inhoud


- - - - -

Csv Export Zonder Html Info


  • Log in a.u.b. om te beantwoorden
Er zijn 3 reacties in dit onderwerp

#1 guest_BESLO_*

guest_BESLO_*
  • Gasten
    Laatst bezocht

Geplaatst op 11 november 2012 - 17:10

Ik wil de resultaten van een MySQL query naar een CSV file sturen maar ik slaag er niet in om de html info er uit te strippen wanneer ik een
Code:
fopen('php://output', 'a+')
doe.

Wanneer ik gewoon
Code:
fopen($filename, 'a+');
doe krijg ik die info niet, maar dan wordt het bestand op de server bewaard, wat ik niet wil. De bedoeling is dat de bezoeker van mijn site deze info lokaal op de eigen PC kan wegschrijven om daarna in bvb Excel in te lezen.

Ik gebruik momenteel de volgende code:
Code:
function query_to_csv($db_conn, $query, $filename, $attachment = false, $headers = true) {
if($attachment) {
	 // send response headers to the browser
header( 'Content-Type: application/doc' );
		 header( 'Content-Disposition: attachment;filename='.$filename);

		 $fp = fopen('php://output', 'a+');
		 }
else {
		 $fp = fopen($filename, 'a+');
	 }
	
	 $result = mysql_query($query, $db_conn) or die( mysql_error( $db_conn ) );
	
	 if($headers) {
		 // output header row (if at least one row exists)
		 $row = mysql_fetch_assoc($result);
		 if($row) {
nl2br(fputcsv($fp, array_keys($row)));
			 // reset pointer back to beginning
			 mysql_data_seek($result, 0);
		 }
	 }
	
	 while($row = mysql_fetch_assoc($result)) {
nl2br(fputcsv($fp, $row));
	 }
if (PHP_EOL == "\r\n"){
$eol = " \n";
}
else{
$eol = " \r\n";
}

rewind($fp);
$csv = fgets($fp);

if ($eol != PHP_EOL){
$csv = substr($csv, 0, (0 - strlen(PHP_EOL))) . $eol;
}
rewind($fp);
$Line = fgets($fp);
	 $Line = str_replace("<!doctype html>", "", $Line);
fputs($fp, $Line);
	 $Line = str_replace("<html>", "", $Line);
	 $Line = str_replace("<head>", "", $Line);
	 $Line = str_replace('<meta charset="utf-8">', "", $Line);
	 $Line = str_replace("<title>Untitled Document</title>", "", $Line);
	 $Line = str_replace("</head>", "", $Line);
	 $Line = str_replace("<body>", "", $Line);
	 $Line = str_replace("<div>", "", $Line);
	 $Line = str_replace("<body>", "", $Line);
	 $Line = str_replace("<div>", "", $Line);
	 $Line = str_replace("</body>", "", $Line);
	 $Line = str_replace("</div>", "", $Line);
	 $Line = str_replace("</html>", "", $Line);

fclose($fp);
}


Iemand enig idee?

#2 guest_ingrid_*

guest_ingrid_*
  • Gasten
    Laatst bezocht

Geplaatst op 12 november 2012 - 13:21

Kan je niet beter de strip_tags gebruiken?
Misschien staan de < en > als &lt; en &gt; in de database?

#3 guest_BESLO_*

guest_BESLO_*
  • Gasten
    Laatst bezocht

Geplaatst op 12 november 2012 - 14:42

Bericht bekijkeningrid, op 12 november 2012 - 13:21, zei:

Kan je niet beter de strip_tags gebruiken?
Misschien staan de < en > als &lt; en &gt; in de database?

Nope. Net geprobeerd. De tags blijven ook dan bestaan.
Het probleem zit em in het feit dat ik verplicht ben 'php://output' als filenaam te gebruiken opdat ik de keuze zou krijgen om mijn gegevens weg te schrijven naar locale schijf.

In de DB staan misschien wel < en > maar die moeten absoluut zo blijven staan (komen af en toe voor in een memo veld waar opmerkingen opgeslagen worden).

Denk dat ik eens ga kijken of ik via AJAX niet op de een of andere manier die info kan doorkrijgen om dan daarna via Javascript alsnog het bestand in het juiste formaat met de juiste inhoud op te kunnen slagen.

#4 guest_BESLO_*

guest_BESLO_*
  • Gasten
    Laatst bezocht

Geplaatst op 12 november 2012 - 16:07

Probleem min of meer opgelost. Laad de info nu in een verborgen DIV en ga dan met een j&#097;v&#097;script functie alles ophalen om het naar een file te sturen.
Code:
   &lt;script language="j&#097;v&#097;script">

  // Function found at
  // http://stackoverflow.com/questions/3286423/is-it-possible-to-use-any-html5-fanciness-to-export-local-storage-to-excel/3293101#3293101
  function exportData() {
   alert("export start");
   data =  &#100;ocument.getElementById("Gegevens").innerHTML;

   data = data.replace("<br>","");
	var exportLink = &#100;ocument.createElement('a');
	exportLink.setAttribute('href', 'data:text/csv;base64,' + wind&#111;w.btoa(data));
	exportLink.appendChild(&#100;ocument.createTextNode('test.csv'));
	&#100;ocument.getElementById('results').appendChild(exportLink);
   }
</script>
<?php
/
/* Read connection information */

include ("../../cgloc.php");	
// The following function was found at
// https://gist.github.com/2894568
if(!function_exists('str_putcsv')){
  function str_putcsv($input, $delimiter = ',', $enclosure = '"'){
   // Open a memory "file" for read/write...
   $fp = fopen('php://temp', 'r+');

   fputcsv($fp, $input, $delimiter, $enclosure);

   rewind($fp);

   $data = fread($fp, 1048576);

   fclose($fp);

   return rtrim($data, "\n");
   }
}			  
   /* Connect to the database */					
   $Conn = mysql_connect($ServerName, $UserName, $Password) or die ('Kan geen verbinding met de database maken! Probeer later nog eens opnieuw.');
mysql_set_charset('utf8',$Conn);
   mysql_select_db($dbName, $Conn);

   /* Retrieve names and indexes from table */
   $SQLStatement = "SELECT * FROM personen ORDER BY Voornaam, ID;";
   $Result=mysql_query($SQLStatement);
?>
<div id="Gegevens">

<?php
$row = mysql_fetch_assoc($Result);
   if($row) {
  $Arr = str_putcsv(array_keys($row)) . "\r\n";
	  echo $Arr;
	mysql_data_seek($Result, 0);
	}
while($row = mysql_fetch_assoc($Result)) {
  $Arr = str_putcsv($row) . "\r\n";
	  echo $Arr;
   }
?>
</div>
   &lt;script language="j&#097;v&#097;script">
  alert ("export gaat starten");
  exportData();
</script>


Nu nog uitzoeken hoe ik de bestandsnaam kan bepalen voor de bezoeker (is nu default "download")....




0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)