0

我正在尝试通过 pdo 从数据库导入数据并将结果输出到 csv 文件。我能够正确输出到屏幕,但 csv 中的格式是狂野的,双重名称,没有 '\n'

<?php
require_once('auth.php');
$conn = new PDO("mysql:host=localhost;dbname=$dbname", $username, $pw);

if (($handle = fopen("nameList2.txt", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, "        ")) !== FALSE) {
                $firstname = $data[0];
                $lastname = $data[1];
                $stmt = $conn->prepare("SELECT * FROM list WHERE FName = :firstname AND LName = :lastname");
                $stmt->bindParam(':firstname', $firstname);
                $stmt->bindParam(':lastname', $lastname);
                $stmt->execute();
                $result = $stmt->fetchAll();
                //var_dump($firstname);
                //var_dump($lastname);
                //var_dump($result);
                $fp = fopen('file.csv', 'w');
                foreach($result as $chunk){
                        echo $chunk[4]."        ".$chunk[6]."   ".$chunk[7]."   ".$chunk[10]."  ".$chunk[11]."".$chunk[12]."  ".$chunk[13]."  ".$chunk[18]."  ".$chunk[19]."  ".$chunk[20]."<br />";
                        fputcsv($fp, $chunk);
                }
                fclose($fp);
        }
        fclose($handle);
        //fclose($fp);
}

?>

在此处输入图像描述

4

2 回答 2

0

双重名称的问题是因为您没有正确使用 fetchAll() 方法:
您在 $result 中获得了两次名称。使用它:

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

要解决问题,请尝试使用 \n

ini_set('auto_detect_line_endings', true);
于 2014-04-11T19:08:53.200 回答
0

您正在提供fputcsv错误的数据,因此它会给您带来错误的输出。具体来说,fetchAll将每一行检索为具有数字键和字符串键的数组,因此每个值出现两次。

通过适当设置获取模式来解决此问题,例如

$result = $stmt->fetchAll(PDO::FETCH_NUM);

目前还不清楚行尾的问题是什么——你没有说,我也不能从截图中看出。可以肯定的是,它将fputcsv单个换行符写入行终止字符。虽然绝大多数程序会正确检测和处理这些 Unix 风格的行尾,但还有一些其他程序(例如记事本)不会。

于 2014-04-11T19:14:41.603 回答