سؤال

ولدي البيانات في قاعدة بيانات MySQL. أبعث المستخدم URL للحصول على بياناتهم كملف CSV.

ولدي البريدية الإلكترونية من الارتباط، الخلية الاستعلام، الخ تغطيتها.

وكيف يمكنني، عند النقر على الرابط، لديها المنبثقة لتحميل CVS مع سجل من الخلية؟

ولدي كل المعلومات للحصول على السجل بالفعل. أنا لا أرى كيف يكون PHP إنشاء ملف CSV والسماح لهم تحميل ملف بملحق بتنسيق csv ..

هل كانت مفيدة؟

المحلول

وجرب:

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

echo "record1,record2,record3\n";
die;

وغيرها

وتحرير: وفيما يلي مقتطف من الشفرة التي يمكنني استخدامها لاختياريا الحقول ترميز CSV:

function maybeEncodeCSVField($string) {
    if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
        $string = '"' . str_replace('"', '""', $string) . '"';
    }
    return $string;
}

نصائح أخرى

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

function outputCSV($data) {
  $output = fopen("php://output", "wb");
  foreach ($data as $row)
    fputcsv($output, $row); // here you can change delimiter/enclosure
  fclose($output);
}

outputCSV(array(
  array("name 1", "age 1", "city 1"),
  array("name 2", "age 2", "city 2"),
  array("name 3", "age 3", "city 3")
));

فب: // الناتج
fputcsv

وهنا هو نسخة محسنة من وظيفة من php.net أنAndrew نشرها.

function download_csv_results($results, $name = NULL)
{
    if( ! $name)
    {
        $name = md5(uniqid() . microtime(TRUE) . mt_rand()). '.csv';
    }

    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='. $name);
    header('Pragma: no-cache');
    header("Expires: 0");

    $outstream = fopen("php://output", "wb");

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

فمن السهل للغاية لاستخدام ويعمل بشكل ممتاز مع الخلية (ط) / PDO نتيجة مجموعات.

download_csv_results($results, 'your_name_here.csv');

وتذكر أن exit() بعد استدعاء هذا إذا كنت فعلت مع الصفحة.

وبالإضافة إلى كل ما قيل بالفعل، قد تحتاج إلى إضافة:

header("Content-Transfer-Encoding: UTF-8");

وانها مفيدة جدا عند التعامل مع الملفات مع لغات متعددة فيها، مثل أسماء الناس أو المدن.

وهذا موضوع قديم بعض الشيء، وأنا أعلم، ولكن لتكون مرجعا في المستقبل ولودي كما نفسي:

وأي شخص آخر هنا شرح كيفية إنشاء CSV، ولكن يغيب جزء أساسي من هذا السؤال: كيفية ربط. من أجل ربط لتحميل للملف CSV، أنت فقط تصل إلى ملف فب، والذي بدوره يستجيب باعتبارها-ملف .csv. رؤوس PHP تفعل ذلك. وهذا يتيح الاشياء باردة، مثل إضافة المتغيرات إلى سلسلة استعلام مواقع المعلومات وتخصيص الإخراج:

<a href="my_csv_creator.php?user=23&amp;othervariable=true">Get CSV</a>

وmy_csv_creator.php يمكن أن تعمل مع المتغيرات التي وردت في سلسلة استعلام مواقع المعلومات وعلى سبيل المثال استخدام مختلفة أو حسب الطلب استعلامات قاعدة البيانات، وتغيير أعمدة CSV، إضفاء الطابع الشخصي على اسم الملف وهلم جرا، منها مثلا:

User_John_Doe_10_Dec_11.csv

إنشاء الملف الخاص بك ثم العودة إشارة إلى أنه مع رأس الصحيح لتحريك حفظ باسم - تحرير التالية حسب الحاجة. وضع البيانات CSV الخاص بك إلى $ csvdata.

$fname = 'myCSV.csv';
$fp = fopen($fname,'wb');
fwrite($fp,$csvdata);
fclose($fp);

header('Content-type: application/csv');
header("Content-Disposition: inline; filename=".$fname);
readfile($fname);

وهنا هو مثال كامل تستخدم شركة تنمية نفط عمان وبما في ذلك رؤوس الأعمدة:

$query = $pdo->prepare('SELECT * FROM test WHERE id=?');
$query->execute(array($id));    
$results = $query->fetchAll(PDO::FETCH_ASSOC);
download_csv_results($results, 'test.csv'); 
exit();


function download_csv_results($results, $name)
{            
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='. $name);
    header('Pragma: no-cache');
    header("Expires: 0");

    $outstream = fopen("php://output", "wb");    
    fputcsv($outstream, array_keys($results[0]));

    foreach($results as $result)
    {
        fputcsv($outstream, $result);
    }

    fclose($outstream);
}

والأولى جعل البيانات كسلسلة مع فاصلة كمحدد (مفصولة ب "،"). شيء من هذا القبيل

$CSV_string="No,Date,Email,Sender Name,Sender Email \n"; //making string, So "\n" is used for newLine

$rand = rand(1,50); //Make a random int number between 1 to 50.
$file ="export/export".$rand.".csv"; //For avoiding cache in the client and on the server 
                                     //side it is recommended that the file name be different.

file_put_contents($file,$CSV_string);

/* Or try this code if $CSV_string is an array
    fh =fopen($file, 'w');
    fputcsv($fh , $CSV_string , ","  , "\n" ); // "," is delimiter // "\n" is new line.
    fclose($fh);
*/

ويا كان يعمل بشكل جيد جدا .... !!!! بفضل بيتر مورتنسن وكونور بيرتون

<?php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

ini_set('display_errors',1);
$private=1;
error_reporting(E_ALL ^ E_NOTICE);

mysql_connect("localhost", "user", "pass") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());

