لدي بيانات في قاعدة بيانات MySQL. أُرسل للمستخدم عنوان URL لإخراج بياناته كملف CSV.
لدي بريد إلكتروني للرابط ، واستعلام MySQL ، إلخ.
كيف يمكنني ، عندما ينقرون على الرابط ، أن يكون لدي نافذة منبثقة لتنزيل CVS بالسجل من MySQL؟
لدي كل المعلومات للحصول على السجل بالفعل. لا أرى كيفية إنشاء 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")
));
فيما يلي نسخة محسّنة من الوظيفة من 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()
بعد استدعاء هذا إذا انتهيت من الصفحة.
بالإضافة إلى كل ما قيل بالفعل ، قد تحتاج إلى إضافة:
header("Content-Transfer-Encoding: UTF-8");
يكون هذا مفيدًا جدًا عند التعامل مع الملفات بلغات متعددة فيها ، مثل أسماء الأشخاص أو المدن.
أعرف أن الخيط قديم بعض الشيء ، ولكن للرجوع إليه مستقبلاً وللنوب في نفسي:
يشرح كل شخص آخر هنا كيفية إنشاء ملف CSV ، لكنه يفقد جزءًا أساسيًا من السؤال: كيفية الارتباط. من أجل الارتباط لتنزيل ملف CSV ، يمكنك فقط الارتباط بملف .php ، والذي يستجيب بدوره لكونه ملف بتنسيق .csv. الرؤوس PHP تفعل ذلك. هذا يتيح للأشياء الرائعة ، مثل إضافة المتغيرات إلى querystring وتخصيص الإخراج:
<a href="my_csv_creator.php?user=23&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);
فيما يلي مثال عملي كامل باستخدام 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);
}
أولاً ، قم بإجراء البيانات كسلسلة ذات فاصلة كمحدد (مفصولة بـ "،"). شيء من هذا القبيل
$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);
أسهل طريقة هي استخدام فئة مخصصة 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 باستخدام 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);
}
لجعله يرسله كملف CSV ويطلب منه إعطاء اسم الملف ، استخدم header ():
header('Content-type: text/csv');
header('Content-disposition: attachment; filename="myfile.csv"');
وبقدر ما يتعلق الأمر بإنشاء ملف CSV نفسه ، يمكنك فقط تنفيذ مجموعة النتائج وتنسيق الإخراج وإرساله ، تمامًا كما تفعل مع أي محتوى آخر.
هنا واحد قمت به من قبل ، والاستيلاء على البيانات بين تواريخ معينة. آمل أن يساعد.
<?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;
}
?>
<?
// 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 الخاص بك مضيعة لوقتك ، ما عليك سوى استخدام حزمة مثل league/csv - فهي تتعامل مع جميع الأشياء الصعبة بالنسبة لك ، والوثائق جيدة ومستقرة/موثوقة للغاية:
ستحتاج إلى استخدام الملحن. إذا كنت لا تعرف الملحن ، فأنا أوصي بشدة أن يكون لديك نظرة: https://getcomposer.org/