PHP कोड CSV में MySQL क्वेरी में परिवर्तित करने के लिए [बंद]


128

PHP में कृपया CSV में MySQL क्वेरी को CSV में बदलने का सबसे कारगर तरीका क्या है?

यह अस्थायी फ़ाइलों से बचने के लिए सबसे अच्छा होगा क्योंकि यह पोर्टेबिलिटी (dir पथ और आवश्यक फ़ाइल-सिस्टम अनुमतियों को सेट करना) को कम करता है।

CSV में फ़ील्ड नामों की एक शीर्ष पंक्ति भी शामिल होनी चाहिए।


73
इस प्रश्न को रचनात्मक के रूप में क्यों बंद किया गया था? यह ठीक है और पूरी तरह से स्पष्ट है।

14
@ एलेक क्योंकि यहां कुछ मॉडरेटर्स सुपर मॉडल हैं, आप जानते हैं ... "सुपरपावर के साथ बहुत जिम्मेदारी आती है!" - चाचा बेन
वित्तविहीनता

18
@finitenessofinfinity शक्ति भ्रष्ट, पूर्ण शक्ति भ्रष्ट बिल्कुल। Stackoverflow इसका एक उत्कृष्ट उदाहरण है।

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
तकनीकी रूप से, यह टैब-अलग है;)
जॉन Douthat

5
SELECT INTO OUTFILEविंडोज पर भी आगे के स्लैश के उपयोग पर ध्यान दें ।
जोहान

1
Hii यह xls प्रारूप के लिए ठीक काम करता है, लेकिन अगर मैं CSV फ़ाइल के रूप में सहेजने का प्रयास करता हूं तो यह 1 कॉलम में सभी परिणाम दिखाता है। मैं इसे csv फ़ाइल के रूप में सहेजना चाहता हूं।
विनोद रेड्डी

उपरोक्त दो में से कौन बेहतर है, सुरक्षित है और क्यों?
चेला जूल

1
मैं यह सुझाव देना चाहूंगा कि दूसरा विकल्प सुरक्षित है क्योंकि `इन्टू इनटू ऑउटीमर को mysql उपयोगकर्ता को फ़ाइलों को बदलने के लिए फाइल सिस्टम तक पहुँच की आवश्यकता होती है जो संभावित रूप से बड़ा जोखिम है।
जीपस्टोन

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!
जे.सेव

@ J.Steve मेरी खुशी :)
Jrgns

10
Mysqli का उपयोग करना: gist.github.com/jaredrummler/2bfcf48b48d3fefd50c2
Jared Rummler

1
mysql_num_fields () मेरे लिए काम नहीं कर रहा है और हेडर जेनरेट नहीं हो रहा है। इस समारोह में पदावनत है या कुछ और?
डग

20

को देखो प्रलेखन का चयन करें ... जांच outfile वाक्य रचना के बारे में।

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

आधुनिक MySQL के लिए, आप उपयोग कर सकते हैं: $ हेडर [] = mysqli_fetch_field_direct ($ परिणाम, $ i) -> नाम;
CA

और अन्य mysql_ फ़ंक्शन को mysqli_ फ़ंक्शन में बदलें।
CA

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

यह एक CSV को mysql परिणाम का उपयोग करके एक स्ट्रीम में भेजता है

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

यह एक फ़ाइल को CSV लिखने के लिए उपरोक्त फ़ंक्शन का उपयोग करता है, जिसे $ फ़ाइलनाम द्वारा दिया गया है

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 ($ परिणाम)) {fputcsv ($ स्ट्रीम, $ पंक्ति); $ पंक्तियों ++; }, मैं ($ पंक्ति = mysql_fetch_row ($ परिणाम)) {$ डेटा [] = दूसरी पंक्ति का उपयोग करना था; // fputcsv ($ स्ट्रीम, $ पंक्ति); // $ पंक्तियों ++; } फॉर्च्यू ($ d के रूप में $ डेटा) {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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.