PHPでPDOを使用してクエリを実行する場合、 pdostatement :: getColumnmetaメソッドは、フィールド名、データ型、長さなど、結果セットの列のメタデータを取得するのに役立ちます。ただし、多くの開発者は、特に特定のデータベースドライバーを使用する場合、この方法で返される情報が不完全であることが多いことがよくあります。これは、エラーまたは動作の異常にフィールドメタデータ処理に依存するいくつかのロジックを引き起こす可能性があります。
この記事では、 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>出力は次のようになる場合があります:
<code> array([native_type] => long [flags] => array()[name] => id [len] => 11 [precision] => 0 [pdo_type] => 2)</code>テーブル、 dbname 、 not_nullなど、多くのフィールドがありません。これらのデータはメタ情報に表示されるはずですが、返されませんでした。
さまざまなデータベースドライバーがGetColumnmetaを異なってサポートしています。 MySQLのPDOドライバー( PDO_MYSQL )は、このデザインのメソッドに対するサポートが非常に限られており、多くのフィールドはデフォルトでハードコードまたは処理されています。
式またはエイリアスがクエリステートメントで使用されている場合:
<code> selectid + 0 as real_id fromユーザー</code>この時点で、 GetColumnmetaは、テーブルの直接列ではないため、フィールドの実際のメタ情報を追跡できません。
MySQLサーバーまたはクライアントライブラリの古いバージョンの一部は、完全なメタ情報をまったく返していない場合があります。
フィールドの計算、関数の使用、クエリでそれらを変更することを避け、データベース構造と一致するクエリ結果のフィールドを保持してください。
<code> id、name from users </code>を選択しますGetColumnmetaに依存する代わりに、データベース構造情報を積極的に照会することをお勧めします。
<code> $ stmt = $ pdo-> query( "descrite users"); $列= $ stmt-> fetchall(pdo :: fetch_assoc); print_r($列); </code>または:
<code> $ stmt = $ pdo-> query( "column_nameを選択し、data_type、is_nullable、column_key from information_schema.columns from table_schema = 'test'およびtable_name = 'users'"); $列= $ stmt-> fetchall(pdo :: fetch_assoc); </code>この方法は、すべてのフィールドのメタ情報を完全に取得でき、より汎用性が高く保守可能です。
一部の成熟したデータベース抽象ライブラリ(Doctrine DbalやLaravelの雄弁など)は、基礎となる実装をカプセル化し、より信頼性の高いフィールドメタデータインターフェイスを提供します。例えば:
<code> Doctrine \ dbal \ drivermanagerを使用します。 $ conn = drivermanager :: getConnection([[
'dbname' => 'テスト'、
'user' => 'root'、
「パスワード」=> ''、
'host' => 'localhost'、
'driver' => 'pdo_mysql'、
]);
$ schemamanager = $ conn-> createschemamanager();
$ columns = $ schemamanager-> listtablecolumns( 'users');
</code>
これにより、元の構造を自分で解析することを避け、コードの読みやすさと安定性を改善できます。
メタ情報が頻繁に照会されるアプリケーションシナリオの場合、開発または展開中にフィールド構造を事前に獲得し、JSONまたはPHPファイルとしてキャッシュすることができます。
<code> file_put_contents( '/tmp/users_meta.json'、json_encode($ columns)); </code>ランタイム中に直接読むだけです:
<code> $ columns = json_decode(file_get_contents( '/tmp/users_meta.json')、true); </code>この方法は、安定した構造を持つプロジェクトに適しており、操作中のデータベース圧力を大幅に削減できます。
pdostatement :: getColumnmetaは、列メタデータにアクセスする方法を提供しますが、さまざまなデータベースドライバーの実装の違いにより、データ構造関連のロジックを構築することは完全に依存することはできません。説明されたステートメント、 Information_schema 、サードパーティライブラリ、またはキャッシュメタ情報を組み合わせることにより、不完全な情報の問題を効果的に回避し、それによりプログラムの堅牢性を改善します。
一般的なメタデータ抽出インターフェイスを構築する必要がある場合は、これらのソリューションを組み合わせて、環境に自動的に適応するツールサービスを実現することもできます。たとえば、内部サービスを展開し、 gitbox.net/api/columns.php ?table=usersインターフェイスを内部的に使用して、標準のフィールド構造を返して、ビジネスコードでの繰り返しの解析を避けます。
基礎となる行動の違いを習得することによってのみ、アーキテクチャでより信頼できる選択をすることができます。