পিএইচপি-তে কোনও ব্যবহারকারীর জন্য একটি সিএসভি ফাইল তৈরি করুন


220

আমার একটি মাইএসকিউএল ডাটাবেসে ডেটা রয়েছে। আমি ব্যবহারকারীকে একটি সিএসভি ফাইল হিসাবে তাদের ডেটা আউট পেতে একটি URL প্রেরণ করছি।

আমার কাছে লিঙ্কটির ই-মেইলিং, মাইএসকিউএল কোয়েরি ইত্যাদি রয়েছে।

আমি কীভাবে, যখন তারা লিঙ্কটি ক্লিক করি, তখন মাইএসকিউএল থেকে রেকর্ড সহ একটি সিভিএস ডাউনলোড করার জন্য একটি পপ-আপ পেতে পারি?

ইতিমধ্যে রেকর্ডটি পেতে আমার কাছে সমস্ত তথ্য রয়েছে। আমি কেবল পিএইচপি কীভাবে সিএসভি ফাইল তৈরি করব এবং তাদের একটি .csv এক্সটেনশন সহ একটি ফাইল ডাউনলোড করতে দেই তা দেখছি না।

উত্তর:


280

চেষ্টা করুন:

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;

ইত্যাদি

সম্পাদনা করুন: সিএসভি ক্ষেত্রগুলি optionচ্ছিকভাবে এনকোড করতে আমি ব্যবহার করি কোডের স্নিপেট এখানে:

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

11
নোট করুন CSVs জন্য নিয়ম গুরুত্বপূর্ণ। ভাল প্রদর্শন নিশ্চিত করার জন্য, আপনার ক্ষেত্রের চারপাশে ডাবলকোটগুলি রাখুন এবং ক্ষেত্রের ভিতরে ডাবল-কোটগুলি ডাবল ডাবল-কোটগুলিতে প্রতিস্থাপন করতে ভুলবেন না: cho প্রতিধ্বনি '' '। '","'। str_replace ....
মালা

46
কেবল স্পষ্ট করে বলার জন্য, CSV- র সঠিক HTTP সামগ্রী-প্রকারের শিরোনামটি পাঠ্য / সিএসভি, অ্যাপ্লিকেশন / সিএসভি নয়। আমি সন্দেহ করি যে কোনও আধুনিক ব্রাউজার যে কোনও উপায়ে যত্ন নেবে, তবে যেহেতু মান রয়েছে তাই আমরা সেগুলি ব্যবহার করতে পারি।
পঞ্চাশ

10
সাধারণভাবে, CSV ফাইলগুলি তৈরি করার সময় দয়া করে আরএফসি 4180 অনুসরণ করুন। সরঞ্জাম.এইটিএফ.আর.এফ.এইচটিএম
ওলেগ বারশায়

5
@ ওলেগ বারশে: ওএমজি, আরএফসি একটি প্রধান অংশ: "যদি ক্ষেত্রগুলি আবদ্ধ করতে ডাবল-কোট ব্যবহার করা হয়, তবে ক্ষেত্রের অভ্যন্তরে একটি ডাবল উদ্ধৃতি অবশ্যই অন্য একটি ডাবল উদ্ধৃতি সহকারে এড়াতে হবে।" অন্য ডাবল-কোট!
এফএফএক্সএক্স

465
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


64
আরও লোকের এটি দেখার এবং এটির ভোট দেওয়ার দরকার। এটি সহজেই এই পৃষ্ঠার সেরা উত্তর। পিএইচপি এর মধ্যে ইতিমধ্যে সিএসভি সামগ্রী ফর্ম্যাট করার জন্য অন্তর্নির্মিত ফাংশন রয়েছে। প্রত্যেকেরই এগুলি ব্যবহার করা উচিত। দুর্দান্ত উত্তর, @ আন্দ্রে :)
maček

