2012-02-03 86 views
0

我想要做的是将SQL查询导出到.csv文件,以便用户可以下载它。查询或多或少是这样的:在drupal中创建.csv /文本文件

SELECT * FROM {registered} WHERE pending = 'Y' 

我想要查询的结果将被放在一个.csv文件,我也想在问题中的行与未决=“N”和completed_time更新= NOW()。

我也希望标题包含在顶部。

是否有任何标准的drupal函数应该使用或者我应该简单地使用file_create_filename函数,然后以普通的php方式创建文件?

我想这样做是这样的:不幸的是

// Save query data 
$result = db_query("SELECT * 
        INTO OUTFILE '/tmp/myfile-raw' 
        FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n' 
        FROM {plan_tax_red_registered}"); 

if (!$result) { 
    echo 'Failed saving query\n'; 
    return ; 
} 

$file = fopen("/tmp/myfile-raw","rw+"); 

if (!$file) { 
    echo 'Failed opening again\n'; 
    return ; 
} 

// Might be uneccessary but database fields can change 
$columns = db_query("SHOW FIELDS FROM {plan_tax_red_registered}"); 
$list_of_columns = array(); 
while ($res = db_fetch_array($columns)) { 
    $list_of_columns[] = $res['Field']; 
} 

$header = implode(";", $list_of_columns); 

// Get the contents from the raw file 
$old_content = file_get_contents($file); 

// Save result 
$csv_file = fopen("/tmp/result.csv","rw+"); 

if (!$csv_file) { 
    echo "Failed opening csv file\n"; 
    return; 
} 

fwrite($csv_file, $header . "\n" . $old_content); 

fclose($file); 

fclose($csv_file); 

,我无法打开CSV文件:(

我知道我可以简单地这样做是为了显示文件:

function plan_tax_red_export_to_excel($result, $filename = 'myfile.csv'){ 
    drupal_set_header('Content-Type: text/csv'); 
    drupal_set_header('Content-Disposition: attachment; filename=' . $filename); 

    $count = mysql_num_fields($result); 
    for($i = 0; $i < $count; $i++){ 
    $header[] = mysql_field_name($result, $i); 
    } 
    print implode(';', $header) ."\r\n"; 

    while($row = db_fetch_array($result)){ 
    foreach($row as $value){ 
     $values[] = '"' . str_replace('"', '""', decode_entities(strip_tags($value))) . '"'; 
    } 
    print implode(';', $values) ."\r\n"; 
    unset($values); 
    } 
} 

但是我想更新内容(将is_pending字段设置为'N'并且completed_time设置为NOW())。

你有什么想法?任何帮助表示赞赏:)

亲切的问候, 塞缪尔

回答