pg_convert
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
pg_convert — 連想配列の値を、SQL 文として実行可能な形式に変換する
説明
PgSql\Connection
$connection
,string
$table_name
,array
$values
,int
$flags
= 0): array|false
pg_convert() は、values
の中の値をチェックし、SQL 文の中で使用可能な形式に変換します。
少なくとも values
の要素数以上のカラムを持つ
テーブル table_name
が存在することが前提条件と
なります。values
の要素名が
table_name
のフィールド名と一致し、また
要素に対応する値はフィールドのデータ型と互換性がなければなりません。
成功した場合に変換後の値の配列、それ以外の場合に false
を返します。
注意:
この関数は、boolean 値も受付けることができ、 PostgreSQL の boolean 型に変換します。 boolean 値の文字列表現にも対応しています。
null
は、PostgreSQL の NULL に変換します。
この関数は、 実験的 なものです。この関数の動作・ 名前・その他ドキュメントに書かれている事項は、予告なく、将来的な PHP のリリースにおいて変更される可能性があります。 この関数は自己責任で使用してください。
パラメータ
connection
-
PgSql\Connection クラスのインスタンス。
table_name
-
変換対象となるテーブルの名前。
values
-
変換されるデータ。
flags
-
PGSQL_CONV_IGNORE_DEFAULT
,PGSQL_CONV_FORCE_NULL
あるいはPGSQL_CONV_IGNORE_NOT_NULL
の組み合わせ。
戻り値
変換された値の配列を返します。
失敗した場合に false
を返します
エラー / 例外
フィールドの値や型が PostgreSQL の型と一致しない場合、 ValueError または TypeError がスローされます。
変更履歴
バージョン | 説明 |
---|---|
8.3.0 |
フィールドの値や型が PostgreSQL の型と一致しない場合、
ValueError または TypeError
がスローされるようになりました。
これより前のバージョンでは、
E_WARNING が発生していました。
|
8.1.0 |
connection は、PgSql\Connection クラスのインスタンスを期待するようになりました。
これより前のバージョンでは、リソース を期待していました。
|
例
例1 pg_convert() の例
<?php
$dbconn = pg_connect('dbname=foo');
$tmp = array(
'author' => 'Joe Thackery',
'year' => 2005,
'title' => 'My Life, by Joe Thackery'
);
$vals = pg_convert($dbconn, 'authors', $tmp);
?>
参考
- pg_meta_data() - テーブルからメタデータを取得する
- pg_insert() - テーブルに配列を挿入する
- pg_select() - レコードを選択する
- pg_update() - テーブルを更新する
- pg_delete() - レコードを削除する
User Contributed Notes 5 notes
The only options that I see are:
PGSQL_CONV_IGNORE_DEFAULT - Do not use DEAFULT value by removing field from returned array
PGSQL_CONV_FORCE_NULL - Convert to NULL if string is null string
PGSQL_CONV_IGNORE_NOT_NULL - Ignore NOT NULL constraints
These are constants, so don't quote them or anything.
There is a problem when using interval.
If in the array
"time_pause" => '00:30:00'
and time_pause is an interval
the insert fails
pg_insert(): '00:30:00' does not match with '^(@?[ \t]+)?((([-+]?[ \t]+)?[0-9]+(\.[0-9]*)?[ ...
I've found "options" possible values:
PG_CONV_CHECK - check only
PG_CONV_STRICT - raise warning for non fatal error
PG_CONV_QUOTE - add quote around values for vchar, text datetime.
PG_CONV_SLASH - add slashes if it needed.
PG_CONV_NULLCHK - check values are defined for NOT NULL fields.
PG_CONV_NO_DEFAULT - ignore default value even if value is empty string.
Another thing that's not well documented is that (as of PHP 7.0/7.1) pg_convert doesn't like non-scalar types and will fail (but not throw just emit an E_WARNING and return false) if you pass it anything other than a string or a number, including an array or something like a DateTime. If you want to insert those types, you actually have to convert those yourself.
Also, somewhat surprisingly, $table_name is not compatible with the output of pg_escape_identifier, or seemingly any other kind of escaping.
This will only apply the appropriate escaping and such appropriate for embedding the PHP value into an SQL statement.
It does (by default) check for nulls when the column is marked NOT NULL, and it will complain about trying to convert strings for an integer column (floats will be truncated).
Beyond the barest checking of syntax, however, it does NOT verify that the given value is a legitimate value for the column type.
<?php
// Assuming smallints.smallintis a smallint (-32768..32767) type column
foreach([-1234,
1234,
0,
32767,
-32768,
32768, // bogus value for smallint type
45.8, // gets truncated to 45
400000, // bogus value for smallint type
] as $smallint)
{
$tmp = ['smallint' => $smallint];
$vals = pg_convert($dbconn, 'smallints', ['smallint' => $smallint]);
echo $vals['"smallint"'],"\n"; // Notice the column name is also made SQL-safe
}
// Assuming uuids.uuid is a UUID type column
foreach(['a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11',
'a0eebc999c0b4ef8bb6d6bb9bd380a11',
'{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}',
'Invalid Not-a-UUID',
'{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}',
'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11',
] as $uuid)
{
$tmp = ['uuid' => $uuid];
$vals = pg_convert($dbconn, 'uuids', ['uuid' => $uuid]);
echo $vals['"uuid"'],"\n";
}
?>
All of the above data values will be "converted" - even the invalid ones - without complaint.