2012-11-29 2 views
2

YAML 데이터 을 MySQL 데이터베이스에 저장, 수정 및 검색하는 기능이 필요합니다.PHP는 YAML을 구문 분석하고 값을 쉽게 수정하기 위해 DB에 저장 한 다음 나중에 원래 구조로 돌아갑니다.

내 프로젝트는 (그리고 질문은) 목표 :

  • 구문 분석 .yml 파일을 MySQL 데이터베이스
  • 로 PHP 다차원 배열
  • 스토어 이들에 내 개별 값의 수정을 허용 데이터베이스 기본 목표
  • 데이터베이스에서 값을 검색하고 구문 분석 한 다음 .yml 파일로 다시 배치하십시오.

1 단계 - 예제 YAML 파일

string 'name: 
    singular: null 
    plural: null 
fields: 
    price: 
    label: Preis 
    company_id: 
    label: null 
    placeholder: null' 

중요한 일이 여기에서 주목해야 할 중첩 된 키 무제한이 될 수 있으며, 또한 키와 값이있을 수 있습니다 동일한 이름/데이터.

2 단계 - 장소이 나는 YAML을 구문 분석 a library called Spyc을 사용하고있는 PHP 배열

에. 위대한 작품! 그것은 내게 다음을 제공합니다 :

array 
    'name' => 
    array 
     'singular' => null 
     'plural' => null 
    'fields' => 
    array 
     'price' => 
     array 
      'label' => string 'Preis' (length=5) 
     'company_id' => 
     array 
      'label' => null 
      'placeholder' => null 

내 목표는 다음 각각을 MySQL 데이터베이스에 저장하는 것입니다. 그래서 ...

3 단계 -을 CSV

여기

나는 다음과 같은 배열에 이러한 세부 사항을 분리하는 foreach()의 긴 목록 기본적으로 내 자신의 함수를 작성했습니다 :

array 
    0 => string 'name||singular||' (length=16) 
    1 => string 'name||plural||' (length=14) 
    2 => string 'fields||price||label||Preis' (length=27) 
    3 => string 'fields||company_id||label||' (length=27) 
    4 => string 'fields||company_id||placeholder||' (length=33) 

4 단계 - MySQL의 DB 논리적으로

, 나는 데이터베이스에 이러한 문자열을 저장하기 위해 노력하고있어. 스키마가 확실하지 않습니다. 나는 값이 열에 end($array[$key]이고, 열은 배열의 나머지 요소를 포함 할 것으로 추측하고 있습니다.

이렇게하면 효과적으로 데이터베이스 내에서 값을 변경하고 다시 구문 분석하여 .yml 파일로 되돌릴 수 있습니다.

5 단계 - 실종입니다!

그래서 지금 무엇을해야할지 모르겠습니다.현재 나는 다음과 같은 논리로 이러한 문자열 구문 분석하려고 해요 :

  • 마지막 값 end($array[$key]이되는 값으로, 배열의 이전의 모든 요소가 부모 열쇠를
  • 내가 일하는 그 코드를 입수하면
  • 그 문자열을 효과적으로 배열로 돌려 놓는 것이 다음 우선 순위가 될 것입니다.

더 좋은 방법이 있어야합니다. 내 주요 목표는 데이터베이스의 개별 값을 업데이트 할 수있게하는 것입니다. 내 주요 문제는 배열 차원 수가 일정하지 않다는 사실입니다. 내가 도움이 될 수있는 방법

저를 제공하십시오 : 내 프로젝트의 목표를 (상단 참조) 달성

  • 더 적절한 방법을이를 저장할 수있는
  • 가장 좋은 방법이있는 경우 값을 쉽게 수정할 수있는 데이터베이스의 데이터 (예 : 1 단계에서 볼 수있는 null)
  • 이 데이터를 데이터베이스에서 반환하면 retu 이 키와 값 을 원래 배열 (단계 2)의 정확한 구조으로 바꾸어서 Spyc을 사용하여 이것을 YAML로 다시 변환하고 .yml 파일로 출력 할 수 있습니다. 당신은 YAML로 직렬화 할 수있는 키 - 값 저장소를 만들려면

답변

2

, 당신은 아마 단지를 만들어야합니다 :이 경우

CREATE TABLE key_values(
    id INT PRIMARY KEY AUTO_INCREMENT, 
    parent_id INT, 
    type VARCHAR(255), 
    key VARCHAR(255), 
    value VARCHAR(255) 
) 

id는 루트 기록을 참조하는 방법입니다 , parent_id은 하위 레코드에서 연결하기위한 메커니즘으로 type은 배열 맵과 인덱싱 된 배열을 구별하는 데 사용됩니다. keyvalue은 각각의 값을 저장하는 데 사용됩니다.

이렇게하면 적절한 레코드를 생성 할 수 있습니다.

데이터의 예는 루트 노드 생성 할 수 있습니다 : 이전 INSERT 1

INSERT INTO key_values VALUES (parent_id, type, key, value) 
    VALUES (NULL, 'map', NULL NULL) 

그런 다음 id 추정 name 키의 값에 추가을했다 :

INSERT INTO key_values VALUES (parent_id, type, key, value) 
    VALUES (1, 'map', 'name' NULL) 

프로세스는 각 값에 대해 재귀 적으로 반복됩니다.

INSERT INTO key_values VALUES (parent_id, type, key, value) 
    VALUES (2, 'string', 'singular' NULL), 
     (2, 'string', 'plural' NULL) 

어쨌든이 모든 것에 대한 래퍼 클래스를 작성해야합니다. 사용하기에는 너무 복잡합니다.

실제로이 문제는 YAML을 그대로 LONGTEXT 필드에 저장하고 하루 만 부르는 것보다 훨씬 쉽습니다. 조작과 재 저장은 일반적으로 비용이 많이 들지 않습니다. 다중 계층 트리 구조를 반복하면됩니다.

순수 YAML 접근 방식의 경쟁 조건에서 쓰기를 중지하지 않도록 조심해야하지만, 절약 할 버전을 추적하는 revision 열을 사용하여 해결할 수없는 것은 없습니다. 구축하여 UPDATE 일치하지 않도록 :

UPDATE yamls SET value='...', revision=93 WHERE id=20 AND revision=92 

를 다른 프로세스가 이미 업데이트했다면 쿼리를 실행하는 데 실패하고 적절하게 처리 할 수있는 볼 것입니다.

+1

이것은 흥미 롭습니다! 나는 나중에 당신의 코드를 시도 할 것입니다. 원래 수정 된 선 주문 트리 순회를 보았습니다. http://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into- a-tree/192462 # 192462하지만이 방법이 훨씬 쉽고 효율적입니다. – Jimbo

+0

답안의 코드를 사용하여 모든 상위 키를 제공하는 하위 요소를 업데이트 할 수 있어야합니다. 이것이 바로 그 값에 접근하는 올바른 방법일까요? http://sqlfiddle.com/#!2/83c3c/5 내가 찾은 값과 전달 된 키에 따라이 문자열을 생성하는 PHP 함수를 작성할 수 있습니다.'func ($ value, array ($ key1, $ key2)); 예 : ... – Jimbo

+0

하나의 키 또는 여러 개의 키에 액세스하려는 경우 실제로 다릅니다. 'WHERE' 절에서'type'을 지정하는 것은 정보 용으로 만 필요하지 않습니다. – tadman

관련 문제