Ben, bir veritabanı üzerinde bir sorgu çalıştırır, bir csv dosyasına sonuçlarını kaydeder ve daha sonra kullanıcı dosyayı indirmenize izin veriyor bazı PHP kodu var. Sorun csv dosyası gerçek csv içerik etrafında sayfa HTML ihtiva etmektedir.
I this one dahil olmak üzere burada zaten tüm ilgili soruları okudum. Ne yazık ki benim kod Joomla içinde var, bu yüzden başlıklarını ama hiçbir şey içeren bir sayfaya yönlendirmek için çalışsanız bile, Joomla otomatik olarak kendi navigasyon kodu ile onu çevreleyen. Bu yalnızca indirme anda olur; Ben sunucu üzerinde kurtardı csv dosyasına bakarsanız, bu HTML içermiyor.
Herkes oldukça tarayıcı olması için düzenleme gibi daha sunucuda olduğu gibi gerçek csv dosyasının indirme zorlamak için bir yol ile bana yardımcı olabilir misiniz? Ben bu gibi başlık konumunu kullanarak denedim:
header('Location: ' . $filename);
ama oldukça kaydetmek diyaloğu zorlamadan daha, tarayıcıda dosyayı açar.
İşte benim geçerli kod:
//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary");
readfile($filename);
exit;
EDITS Full URL looks like this:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers
Bu gibi bakarak gerçek indirme linki:
http://mysite.com/administrator/index.php?option=com_eimcart&task=customers&subtask=export
MORE EDITS Here's a shot of the page that the code is on; the generated file still is pulling in the html for the submenu. The code for the selected link (Export as CSV) is now
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Şimdi burada üretilen, kaydedilen dosyanın bir ekran görüntüsü:
Burada yükleme sırasında küçüldü, ancak metin subnav (liste müşteriler, yeni müşteri, csv gibi ihracat) eklemek için html kodu sarı vurgulanır. İşte benim tam kod artık şuna benziyor; Ben sadece html geçen bit kurtulmak eğer mükemmel olurdu.
$fp= fopen("php://output", 'w');
$query = "select c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone, a.company, a.address1,
a.address2,a.city,a.state,a.zip,c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id
order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);
UPDATE FOR BJORN
İşte benim için çalıştı kodu (bence) bulunuyor. Eylem çağrıları bağlantı RAW param kullanın:
index.php?option=com_eimcart&task=customers&subtask=export&format=raw
Bu usul Çünkü, bizim bağlantı bu gibi görünüyor customers.php adlı bir dosyada, oldu:
switch ($r['subtask']){
case 'add':
case 'edit':
//if the form is submitted then go to validation
include("subnav.php");
if ($r['custFormSubmitted'] == "true")
include("validate.php");
else
include("showForm.php");
break;
case 'delete':
include("subnav.php");
include("process.php");
break;
case 'resetpass':
include("subnav.php");
include("resetpassword");
break;
case 'export':
include("export_csv.php");
break;
default:
include("subnav.php");
include("list.php");
break;
}
Bir kullanıcı yukarıdaki linke tıklandığında Yani, export_csv.php dosya otomatik olarak eklenir. Bu dosya tüm gerçek kodu içerir:
<?
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
$fp= fopen("php://output", 'w');
//get all data
$query = "select
c.firstname,c.lastname,c.email as customer_email,
a.email as address_email,c.phone as customer_phone,
a.phone as address_phone,
a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
from {$dbpre}customers c
left join {$dbpre}customers_addresses a on c.id = a.customer_id order by c.last_signin desc";
$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
//put header row
if ($counter == 1){
$headerRow = array();
foreach ($row as $key => $val)
$headerRow[] = $key;
fputcsv($fp, $headerRow);
}
//put data row
fputcsv($fp, $row);
$counter++;
}
//close file
fclose($fp);