2016-03-23 16 views
0

Bir mySQL veritabanından veri almak ve oluşturulduktan sonra otomatik olarak indirilmesi gereken bir CSV dosyasına aktarmak için bu PHP kod parçasına sahibim.fputcsv Dosyayı açar ancak boş olarak indirir

  • verileri alır:

    $connection = mysqli_connect($host, $username, $password, $dbname) or die("Connection Error " . mysqli_error($connection)); 
    
    // fetch mysql table rows 
    $sql = "select * from users"; 
    $result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection)); 
    
    $fp = fopen('users.csv', 'w'); 
    
    while($row = mysqli_fetch_assoc($result)) { 
        fputcsv($fp, $row); 
    } 
    
    fclose($fp); 
    
    header('Content-Type: text/csv'); 
    
    header('Content-Disposition: attachment; filename="users.csv"'); 
    
    mysqli_close($connection); 
    

    burada sorun olmasıdır.

  • Sunucudaki CSV dosyasını, export.php dosyasının aynı dizinindeki veriyi ile birlikte alır.
  • aynı adı ile dosya indirir AMA BOŞ

teşekkürler bu.

+1

dosyayı çıkışı rahatsız etmedi. Dosyayı disketten okumak ve istemciye göndermek için readfile ('users.csv') 'gibi bir şeye ihtiyacınız vardır. –

+0

Dosya içeriğini, sadece dosyanın adını gönderiyorsunuz ve bu bir CSV. – chris85

+0

Sunucudaki fiziksel bir dosyaya yazmak yerine (eşzamanlı kullanıcılarınız varsa sorunlu), '' php: // output '' dosya adını kullanın (ve dosyayı açmadan önce başlıklarınızı gönderin). hiç bir sunucu diski kullanmadan tarayıcıyı –

cevap

0

users.csv adlı bir dosyaya yazıyorsunuz, ancak kullanıcının indirmesi için zorladığınız dosya sayfanın çıktısıdır.

Sorgunuz doğru olduğu sürece, PHP betiği çalıştırıldıktan sonra, doğru verileri içeren PHP dosyasıyla aynı dizinde users.csv adlı bir dosya olmalıdır.

İndirmekte olduğunuz dosyaya atfedilebilmesi için verileri tarayıcıya vermeniz gerekir.

bu deneyin:

//Connect to database 
$connection = mysqli_connect($host, $username, $password, $dbname) or die("Connection Error " . mysqli_error($connection)); 

//Fetch mysql table rows 
$sql = "select * from users"; 
$result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection)); 

//Close connection 
mysqli_close($connection); 

//Set $output 
$output = ""; 

//Set header values 
$headers = array("Header 1", "Header 2", "Header 3"); 

//Insert header values to $output 
foreach($headers as $h){ 
    $output .= fieldCheck($h) . ","; 
} 
$output = rtrim($output, ","). "\n"; 

//Iterate through results 
while($row = mysqli_fetch_assoc($result)) { 
    foreach($row as $cell){ 
     //Comma-separate each value 
     $output .= fieldCheck($cell).","; 
    } 
    //Remove last comma of each line and add newline 
    $output = rtrim($output, ",") . "\n"; 
} 

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

//Output 
echo $output; 

exit; 

//Function in case of comma in field 
function fieldCheck($string){ 
    if(strpos($string, ",") !== false){ 
     $string = '"'.$string.'"'; 
    } 
    return $string; 
} 
+0

bu, ayırıcı haricinde mükemmel çalışır, kullanmanın bir yolu var ";" "," yerine ve sütunlar için özel üstbilgi eklemek için bir yolu var mı? sütunların isimlerini $ output = "" dan hemen sonra eklediğimde; excel bana dosya formatının uzantıdan farklı olduğunu söyler ancak yine de açılır. –

+0

Eh, CSV "Virgülle Ayrılmış Değerler" anlamına gelir, bu yüzden bir noktalı virgül '' 'veya sekme kullanarak onu CSV tarafından açılamaz hale getirebilirsiniz. Yapabilecekleriniz, alanında bir virgül varsa, alanı tırnak işaretleri içine alacak bir işlev oluşturmaktır - bunu yanıtıma ekledim. Ayrıca başlık alanlarını yanıtıma ekledim. – Ben

+0

her zaman, uzantının uzantı tarafından belirtilenlerden farklı olduğunu söylüyor. ve aynı zamanda SYLK formatında olduğunu söylüyor ama bir hata (MS EXCEL benim Fransızca) –

İlgili konular