একটি মাইএসকিউএল কোয়েরি সিএসভিতে রূপান্তর করতে পিএইচপি কোড [বন্ধ]


128

মাইএসকিউএল কোয়েরিটি পিএইচপি-তে সিএসভিতে রূপান্তর করার সবচেয়ে কার্যকরী উপায় কী?

টেম্প ফাইলগুলি এড়ানো ভাল হবে কারণ এটি বহনযোগ্যতা হ্রাস করে (ডিয়ার পাথ এবং ফাইল-সিস্টেমের প্রয়োজনীয় অনুমতিগুলি নির্ধারণ করে)।

সিএসভিতে ফিল্ডের নামের একটি শীর্ষ রেখাও অন্তর্ভুক্ত করা উচিত।


73
এই প্রশ্নটি গঠনমূলক না বলে কেন বন্ধ করা হয়েছিল? এই এক ভাল এবং পুরোপুরি পরিষ্কার।

14
@ অ্যালেক কারণ এখানে কিছু মডারেটর সুপারমোডেটর, তাই আপনি জানেন ... "পরাশক্তিগুলির সাথে মহান দায়িত্ব আসে!" - চাচা বেন
ফাইনটেনেসফিনফিনিটি

18
@ ফিনিটিনেসফিনফিনিটি শক্তি দূষিত করে, পরম শক্তি একেবারে দূষিত হয়। স্ট্যাকওভারফ্লো এটির একটি দুর্দান্ত উদাহরণ।

16
আমি এই প্রশ্নটি আবার খুলতে ভোট দিচ্ছি!
TN888

9
ছয় মাস পরে এবং আমি এর উত্তরগুলি আমার ওয়েবসাইটে ব্যবহার করছি। এটি আবার খোলা যেতে পারে?
জন

উত্তর:


138
SELECT * INTO OUTFILE "c:/mydata.csv"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
FROM my_table;

(এর জন্য ডকুমেন্টেশন এখানে রয়েছে: http://dev.mysql.com/doc/refman/5.0/en/select.html )

বা:

$select = "SELECT * FROM table_name";

$export = mysql_query ( $select ) or die ( "Sql error : " . mysql_error( ) );

$fields = mysql_num_fields ( $export );

for ( $i = 0; $i < $fields; $i++ )
{
    $header .= mysql_field_name( $export , $i ) . "\t";
}

while( $row = mysql_fetch_row( $export ) )
{
    $line = '';
    foreach( $row as $value )
    {                                            
        if ( ( !isset( $value ) ) || ( $value == "" ) )
        {
            $value = "\t";
        }
        else
        {
            $value = str_replace( '"' , '""' , $value );
            $value = '"' . $value . '"' . "\t";
        }
        $line .= $value;
    }
    $data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );

if ( $data == "" )
{
    $data = "\n(0) Records Found!\n";                        
}

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=your_desired_name.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data";

5
প্রযুক্তিগতভাবে, এটি ট্যাব-বিচ্ছিন্ন;)
জন ডাউটহাট

5
SELECT INTO OUTFILEএমনকি উইন্ডোতেও ফরোয়ার্ড স্ল্যাশের ব্যবহার নোট করুন ।
জোহান

1
হাই এটি এক্সএলএস ফর্ম্যাটের জন্য দুর্দান্ত কাজ করে তবে আমি যদি সিএসভি ফাইল হিসাবে সংরক্ষণ করার চেষ্টা করি তবে এটি 1 কলামে সমস্ত ফলাফল দেখায়। আমি এটি সিএসভি ফাইল হিসাবে সংরক্ষণ করতে চাই।
বিনোদ রেডি

উপরোক্ত দুটির মধ্যে কোনটি ভাল, নিরাপদ এবং কেন?
চেলা

1
আমি দ্বিতীয় বিকল্পটি আরও নিরাপদ বলে প্রস্তাব দিচ্ছি O আউটফিলের মধ্যে নির্বাচন করুন মাইএসকিএল ব্যবহারকারীকে ফাইলগুলি পরিবর্তন করার জন্য ফাইল সিস্টেমের অ্যাক্সেস থাকা দরকার যা একটি সম্ভাব্য বড় ঝুঁকি।
জিপস্টোন

91

এই প্রশ্ন / উত্তর দেখুন । এটি @ জিওফের চেয়ে আরও সংক্ষিপ্ত, এবং বিল্টিন এফপুটসিএসভি ফাংশনটিও ব্যবহার করে।

$result = $db_con->query('SELECT * FROM `some_table`');
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++) {
    $headers[] = mysql_field_name($result , $i);
}
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    header('Pragma: no-cache');
    header('Expires: 0');
    fputcsv($fp, $headers);
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    die;
}

1
আপনার কলাম শিরোনাম নেই।
পাওলো বার্গান্টিনো

15
আমার মতো অন্য যে কেউ বোকা, php://outputপ্রকৃত ফাইলের নাম দিয়ে প্রতিস্থাপন করবেন না বা শেষের দিকে এটি বন্ধ করার চেষ্টা করবেন fcloseনা: এটি আসল ফাইল নয়, আউটপুট স্ট্রিমের জন্য কেবল একটি নাম। যাইহোক এই উত্তরটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে, ধন্যবাদ Jrgns!
জেস্টেভ

@ জে.স্টেভ আমার আনন্দ :)
জার্গন্স


1
mysql_num_fields () আমার পক্ষে কাজ করছে না এবং শিরোনাম উত্পন্ন হচ্ছে না। এই ফাংশনটি অবচিত বা অন্য কিছু?
ডগ

20

নির্বাচন করুন ... ইন আউটফিল সিনট্যাক্স সম্পর্কিত ডকুমেন্টেশন দেখুন ।

SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM test_table;

18

@Jrgns (কিছুটা সামান্য সিনট্যাক্স পার্থক্য সহ) সমাধানের একটি আপডেট

$result = mysql_query('SELECT * FROM `some_table`'); 
if (!$result) die('Couldn\'t fetch records'); 
$num_fields = mysql_num_fields($result); 
$headers = array(); 
for ($i = 0; $i < $num_fields; $i++) 
{     
       $headers[] = mysql_field_name($result , $i); 
} 
$fp = fopen('php://output', 'w'); 
if ($fp && $result) 
{     
       header('Content-Type: text/csv');
       header('Content-Disposition: attachment; filename="export.csv"');
       header('Pragma: no-cache');    
       header('Expires: 0');
       fputcsv($fp, $headers); 
       while ($row = mysql_fetch_row($result)) 
       {
          fputcsv($fp, array_values($row)); 
       }
die; 
} 

কোনও কারণে $ fp আমার কাছে মিথ্যা প্রত্যাবর্তন করে।
ভোল্টিল 3

আধুনিক মাইএসকিউএল-এর জন্য আপনি ব্যবহার করতে পারেন: ers শিরোলেখ [] = mysqli_fetch_field_direct ($ ফলাফল, $ i) -> নাম;
বেন সিএ

এবং অন্যান্য mysql_ ফাংশনগুলি mysqli_ ফাংশনে পরিবর্তন করুন।
বেন সিএ

6

আপনি যদি ডাউনলোডটি ডাউনলোডের মতো প্রস্তাব দিতে চান যা সরাসরি এক্সেলের মধ্যে খোলা যেতে পারে তবে এটি আপনার পক্ষে কাজ করতে পারে: (আমার কোনও পুরানো অপ্রকাশিত প্রকল্প থেকে অনুলিপি করা হয়েছে)

এই ফাংশনগুলি শিরোনাম সেটআপ করে:

function setExcelContentType() {
    if(headers_sent())
        return false;

    header('Content-type: application/vnd.ms-excel');
    return true;
}

function setDownloadAsHeader($filename) {
    if(headers_sent())
        return false;

    header('Content-disposition: attachment; filename=' . $filename);
    return true;
}

এটি মাইএসকিএল ফলাফল ব্যবহার করে একটি স্ট্রিমে একটি সিএসভি প্রেরণ করে

function csvFromResult($stream, $result, $showColumnHeaders = true) {
    if($showColumnHeaders) {
        $columnHeaders = array();
        $nfields = mysql_num_fields($result);
        for($i = 0; $i < $nfields; $i++) {
            $field = mysql_fetch_field($result, $i);
            $columnHeaders[] = $field->name;
        }
        fputcsv($stream, $columnHeaders);
    }

    $nrows = 0;
    while($row = mysql_fetch_row($result)) {
        fputcsv($stream, $row);
        $nrows++;
    }

    return $nrows;
}

One ফাইলের নাম দ্বারা প্রদত্ত কোনও ফাইলের সিএসভি লেখার জন্য এটি উপরের ফাংশনটি ব্যবহার করে

function csvFileFromResult($filename, $result, $showColumnHeaders = true) {
    $fp = fopen($filename, 'w');
    $rc = csvFromResult($fp, $result, $showColumnHeaders);
    fclose($fp);
    return $rc;
}

এবং এখানেই যাদু ঘটে;)

function csvToExcelDownloadFromResult($result, $showColumnHeaders = true, $asFilename = 'data.csv') {
    setExcelContentType();
    setDownloadAsHeader($asFilename);
    return csvFileFromResult('php://output', $result, $showColumnHeaders);
}

উদাহরণ স্বরূপ:

$result = mysql_query("SELECT foo, bar, shazbot FROM baz WHERE boo = 'foo'");
csvToExcelDownloadFromResult($result);

1
ধন্যবাদ জন খুব দরকারী কোড। CsvFromResult ফাংশনের জন্য একটি লাইন পরিবর্তন করতে হয়েছিল। পরিবর্তে ($ সারি = mysql_fetch_row ($ ফলাফল)) put fputcsv ($ প্রবাহ, $ সারি); $ সারি ++,; }, আমাকে ($ সারি = mysql_fetch_row ($ ফলাফল)) {$ ডেটা [] = $ সারিতে ব্যবহার করতে হয়েছিল; // fputcsv ($ প্রবাহ, $ সারি); // $ সারি ++; } foreach ($ d হিসাবে ডেটা) put fputcsv ($ প্রবাহ, $ d); । এমন দুর্দান্ত কোডের জন্য আবার ধন্যবাদ
কোডিংবিবিকি

3
// Export to CSV
if($_GET['action'] == 'export') {

  $rsSearchResults = mysql_query($sql, $db) or die(mysql_error());

  $out = '';
  $fields = mysql_list_fields('database','table',$db);
  $columns = mysql_num_fields($fields);

  // Put the name of all fields
  for ($i = 0; $i < $columns; $i++) {
    $l=mysql_field_name($fields, $i);
    $out .= '"'.$l.'",';
  }
  $out .="\n";

  // Add all values in the table
  while ($l = mysql_fetch_array($rsSearchResults)) {
    for ($i = 0; $i < $columns; $i++) {
      $out .='"'.$l["$i"].'",';
    }
    $out .="\n";
  }
  // Output to browser with appropriate mime type, you choose ;)
  header("Content-type: text/x-csv");
  //header("Content-type: text/csv");
  //header("Content-type: application/csv");
  header("Content-Disposition: attachment; filename=search_results.csv");
  echo $out;
  exit;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.