$start = $_GET["start"];
$end = $_GET["end"];

$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    $result.="{$row['email']},";
    $result.="\n";
    echo $result;
}

؟>

وأسلوب بسيط -

$data = array (
    'aaa,bbb,ccc,dddd',
    '123,456,789',
    '"aaa","bbb"');

$fp = fopen('data.csv', 'wb');
foreach($data as $line){
    $val = explode(",",$line);
    fputcsv($fp, $val);
}
fclose($fp);

وهكذا كل سطر من مجموعة $data سوف تذهب إلى خط جديد من الخاص بك ملف CSV تم إنشاؤه حديثا. أنها لا تعمل إلا فقط من أجل PHP 5 و في وقت لاحق.

ويمكنك ببساطة كتابة البيانات إلى CSV باستخدام fputcsv وظيفة. دعونا نلقي نظرة على المثال التالي. إرسال مجموعة قائمة إلى ملف CSV

$list[] = array("Cars", "Planes", "Ships");
$list[] = array("Car's2", "Planes2", "Ships2");
//define headers for CSV 
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file_name.csv');
//write data into CSV
$fp = fopen('php://output', 'wb');
//convert data to UTF-8 
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($list as $line) {
    fputcsv($fp, $line);
}
fclose($fp);

وأسهل طريقة هي استخدام مكرسة <لأ href = "http://www.eeqqoo.com/index.php؟option=com_content&view=article&id=63٪3aphp-csv-class&catid=35٪3aphp&Itemid=54" يختلط = "نوفولو"> CSV الطبقة مثل هذا:

$csv = new csv();
$csv->load_data(array(
    array('name'=>'John', 'age'=>35),
    array('name'=>'Adrian', 'age'=>23), 
    array('name'=>'William', 'age'=>57) 
));
$csv->send_file('age.csv'); 

وبدلا من:

$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    $result.="{$row['email']},";
    $result.="\n";
    echo $result;
}

استخدم:

$query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    echo implode(",", $row)."\n";
}

وإذا كنت جيدة جدا وجاء الحل. أنا مجرد بوتنج رمز الكلي بحيث مبتدئ الحصول على المساعدة الإجمالية

<?php
extract($_GET); //you can send some parameter by query variable. I have sent table name in *table* variable

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$table.csv");
header("Pragma: no-cache");
header("Expires: 0");

require_once("includes/functions.php"); //necessary mysql connection functions here

//first of all I'll get the column name to put title of csv file.
$query = "SHOW columns FROM $table";
$headers = mysql_query($query) or die(mysql_error());
$csv_head = array();
while ($row = mysql_fetch_array($headers, MYSQL_ASSOC))
{
    $csv_head[] =  $row['Field'];
}
echo implode(",", $csv_head)."\n";

//now I'll bring the data.
$query = "SELECT * FROM $table";
$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    foreach ($row as $key => $value) {
            //there may be separator (here I have used comma) inside data. So need to put double quote around such data.
        if(strpos($value, ',') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) {
            $row[$key] = '"' . str_replace('"', '""', $value) . '"';
        }
    }
    echo implode(",", $row)."\n";
}

