【问题标题】:putcsv formatting wrong when result is from pdo当结果来自 pdo 时,putcsv 格式错误
【发布时间】:2014-04-11 18:57:40
【问题描述】:

我正在尝试通过 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);
}

?>

【问题讨论】:

    标签: php mysql csv pdo fputcsv


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢你,清理了很多。实际上有点太多了。它正确输出第一行,仅此而已。只有一个,其余的都没有。 ://
    • 关于如何获取其余数据的任何想法?
    【解决方案2】:

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

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

    用\n尝试解决问题

    ini_set('auto_detect_line_endings', true);
    

    【讨论】:

    • PDO::FETCH_ASSOC 接缝将我的查询全部炸毁 -> 注意:未定义的偏移量:第 19 行 /blah/query2.php 中的 4
    • 是的,它破坏了我的第 19 行,这没什么大不了的,我只是将其注释掉。但实际上 PDO::FETCH_ASSOC 与上面的建议类似,输出第一行但没有别的。它似乎丢失了其余的查询。 i.imgur.com/6NSMEBP.png
    • 哦,改变 $fp = fopen('file.csv', 'w'); to $fp = fopen('file.csv', 'a');
    • fopen('file.csv', 'a');修好了
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多