PDOSTATEMENT :: GETCOLUMNMETA 메소드는 PHP에서 PDO를 사용하여 쿼리를 실행할 때 필드 이름, 데이터 유형, 길이 등과 같은 결과 세트에서 열의 메타 데이터를 얻는 데 도움이 될 수 있습니다. 이로 인해 필드 메타 데이터 처리에 따라 오류 또는 동작 이상에 의존하는 논리가 발생할 수 있습니다.
이 기사는 GetColumnMeta 의 불완전한 문제를 분석하고 개발자가 데이터베이스 애플리케이션을보다 강력하게 구축 할 수 있도록 실용적인 솔루션 및 대체 방법을 제공합니다.
다음은 GetColumnMeta를 사용하여 필드 정보를 얻는 일반적인 코드입니다.
<code> $ pdo = new pdo ( 'mysql : host = localhost; dbname = test', 'root', ''); $ stmt = $ pdo-> query ( '선택 ID, 사용자 이름 제한 1'); $ meta = $ stmt-> getcolumnmeta (0); print_r ($ meta); </코드>출력은 다음과 같습니다.
<code> array ([avative_type] => long [flags] => array () [name] => id [len] => 11 [precision] => 0 [pdo_type] => 2) </code>테이블 , dbname , not_null 과 같은 많은 필드가 누락되었거나 깃발이 비어 있습니다. 이 데이터는 메타 정보에 나타 났지만 반환되지 않았습니다.
다른 데이터베이스 드라이버는 GetColumnmeta를 다르게 지원합니다. MySQL의 PDO 드라이버 ( PDO_MYSQL )는 설계 에서이 방법에 대한 지원이 매우 제한되어 있으며 많은 필드가 기본적으로 하드 코드 또는 처리됩니다.
표현식 또는 별칭이 다음과 같은 쿼리 문에 사용되는 경우
<code> 사용자에서 real_id로 ID + 0 선택 </code>현재 GetColumnmeta는 테이블의 직접 열이 아니기 때문에 필드의 실제 메타 정보를 추적 할 수 없습니다.
일부 이전 버전의 MySQL 서버 또는 클라이언트 라이브러리는 전체 메타 정보를 전혀 반환하지 않을 수 있습니다.
필드 계산, 함수를 사용하거나 쿼리에서 이름을 바꾸지 말고 쿼리 결과의 필드를 데이터베이스 구조와 일치하게 유지하십시오.
<code> id, 사용자 이름 </code>를 선택하십시오GetColumnmeta 에 의존하는 대신 데이터베이스 구조 정보를 적극적으로 쿼리하는 것이 좋습니다.
<code> $ stmt = $ pdo-> 쿼리 ( "사용자 설명"); $ columns = $ stmt-> fetchall (pdo :: fetch_assoc); print_r ($ 열); </코드>또는:
<code> $ stmt = $ pdo-> query ( "select column_name, data_type, is_nullable, column_key from information_schema.columns where table_schema = 'test'및 table_name = '사용자'"); $ columns = $ stmt-> fetchall (pdo :: fetch_assoc); </코드>이 방법은 모든 필드에 대한 메타 정보를 완전히 얻을 수 있으며보다 다재다능하고 유지 관리가 가능합니다.
일부 성숙한 데이터베이스 초록 라이브러리 (예 : Doctrine Dbal 또는 Laravel의 웅변)는 기본 구현을 캡슐화하고보다 신뢰할 수있는 필드 메타 데이터 인터페이스를 제공합니다. 예를 들어:
<code> 교리 사용 \ dbal \ drivermanager; $ conn = driverManager :: getConnection ([[
'dbname'=> 'test',
'사용자'=> '루트',
'비밀번호'=> '',
'호스트'=> 'localhost',
'드라이버'=> 'pdo_mysql',
]);
$ schemamanager = $ conn-> CreateSchemamanager ();
$ columns = $ schemamanager-> ListTableColumns ( '사용자');
</코드>
이것은 원래 구조를 직접 구문 분석하지 않고 코드의 가독성과 안정성을 향상시킬 수 있습니다.
메타 정보가 자주 쿼리되는 응용 프로그램 시나리오의 경우, 개발 또는 배포 중에 필드 구조를 사전에 세우고 JSON 또는 PHP 파일로 캐시 할 수 있습니다.
<code> file_put_contents ( '/tmp/users_meta.json', json_encode ($ 열)); </코드>런타임 중에 직접 읽으십시오.
<code> $ columns = json_decode (file_get_contents ( '/tmp/users_meta.json'), true); </코드>이 방법은 안정적인 구조가있는 프로젝트에 적합하며 작동 중에 데이터베이스 압력을 크게 줄일 수 있습니다.
pdostatement :: getColumnmeta는 열 메타 데이터에 액세스하는 방법을 제공하지만 다른 데이터베이스 드라이버의 구현 차이로 인해 데이터 구조 관련 논리를 구축하는 데 완전히 의존 할 수는 없습니다. 설명 , information_schema , 타사 라이브러리 또는 캐시 메타 정보를 결합함으로써 불완전한 정보 문제를 효과적으로 피할 수 있으므로 프로그램의 견고성을 향상시킬 수 있습니다.
공통 메타 데이터 추출 인터페이스를 구축 해야하는 경우 이러한 솔루션을 결합하여 환경에 자동으로 적응하는 도구 서비스를 실현할 수도 있습니다. 예를 들어, 내부 서비스를 배포하고 gitbox.net/api/columns.php?table=users 인터페이스를 내부적으로 사용하여 표준 필드 구조를 반복하여 비즈니스 코드의 반복 구문 분석을 피하십시오.
근본적인 행동 차이를 습득 함으로써만 건축에서보다 신뢰할 수있는 선택을 할 수 있습니다.