it-swarm.asia

إنشاء ملف CSV لمستخدم في PHP

لدي بيانات في قاعدة بيانات MySQL. أُرسل للمستخدم عنوان URL لإخراج بياناته كملف CSV.

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

كيف يمكنني ، عندما ينقرون على الرابط ، أن يكون لدي نافذة منبثقة لتنزيل CVS بالسجل من MySQL؟

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

207
Jason

محاولة:

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;
}
272
Oleg Barshay
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")
));

php: // output
fputcsv

454
Nobody Tells

فيما يلي نسخة محسّنة من الوظيفة من 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);
}

إنه حقًا سهل الاستخدام ويعمل بشكل رائع مع مجموعات نتائج MySQL (i)/PDO.

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

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

18
Xeoncross

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

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

يكون هذا مفيدًا جدًا عند التعامل مع الملفات بلغات متعددة فيها ، مثل أسماء الأشخاص أو المدن.

16
Stan

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

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

<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
9
LBJ

قم بإنشاء الملف الخاص بك ثم قم بإرجاع مرجع إليه باستخدام العنوان الصحيح لتشغيل "حفظ باسم" - قم بتحرير ما يلي حسب الحاجة. ضع بيانات ملف 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);
7
typemismatch

فيما يلي مثال عملي كامل باستخدام PDO ويتضمن رؤوس الأعمدة:

$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);
}
5
Justin

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

$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);
*/
4
Behzad Ravanbakhsh

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

<?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;
}

؟>

3
Kaddy

طريقة بسيطة -

$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 والإصدارات الأحدث.

2
user244641

يمكنك ببساطة كتابة بياناتك في ملف 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);
2
Shahbaz

أسهل طريقة هي استخدام فئة مخصصة 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'); 
1
Sergiu

بدلا من:

$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";
}
1
Joshua

بالفعل حل جيد للغاية جاء. أنا فقط وضع الكود الكلي بحيث يحصل مبتدئ على المساعدة الكاملة

<?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 على المتصفح.

1
zahid9i

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

$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);
}
0
user1764198

لجعله يرسله كملف CSV ويطلب منه إعطاء اسم الملف ، استخدم header ():

http://us2.php.net/header

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

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

0
Gavin M. Roy

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

<?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;
    }
?>
0
Connor Burton
<?
    // 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 );
?>
0
Vish00722

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

http://csv.thephpleague.com/

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

0
John Hunt