在CakePHP中以CSV格式导出mysql数据

时间:2014-07-30 11:08:59

标签: php cakephp csv

在CakePHP中,使用以下代码我尝试以CSV格式导出用户电子邮件。 我得到了错误。

Code Refrence site

错误:

Notice (8): Undefined offset: 0 [APP\View\Frontusers\admin_exportemails.ctp, line 12]

Warning (2): fputcsv() expects parameter 2 to be array, null given [APP\View\Helper\CsvHelper.php, line 36]

Notice (8): Undefined offset: 1 [APP\View\Frontusers\admin_exportemails.ctp, line 12]

Warning (2): fputcsv() expects parameter 2 to be array, null given [APP\View\Helper\CsvHelper.php, line 36]

admin_exportemails.ctp

$line= $useremails[0]['Frontuser'];
$this->CSV->addRow(array_keys($line));

foreach ($useremails as $key => $useremail)
{
      $line =$useremail[$key]['Frontuser'];
       $this->CSV->addRow($line);
}
$filename='useremails';
echo  $this->CSV->render($filename);

5 个答案:

答案 0 :(得分:1)

$useremail[$key]['Frontuser'];

应该是

$useremail['Frontuser'];

实际上,您的代码根本不需要在foreach循环中包含密钥。

这是PHP 101,所以有关详细信息,请参阅手册: http://php.net/foreach

答案 1 :(得分:1)

您可以简单地在该函数中传递数据数组,并在webroot文件夹中生成csv。 注意: - 1.您应该将空白的csv文件放在webroot文件夹中。        2.您应该将所有信息存储在一个子数组中,该子数组只包含非模型索引的值。

function generate_csv($data_array=array()){
//        pr($data_array);die;

        foreach ($data_array as $key => $value) { 
            $newdata[] = $key.','.$value;
        }

//        pr($newdata);die;
    $f = fopen(APP.'webroot/csv_file.csv', 'w+');

    foreach ($newdata as $line) { 
        fputcsv($f, array($line), ','); 
    }

    fseek($f, 0);

    fclose($f);
    }

答案 2 :(得分:1)

你弄乱了你的foreach。您将其拆分为$key$useremail子数组,这是正常的。但是然后你迭代它并尝试再次访问$useremail[$key]['Frontuser'],这在那时是不存在的。

foreach ($useremails as $key => $useremail)

这会导致原始[0]数组中的[1]$useremails设置为$key,但您会遍历$useremails上的所有项目,所以你可以简单地说:

$line = $useremail['Frontuser'];

您不需要$key,因为这不是迭代项目的一部分,例如你的foreach第一次跑,它看到了:

[Frontuser] => Array
    (
        [name] => Rash
        [email] => rash.com
    )

在第二次迭代中它看到了:

[Frontuser] => Array
    (
        [name] => John
        [email] => john@gmail.com
    )

因此,不再有[0][1]索引。

答案 3 :(得分:1)

你在for循环中犯了错误并以错误的方式迭代它。只需从foreach循环中省略下面的行。

$ line = $ useremail [$ key] [' Frontuser'];

答案 4 :(得分:0)

这里有两个选项
1.将文件夹中的csv文件保存到浏览器并输出 2.将输出发送到浏览器

function generate_csv($data_array = array()) {

    //$f = fopen(APP . 'webroot/files/unsaved_bars.csv', 'w+'); // for save csv file in folder not sent output to browser 
    $f = fopen("php://output", "a"); // for send output to browser 

    $headers[] = array('id','name','other_info'); // for header row
    $data_array = array_merge($headers, $data_array);

    foreach ($data_array as $line) {
        fputcsv($f, $line, ',');
    }
    //fseek($f, 0);
    fclose($f);
}