Mi archivo CSV generado por PHP se está guardando como un archivo PHP

Aprendí a crear archivos CSV a partir de datos MySQL de otra pregunta de StackOverflow. Mi problema es que, por alguna razón, cuando llamo a este código, intenta guardar un archivo llamado index.php (que es la página actual). Dentro de index.php El archivo mis datos de la tabla está ahí, separados por comas. Supongo que tengo un pequeño error tipográfico en alguna parte, pero después de jugar con el código no puedo encontrarlo. Gracias a cualquiera que pueda ayudar.

$result=mysql_query("SELECT * from tbl_email");
if(mysql_num_rows($result)) {
  header ("Content-type: application/csv Content-Disposition:\"inline; filename=messages.csv\"");
  echo "REF #,Company,Name,Email,Message,Date\n";
  while($row = mysql_fetch_row($result)) {
    $companyname = mysql_query("SELECT company FROM tbl_users WHERE user_id ='$row[1]'");
    $datname = mysql_fetch_array($companyname);
    echo"$row[7],$datname[company],$row[2],$row[4],$row[5],$row[6]\n";
  }
  die();
}

preguntado el 01 de julio de 12 a las 04:07

2 Respuestas

necesitas varios header() llamadas en lugar de una llamada que proporciona múltiples encabezados en una sola línea, y creo que el tipo mime más apropiado para un CSV es text/csv.

header("Content-type: text/csv");
header("Content-Disposition: inline; filename=messages.csv");

Y más comúnmente, usaríamos Content-Disposition: attachment para forzar una descarga.

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=messages.csv");

Respondido 01 Jul 12, 04:07

¡Eso funcionó! Gracias. ¿Hay alguna razón por la que tengas que dividir los dos, solo por curiosidad? - user1470755

@user1470755 header() envía un solo encabezado al flujo de salida con el siguiente salto de línea apropiado. Content-type y Content-Disposition son dos encabezados diferentes, no dos partes del mismo encabezado y, por lo tanto, deben enviarse por separado. - Michael Berkowski

Eso tiene sentido. Aceptaré tu respuesta en un par de minutos, ya que no me dejará de inmediato: user1470755

Debería ser:

header('Content-type: application/csv');
header('Content-Disposition: attachment; filename="messages.csv"');

Tenga en cuenta que el valor de nombre de archivo no está escrito correctamente entre comillas dobles. Trate de usar comillas simples en php, esto le ahorrará muchos problemas. ;)

Echa un vistazo a http://www.techcoil.com/blog/php-codes-to-tell-browsers-to-open-the-download-dialog-box-for-users-to-download-a-file/ para obtener más información sobre cómo decirle al navegador que descargue su archivo.

respondido 23 mar '14, 14:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.