2
খুব খারাপ fputcsv () সঠিকভাবে কাজ করে না যদিও :( bugs.php.net/bug.php?id=50686
gou1

4
দুর্দান্ত, তবে outputCSVফাংশনটি অযথা জটিল। আপনি শুধু পারেন foreachওভার $array, সরাসরি তার মান পাঠানোর fputcsv__outputCSVarray_walkforeach($data as $vals) {fputcsv($filehandler,$vals);}
এটির

অ্যারেতে ফরাসি চরিত্রগুলি নিয়ে আমার কিছু সমস্যা হচ্ছে কারণ অবশেষে আমার এক্সেল খোলার জন্য .csv দরকার। এটি উচ্চারণকৃত চরিত্রগুলিকে দমন করে। "Prévalence","age 1","city 1" কোন ধারণা মত জিনিস ? ইউটিএফ -8 এর সাথে জগাখিচু করা এইভাবে এখনও সহায়তা করেনি।
ভুডু

1
@ থিওসেম ডিলিমিটার ওএস বা এক্সেল রফতানীর সেটিংসের উপর নির্ভর করে। আমি ডিলিমিটার সম্পর্কে নোট যুক্ত করেছি।
আন্দ্রেই নেমচেঙ্কো

19

এখানে পিএইচপিএন থেকে ফাংশনটির একটি উন্নত সংস্করণ দেওয়া হয়েছে যা @ অ্যান্ড্রু পোস্ট করেছেন।

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

এটি ব্যবহার করা সত্যই সহজ এবং মাইএসকিউএল (আই) / পিডিও ফলাফল সেটগুলির সাথে দুর্দান্ত কাজ করে।

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

exit()আপনি পৃষ্ঠাটি সম্পন্ন হলে এটি কল করার পরে মনে রাখবেন ।


আপনি কীভাবে বিভাজককে বদল করবেন, থেকে; ?
বিরক্ত

1
এই ইভেন্টটি ট্রিগার করতে কীভাবে আমাদের একটি বোতাম যুক্ত করা উচিত, যাতে সেই ব্যবহারকারী চাহিদা অনুযায়ী সিএসভি ফাইল ডাউনলোড করতে সক্ষম হবেন?
CanCeylan

আমার কাছে "সিনট্যাক্স এরর: অপ্রত্যাশিত টোকেন ILLEGAL" ত্রুটি "ফোপেন" ("পিএইচপি: // আউটপুট", "ডাব্লু") সাথে থাকবে; " আমি যখন এটিকে "$ fp = fopen ('stats.csv', 'w') তে পরিবর্তন করি;" এটি ত্রুটি দেখায় না তবে অবশ্যই এটি কাজ করে না। আমি কীভাবে এটি সমাধান করব?
CanCeylan

@ ক্যানসেলান, এটি নিজের অধিকারের একটি প্রশ্ন এবং এটি সমাধান করার জন্য আমার আরও বিশদ প্রয়োজন।
Xeoncross

1
যোগ fputcsv($outstream, array_keys($results[0]));শুধু আগে আপনার foreachকাছে কলাম শিরোলেখগুলি অন্তর্ভুক্ত করা হয়।
জাস্টিন 18

16

ইতিমধ্যে যা বলা আছে তার সাথে সাথে আপনার যোগ করার প্রয়োজন হতে পারে:

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

লোকের নাম বা শহরগুলির মতো একাধিক ভাষার সাথে ফাইলগুলি পরিচালনা করার সময় এটি খুব কার্যকর।


9

থ্রেডটি কিছুটা পুরানো, তবে আমি জানি, তবে ভবিষ্যতের রেফারেন্সের জন্য এবং আমার মতো নুবগুলিতে:

এখানে প্রত্যেকে প্রত্যেকে সিএসভি কীভাবে তৈরি করবেন তা ব্যাখ্যা করে, তবে কীভাবে লিঙ্ক করবেন সে প্রশ্নের একটি প্রাথমিক অংশ মিস করে। সিএসভি-ফাইল ডাউনলোডের সাথে লিঙ্ক করার জন্য, আপনি কেবল। Php-ফাইলের সাথে লিঙ্ক করেছেন, যার ফলস্বরূপ একটি .csv-ফাইল হিসাবে সাড়া দেয়। পিএইচপি শিরোনামগুলি তা করে। এটি ক্যুরিস্ট্রিংয়ে ভেরিয়েবল যুক্ত করার এবং আউটপুট কাস্টমাইজ করার মতো দুর্দান্ত জিনিসগুলিকে সক্ষম করে:

<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

1
আহ - যে কেউ এটি পড়ছেন তারা এই পদ্ধতির থেকে খুব সতর্ক হন। আমি বাজি দেব যে ইনপুটগুলি সঠিকভাবে পালানো যাচ্ছে না এবং এটি আপনার অ্যাপ্লিকেশনটিতে বড় বড় সুরক্ষা গর্ত হতে পারে।
ক্যালামব্রোডি

তার পদ্ধতিটি খুব নিরাপদ এবং এটি দুর্দান্ত কাজ করে। আপনি সহজেই অধিবেশনটির সাহায্যে অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন এবং আপনি সিএসভিতে রাখতে চান এমন সমস্ত তথ্য একটি সেশনের ভারেও সংরক্ষণ করতে পারেন। তারপরে একে একে সিএসভিতে রূপান্তর করার প্রক্রিয়ার অংশ হিসাবে এটি আনসেট করুন। আমি কেবল একটি ক্যোরি স্ট্রিংয়ের পরিবর্তে সেশন ভার্স ব্যবহার করার পরামর্শ দেব।
অজৈবিক

1
এই পদ্ধতির সাথে প্রতি সেফ কোনও সুরক্ষা গর্ত নেই। যতক্ষণ পিএইচপি ফাইল রেফারেন্স করা থাকে এটি স্যানিটেশন এবং অ্যাক্সেস চেকিংয়ের কাজ করে job তবে এটি এখানে সমস্ত কিছু দেখানো সত্যিকার অর্থে বোধগম্য নয়। পোস্টের পয়েন্টটি হ'ল ইউএসএল সিএসভি তৈরি করে তার সাথে লিঙ্ক করতে পারেন।
ড্যানিয়েলসন 317

8

আপনার ফাইলটি তৈরি করুন তারপরে সংরক্ষণ হিসাবে ট্রিগার করতে সঠিক শিরোনামটির সাথে এটিতে একটি রেফারেন্স ফিরিয়ে দিন - প্রয়োজনীয় হিসাবে নিম্নলিখিতটি সম্পাদনা করুন। আপনার সিএসভি ডেটা $ সিএসভিটাতে রাখুন।

$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);

