以多种格式输出数据库信息

Posted

技术标签:

【中文标题】以多种格式输出数据库信息【英文标题】:Outputting database information in multiple formats 【发布时间】:2012-07-27 03:31:58 【问题描述】:

我目前正在创建一个 CMS,CMS 的主要功能之一是数据馈送系统。该网站将其数据库之一的内容传输到大量列表站点。每个站点都有自己的信息格式规范,我的任务是创建一个后端,可以用来为非程序员轻松修改和添加数据馈送。

到目前为止,在我收到的三种文件类型中,XML、CSV 和 TXT。即使在这些文件类型中,也有不同的格式化标准,不同的字段顺序,有些有引号,有些没有,等等。我对此感到困惑一段时间,这是我的解决方案:

每个提要都有一个模板存储在单独的数据库表中。模板将包含提要所需的任何结构(XML、CSV、TXT)和占位符值(例如 NAME)。然后脚本将遍历每个数据库条目,用变量值替换占位符,并使用正确的文件扩展名保存完成的文档。

我的问题是弄清楚如何使用一个 php 文件保存多个文件(可能从另一个 PHP 文件多次调用同一个文件?),此外,如何保存不同的文件类型。基本上,如何设置扩展名并保存文件?

【问题讨论】:

【参考方案1】:

我建议使用面向对象的方法来解决所有这些问题:

1)为需要将每个对象转换成的每个数据类型创建接口

interface xmlSerializable 
    public function toXML();


interface csvSerializable 
    public function toCSV();


interface txtSeriablizable() 
    public function toTXT();

2)创建一个类来表示您需要为您的客户和implement每个接口序列化为不同格式的数据类型

class Data implements xmlSerializeable  // I only implemented one for brevity
    private $id         = null;
    private $stuff      = null;
    private $otherStuff = null;
    private $stuffArray = array();

    public __construct($id, $stuff, $otherStuff, $stuffArray) 
        $this->id         = $id;
        $this->stuff      = $stuff;
        $this->otherStuff = $otherStuff;
        $this->stuffArray = $stuffArray;
    

    public function getId()  return $this->id; 

    public function toXML() 
        $output = '<?xml version="1.0" encoding="UTF-8"?>'."\n".
                  '<data>'."\n\t".
                  '<id>'.$this->id.'</id>'."\n\t".
                  '<stuff>'.$this->stuff.'</stuff>'."\n\t".
                  '<otherStuff>'.$this->otherStuff.'</otherStuff>'."\n\t".
                  '<stuffArray>'."\n\t\t";

        foreach($this->stuffArray as $stuff) 
            $output .= '<stuff>'.$stuff.'</stuff>'."\n\t\t";
        

        $output .= '</stuffArray>'."\n".
                   '</data>';

        return $output;
    

现在您可以通过创建一个接受 SQL 查询并返回 Data 对象数组的 DataFactory 从您的数据库中创建 Data 对象。要序列化它们,只需调用您为每种格式实现的方法:

$df    = new DataFactory($pdo);
$datas = $df->query('SELECT * FROM Data');

foreach($datas as $data) 
    file_put_contents('/data/xml/'.$data->getId().'.xml', $data->toXML());
    // You can add other formats here in the above fashion

【讨论】:

我喜欢这种方法,并且我最初想做这样的事情(尽管没有经过深思熟虑)。然而,部分问题在于随着时间的推移可能会有 30-40 种不同的格式,甚至更多。例如,一个站点希望 .csv 看起来像 'value1,value2,value3...' 而另一个站点希望它看起来像 '"value1","value2","value3"...' 所以我需要一个简单的某人更改序列化函数的方法(不是 php 程序员的人)。 根据Wikipedia,在某些情况下,CSV 文档中引用的值是必要的,而不是选项。 PHP 具有输出正确 CSV 数据的功能(请参阅fputcsv(),但您必须在内存中创建一个流才能使用它)。只要您的客户使用符合 CSV 标准的函数解析数据,那么您就不必担心满足他们的个性化需求。 它们可能不符合标准。即使 CSV 是标准的,到目前为止我收到的每个 XML 模板都与其他模板完全不同。不过,管道分隔似乎没有太大差异。 @ChrisG 这是你的 API。你不应该把标准强加给他们,而不是强加给你吗? 这不是我的 API,它是网络上的各种列表站点。我们的网站将在大约 20 个网站上投放广告,每个网站都接受我们必须制作的不同的传出数据馈送。相信我,我希望我可以让 ebay/craigslist 以我的方式去做,但没有骰子。【参考方案2】:

您可以像保存第一个文件一样保存多个文件。

如果您有$filecontent 中的文件内容,以及$filepath 中要使用的文件名(带有适当的扩展名),则可以使用

file_put_contents($filename, $filecontent)

在你的循环中这样做,你就完成了。

对于details on file_put_contents, see its php manual page。

【讨论】:

以上是关于以多种格式输出数据库信息的主要内容,如果未能解决你的问题,请参考以下文章

格式化输出输入一二事

EasyClick log 输出格式化

EasyClick log 输出格式化

python中有多种标准输出格式,以下四种为常见的4种标准输出格式

Python的用户交互程序及格式化输出

python筛选特定文件的信息按照格式输出到txt