[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/