?>

ولقد حفظ هذا الرمز في CSV-download.php

والآن نرى كيف استخدمت هذه البيانات لتحميل ملف CSV

<a href="csv-download.php?table=tbl_vfm"><img title="Download as Excel" src="images/Excel-logo.gif" alt="Download as Excel" /><a/>

وهكذا عندما كنت قد نقرت على الرابط وتحميل الملف من دون أخذ مني إلى CSV-download.php الصفحة في المتصفح.

لديك أن ترسل أنها CSV، وأنها تعطي اسم الملف، واستخدام رأس ():

http://us2.php.net/header

header('Content-type: text/csv');
header('Content-disposition: attachment; filename="myfile.csv"');

وبقدر ما جعل CSV نفسها، لو كنت مجرد حلقة من خلال مجموعة النتائج، تنسيق الانتاج وإرسالها، مثلما تفعل أي محتوى آخر.

والكتابة كود CSV الخاصة بك وربما مضيعة للوقت، ما عليك سوى استخدام حزمة مثل الدوري / CSV - أنها تتعامل مع كل الأشياء من الصعب بالنسبة لك، وثائق جيدة وانها مستقرة جدا / موثوق:

http://csv.thephpleague.com/

وستحتاج إلى استخدام الملحن. إذا كنت لا تعرف ما هو الملحن أنا أوصي لديك نظرة: https://getcomposer.org/

<?
    // Connect to database
    $result = mysql_query("select id
    from tablename
    where shid=3");
    list($DBshid) = mysql_fetch_row($result);

    /***********************************
    Write date to CSV file
    ***********************************/

    $_file = 'show.csv';
    $_fp = @fopen( $_file, 'wb' );

    $result = mysql_query("select name,compname,job_title,email_add,phone,url from UserTables where id=3");

    while (list( $Username, $Useremail_add, $Userphone, $Userurl) = mysql_fetch_row($result))
    {
        $_csv_data = $Username.','.$Useremail_add.','.$Userphone.','.$Userurl . "\n";
        @fwrite( $_fp, $_csv_data);
    }
    @fclose( $_fp );
?>

وكيفية كتابة في ملف CSV باستخدام النصي PHP؟ في الواقع كنت تبحث أيضا عن ذلك أيضا. انه نوع من مهمة سهلة مع PHP. fputs (معالج، والمحتوى) - وهذا وظيفة يعمل بكفاءة بالنسبة لي. تحتاج أولا لفتح الملف الذي تحتاج إلى كتابة المحتوى باستخدام الدالة fopen ($ CSVFileName، 'البنك الدولي').

$CSVFileName = “test.csv”;
$fp = fopen($CSVFileName, ‘wb’);

//Multiple iterations to append the data using function fputs()
foreach ($csv_post as $temp)
{
    $line = “”;
    $line .= “Content 1″ . $comma . “$temp” . $comma . “Content 2″ . $comma . “16/10/2012″.$comma;
    $line .= “\n”;
    fputs($fp, $line);
}

وهنا هو واحد أنا فعلت من قبل، والاستيلاء على البيانات بين تواريخ معينة. نأمل أن يساعد.

<?php
    header("Content-type: application/csv");
    header("Content-Disposition: attachment; filename=file.csv");
    header("Pragma: no-cache");
    header("Expires: 0");

    ini_set('display_errors',1);
    $private=1;
    error_reporting(E_ALL ^ E_NOTICE);

    mysql_connect("localhost", "user", "pass") or die(mysql_error());
    mysql_select_db("db") or die(mysql_error());

    $start = mysql_real_escape_string($_GET["start"]);
    $end = mysql_real_escape_string($_GET["end"]);

    $query = "SELECT * FROM customers WHERE created>='{$start} 00:00:00'  AND created<='{$end} 23:59:59'   ORDER BY id";
    $select_c = mysql_query($query) or die(mysql_error());

    while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
    {
        $result.="{$row['email']},";
        $result.="\n";
        echo $result;
    }
?>

وضعت في متغير $output البيانات CSV وصدى مع رؤوس الصحيحة

header("Content-type: application/download\r\n");
header("Content-disposition: filename=filename.csv\r\n\r\n");
header("Content-Transfer-Encoding: ASCII\r\n");
header("Content-length: ".strlen($output)."\r\n");
echo $output;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top