1
"ইনলাইন" কনটেন্ট-ডিসপজিশন ব্যবহার করার অর্থ ব্রাউজারটি ডাউনলোড না করে এটি দেখানোর চেষ্টা করা উচিত (IE এটির জন্য একটি এক্সেল উদাহরণ এম্বেড করতে থাকে)) "সংযুক্তি" হ'ল ডাউনলোডকে বাধ্য করার জন্য।
গার্ট ভ্যান ডেন বার্গ

5

এখানে 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);
}

4

প্রথমে ডিলিমিটার হিসাবে কমা দিয়ে স্ট্রিং হিসাবে ডেটা তৈরি করুন ("," দিয়ে পৃথক)। এটার মতো কিছু

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

3

আরে এটা খুব ভাল কাজ করে .... !!!! ধন্যবাদ পিটার মর্টেনসেন এবং কনার বার্টন

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

?>


উত্পাদনে এই কোডটি ব্যবহার করবেন না , এটি এসকিউএল ইঞ্জেকশনগুলির পক্ষে ঝুঁকিপূর্ণ
ntzm

2

সহজ পদ্ধতি -

$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অ্যারের প্রতিটি লাইন আপনার সদ্য নির্মিত সিএসভি ফাইলের একটি নতুন লাইনে যাবে। এটি কেবলমাত্র পিএইচপি 5 এবং তারপরের জন্য কাজ করে।


