2012-07-28 7 views
0

현재 CMS를 만들고 있으며 CMS의 주요 기능 중 하나는 데이터 피드 시스템입니다. 웹 사이트는 데이터베이스 중 하나의 내용을 다수의 목록 사이트로 전송하는 것입니다. 각 사이트는이 정보의 서식 지정에 대한 자체 사양을 가지고 있으며 프로그래머가 아닌 사용자도 쉽게 데이터 피드를 수정하고 추가 할 수있는 백엔드를 작성해야했습니다.데이터베이스 정보를 여러 형식으로 출력

지금까지 형식 중 XML, CSV 및 TXT라는 세 가지 파일 형식이있었습니다.

  • : 심지어 이러한 파일 형식, 필드의 순서가 달라질 내부 포맷에 대해 서로 다른 기준이 있습니다, 일부는 일부는 여기 등 나는 잠시 동안이 이상 수수께끼 봤는데,하지 않으며, 인용을하는 것은 내 솔루션입니다 각 피드에는 별도의 데이터베이스 테이블에 저장된 템플릿이 있습니다. 템플릿은 피드에 필요한 구조 (XML, CSV, TXT)와 자리 표시 자 값 (예 : {{NAME}})으로 구성됩니다. 그런 다음 스크립트는 각 데이터베이스 항목을 반복하고 자리 표시자를 변수 값으로 바꾸고 완성 된 문서를 올바른 파일 확장명으로 저장합니다.

내 문제는 (? 아마도 같은 파일을 다른 PHP 파일에서 여러 번 호출) 하나 개의 PHP 파일을 사용하여 여러 파일을 저장하는 방법을 파악하고 또한 어떻게이 같은 다른 파일 형식을 저장합니다. 기본적으로 확장을 설정하고 파일을 저장하려면 어떻게해야합니까?

답변

1

첫 번째 파일을 저장하는 것처럼 여러 파일을 저장합니다. 당신이 $filepath에서 $filecontent에있는 파일의 내용 및 (적절한 확장자) 사용되는 파일 이름이있는 경우

, 당신은 당신의 루프에서이 작업을 수행

file_put_contents($filename, $filecontent) 

를 사용하면됩니다.

details on file_put_contents, see its php manual page.

1

나는이의 모든 객체 지향 접근 방식을 권하고 싶습니다 : 각 데이터 유형에 대한 데이터

1) 만들기 인터페이스하는 각이

interface xmlSerializable { 
    public function toXML(); 
} 

interface csvSerializable { 
    public function toCSV(); 
} 

interface txtSeriablizable() { 
    public function toTXT(); 
} 

2)는 객체 생성 변환해야하는 방법 클라이언트 용으로 서로 다른 형식으로 serialize해야하는 데이터 유형을 나타내는 클래스 및 각 인터페이스가 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 
} 
+0

나는 접근 방식을 좋아하고 (물론 밖으로 생각하지 않지만) 나는 처음에 이런 일을하고 싶어 : 그러한 직렬화는, 당신이 각 형식에 대한 구현 된 메서드를 호출합니다. 그러나 문제의 일부는 30-40 가지 형식이있을 수 있으며 시간이 갈수록 더 많아지는 것입니다. 예를 들어 .csv는 'value1, value2, value3 ...'처럼 보이기를 원하지만 다른 사이트에서는 'value1', 'value2', 'value3'...처럼 보이기를 원합니다. 누군가가 serialize 함수 (PHP 프로그래머가 아닌 사람)를 변경하는 방법. – pzuraq

+0

[Wikipedia] (http : //en.wikipedia.org/wiki/Comma-separated_values)를 사용하는 경우 CSV 문서의 인용 값은 옵션이 아닌 필수 사항입니다. PHP는 적절한 CSV 데이터를 출력하는 기능을 가지고 있습니다 ([fputcsv()] (http://php.net/fputcsv)를 참조하십시오.하지만 메모리와 함께 사용하려면 스트림을 만들어야합니다). 고객이 CSV 표준을 준수하는 기능을 사용하여 데이터를 파싱하는 한 개인의 필요에 맞추는 것에 대해 걱정할 필요가 없습니다. –

+0

표준에 미치지 못할 수도 있습니다. CSV가 표준이지만, 지금까지받은 각 XML 템플릿은 다른 템플릿과 근본적으로 다릅니다. 파이프로 구분 된 값은 큰 차이가없는 것 같습니다. – pzuraq