以多种格式输出数据库信息
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。
【讨论】:
以上是关于以多种格式输出数据库信息的主要内容,如果未能解决你的问题,请参考以下文章