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

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

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

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

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

【问题讨论】:

    标签: php sql xml csv datafeed


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2015-11-26
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多