[PHP-users 6739] Re: FRC: New PostgreSQL function for PHP (pg_convert)
Yasuo Ohgaki
php-users@php.gr.jp
Mon, 08 Apr 2002 13:08:12 +0900
大垣です。
pg_convertの動作は説明する必要があるので簡単に説明します。
array pg_convert(resource db, string table, array values)
Check and convert values for PostgreSQL SQL statement
tableで指定されたテーブルのメタデータを内部関数の
php_pgsql_metadata(pg_metadataの実体)を呼んでメタデー
タを取得します。メタデータから文字列/日付/数値等の型情報を取
得します。
文字列の場合、エスケープ処理後に最初と最後にクオートをつけます。
数値の場合、値が数値であるか確認します。
日付の場合、フォーマットがISOスタイルの日付であるか確認します。
論理値の場合、PostgreSQLが論理値として受け付ける形式か確認し、
"'t'"または"'f'"に変換します。
入力値がNULLまたは""(null string)である場合は文字列"NULL"
を設定します。
# "" (null string)がNULLになると困る場合は使わな
# いでください。ほとんどの場合、この仕様で困らないと
# と思いますが、もし困る方多い場合は考えます。
現状ではINET、CIDR、BYTEA、MAC等はサポートしていますが、
BIT, LSEG等はサポートしていません。
PHP4.3.0リリースまでにはデフォルト値の有無、NOT NULLの指定
の確認も追加する予定です。
今のところ、値が""(null string)かつデフォルト値が設定されて
いる場合は、そのフィールドは戻り値の配列に含めないことによりデ
フォルト値が利用されるようにするつもりです。
NOT NULL指定がある場合、値がempty()== TRUEの場合エラーに
する様にしようと思っています。
DEAFULTがありNOT NULLが指定されている時はDEFAULTのみ指定
されている場合と同じ動作にします。(戻り値に含めない)
APIは互換性を保つ様にするつもりですが保証はしません。
使い方:
[テーブル定義]
test=# \d php_pgsql_test
Table "php_pgsql_test"
Column | Type | Modifiers
--------+---------+-----------
num | integer |
str | text |
bin | bytea |
[スクリプト] ext/pgsql/tests/pg_convert.inc
<?php
error_reporting(E_ALL);
include 'config.inc';
$db = pg_connect($conn_str);
// 注意:escape関数のテストではないので、わざと
// エスケープが必要ないデータを使用。
$fields = array('num'=>'1234', 'str'=>'AAA', 'bin'=>'BBB');
$converted = pg_convert($db, $table_name, $fields);
var_dump($converted);
?>
[出力]
[yohgaki@dev HEAD]$ ./cli-php ext/pgsql/tests/pg_convert.inc
array(3) {
["num"]=>
int(1234)
["str"]=>
string(5) "'AAA'"
["bin"]=>
string(5) "'BBB'"
}
今書いていて気が付いた、数値型をint, doubleに変換しな
い方が良いですね。これは直しておきます。
変換後はエスケープやクオートを付けたり、NULLを設定する
必要がなくなりますから、
----------------
$fields = pg_convert($db, 'test', $fields);
$sql = "
INSERT INTO
test (
num,
str,
bin )
VALUES (
{$fields['num']},
{$fields['str']},
{$fields['bin']}
);
";
pq_query($db, $sql);
----------------
と言う形式でSQLが書けるようになりすっきりします。
--
Yasuo Ohgaki
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/