2009-07-18 2 views
4

PDO 데이터베이스 추상화 라이브러리를 사용하여 내 코드가 이식 가능한지 확인합니다. 그러나 이제 컬럼 정보가 필요하다는 것을 알게되었으므로 다소 표준화되기를 기대하면서 PDOStatement->getColumnMeta() 메소드로 바뀌 었습니다. 그러나 실제로 발견 한 바에 따르면 실제로는 제한이없는 것으로 보입니다. SQLite는에서 해당 메서드를 호출 할 때PDO 용 PHP native_type 목록 getColumnMeta()

예를 들어, 당신이 사용할 수있는 값의 한 세트 얻을 것 같다

http://gcov.php.net/PHP_5_3/lcov_html/pdo_sqlite/sqlite_statement.c.gcov.php

null 
double 
blob 
string 
integer 
... 

을하는 동안 MySQL 데이터베이스 목록에서 전화 다른 이상한 값의 모든 종류의 : http://gcov.php.net/PHP_5_3/lcov_html/pdo_mysql/mysql_statement.c.gcov.php

var_string 
longlong 
newdecimal 
geometry 
... 

나는 또한 잘못된 위치에보고 될 수 있지만, 난 그냥 유용한 D를 찾을 수 없습니다 ata on "native_type"값은 데이터베이스를 전환 할 때 어떤 값이 될 수 있습니다.

답변

3

추상화 가벼운 무게를 유지하기 위해 의도적으로 정의되지 않은 상태로 있었던 PDO 영역 중 하나입니다.

PDO는이 방법에 대한 유형의 표준 표현을 정의하지 않습니다. 각 운전 기사는 여기에 무엇이 돌아올 수 있는지에 대한 아이디어를 가지고 있습니다.

+5

정말 수치 스럽습니다. 사람들이 표준을 정의하지 않은 표준화 된 액세스 계층을 사용하는 이유는 무엇입니까? – Xeoncross

3

PDO는 이 아니며은 데이터베이스 추상화입니다. 통합 액세스 계층은 "유일한"것입니다. 다른 데이터베이스 시스템으로 전환하면 대부분 코드를 변경해야합니다. 각 (특정) 데이터베이스 드라이버는 고유 한 값 집합을 반환하며 드라이버에 대한 "변환 계층"은 없습니다. decl_type 정보는 getColumnMeta() 결과의 native_type/pdo_type 필드를 넘어서 있습니다.

+0

죄송합니다. PDO 위에 데이터베이스 추상화 레이어를 만들었습니다. 그게 제가 언급 한 것입니다.어쨌든, 네이티브 _ 유형/pdo_type 필드가 통일 된 권리라고 말하는 것 같군요? 거기에 반환 될 수있는 유형의 집합 번호가 무엇입니까? – Xeoncross

+0

그러면 아마 pdo_type이 될 것입니다. 나는. PDO :: PARAM_BOOL, PDO :: PARAM_NULL, ... http://php.net/pdo.constants – VolkerK

+0

내 의견을 보지 못했다고 생각합니다.) – Xeoncross

-1

공유 할 수 있다고 생각했습니다. 내가 지금까지 가지고있는 것. native_type과 pdo_type은 매우 다른 값을 반환하기 때문에 "len"을 사용하여 문자열 대 텍스트를 테스트하려고합니다. 255 미만의 문자는 모두 var char, int 또는 boolean이므로 테스트하고 있습니다. 또한 pdo_type에는 가능한 5 개의 값만 있습니다.

//PDO data types 
$types = array(
    PDO::PARAM_BOOL => 'bool', 
    PDO::PARAM_NULL => 'null', 
    PDO::PARAM_INT => 'int', 
    PDO::PARAM_STR => 'string', 
    PDO::PARAM_LOB => 'blob', 
    PDO::PARAM_STMT => 'statement' //Not used right now 
); 

//Get meta 
$column = $result->getColumnMeta(1); 

//If the column lenght isn't set - default to ZERO 
$column['len'] = isset($column['len']) ? $column['len'] : 0; 

//HACK: If it is longer than 255 chars then it is a text area 
if($column['len'] > 255) { 
    $column['type'] = 'text'; 
} else { 
    $column['type'] = $types[$column['pdo_type']]; 
} 
+0

정확하게이 점은 무엇입니까? 현재 예 : 당신은 MySQL에서 DATETIME을 "string"으로 리턴한다. 한편 문자 (n) 또는 문자 varying (n)은 postgresql에서 n> 255를 가질 수 있습니다. 그래서 (어떤 이유로)이 정보가 중요했기 때문에 신뢰할 수 없었을 것입니다. ( – VolkerK

+0

)이 모든 질문은 형식을 분류 할 수있는 신뢰할만한 방법을 찾기위한 것입니다. 이것은 내가 해보 려던 한 가지 방법이었습니다. – Xeoncross

1

필자는 문서가 더 잘 맞게 변경된 동작을 얻었습니다. PHP Bug #46508을 참조하십시오.

+0

이 문제를 언급 해 주셔서 감사합니다. – Xeoncross

0

하나의 임시 해결 방법은 고유 한 별칭으로 테이블 이름을 사용해야한다는 것입니다.

getColumnMeta()를 호출하고 고유 테이블 목록을 가져올 수 있으며 각 테이블에 대해 'DESCRIBE {table}'문을 실행할 수 있습니다. 실제 MySQL 데이터 유형을 얻으려면 열 이름을 결과 세트의 이름과 일치 시키십시오. 어쨌든 저와 요구에 근무

...

+0

열 이름을 별칭으로 사용 하시겠습니까? 그건 꽤 고풍 것입니다 -하지만 그게 효과가있을 것 같아요. – Xeoncross

0

그것은 더 많은 작업입니다하지만 vc_20_Last_Name 같은 열 이름을 가진 데이터베이스를 만듭니다. 그런 다음 "_"에서 컬럼 이름을 분해하십시오. 위치 제로는 vc 또는 VARCHAR를 포함합니다. 위치 1에는 열 너비 또는 20이 포함됩니다. 위치 2 이상에는 성 및 설명이 포함되어 있습니다. 이제 INSERT, UPDATE 및 DELETE 작업을위한 HTML 양식을 자동으로 작성하는 제네릭 함수를 작성할 수 있습니다. 매개 변수를 전달하여 표시하지 않으려는/표시하지 않으려는 필드를 제외 (또는 더 쉬운 경우 포함) 할 수 있습니다. 코드를 한 번 작성하고 영원히 사용하십시오. 다른 사람의 테이블에 붙어 있으면 운이 좋지 않습니다.