2

আপনি সহজেই 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);

1

সবচেয়ে সহজ উপায় হ'ল এইভাবে ডেডিকেটেড সিএসভি ক্লাস ব্যবহার করা :

$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

পরিবর্তে:

$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

ইতিমধ্যে খুব ভাল সমাধান এসেছে। আমি কেবল মোট কোডটি রেখে দিচ্ছি যাতে কোনও নবাগত পুরোপুরি সহায়তা পান

<?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 এ সংরক্ষণ করেছি

এখন দেখুন কীভাবে আমি সিএসভি ফাইল ডাউনলোড করতে এই ডেটা ব্যবহার করেছি

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

সুতরাং আমি যখন লিঙ্কটি ক্লিক করেছি তখন এটি ব্রাউজারে আমাকে সিএসভি-ডাউনলোড.php পৃষ্ঠায় না নিয়ে ফাইলটি ডাউনলোড করে।


0

এটি একটি সিএসভি হিসাবে প্রেরণ এবং ফাইলের নাম দেওয়ার জন্য এটি শিরোনাম () ব্যবহার করুন:

http://us2.php.net/header

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

যতক্ষণ না নিজে সিএসভি তৈরি করা যায়, আপনি কেবল ফলাফল সেটটি লুপ করবেন, আউটপুট ফর্ম্যাট করে এটি প্রেরণ করবেন ঠিক যেমন আপনি অন্য কোনও সামগ্রী চান।


0

আপনার নিজের সিএসভি কোড লেখা সম্ভবত আপনার সময় নষ্ট, কেবল লীগ / সিএসভির মতো একটি প্যাকেজ ব্যবহার করুন - এটি আপনার জন্য সমস্ত কঠিন বিষয় নিয়ে কাজ করে, ডকুমেন্টেশনটি ভাল এবং এটি খুব স্থিতিশীল / নির্ভরযোগ্য:

http://csv.thephpleague.com/

আপনার সুরকার ব্যবহার করা দরকার। আপনি যদি না জানেন তবে কোন সুরকার আমি আপনাকে উচ্চারণ করার পরামর্শ দিচ্ছি: https://getcomposer.org/


0
<?
    // 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

পিএইচপি স্ক্রিপ্ট ব্যবহার করে সিএসভি ফাইলে কীভাবে লিখবেন? আসলে আমি এটিও সন্ধান করছিলাম। এটি পিএইচপি সহ এক ধরণের সহজ কাজ। fputs (হ্যান্ডলার, সামগ্রী) - এই ফাংশনটি আমার পক্ষে দক্ষতার সাথে কাজ করে। প্রথমে আপনাকে সেই ফাইলটি খুলতে হবে যাতে ফপেন ($ 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);
}

সংযোগের পরিবর্তে কোডটি নিজেই কোড যুক্ত করার পক্ষে সর্বদা পক্ষে থাকায় লিঙ্কগুলি সময়ের সাথে সাথে পরিবর্তন বা অদৃশ্য হয়ে যায়।
Sgoettschkes

আপনার উত্তরটি খুব পুরানো থ্রেডে। ২০০৮ সালে, আপনার নিজের কমা দ্বারা পৃথক করা লাইনগুলি তৈরি করার মানক অনুশীলন ছিল, পিএইচপি 5.1.0 থেকে সঠিক পদ্ধতিটি হ'ল বিল্ট ইন fputcsv ফাংশন ( php.net/fputcsv ) ব্যবহার করা। পুরানো থ্রেডগুলি পড়ার সময় সেগুলিতে থাকা তথ্যগুলি এখনও প্রাসঙ্গিক কিনা তা নিশ্চিত করার জন্য যত্ন নিন।
লুক মিলস

-1

$outputভেরিয়েবল সিএসভি ডেটা রাখুন এবং সঠিক শিরোনাম সহ প্রতিধ্বনিত করুন

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.