[PHP-users 21550]Re: time型にpg_insertでINSERTするとエラー

komura komura @ ma9.seikyou.ne.jp
2004年 5月 7日 (金) 14:26:42 JST


komura です。

On Thu, 06 May 2004 20:08:32 +0900
m-saitoh @ yamatosokki.co.jp wrote:

> 以下の環境でtime型の項目にpg_insertを使用して
> データのINSERTを行うとエラーが表示されます。
> 
> [環境]
> OS  : RedHat 9
> Web : Apache 2.0.48
> PHP : 4.3.3
> DB  : PostgreSQL 7.3.4
> 
> [プログラム]
> $value['order_date'] = '2004-05-06';
> $value['order_time'] = '12:34:56';
> pg_insert( $connect_id, 'test', $value );
> 
> [エラー]
> Warning:pg_insert(): Cannot compile regex. : /web/test.php : 20

... 省略 ...

> 以下のようにtime型の値を空にすれば普通にINSERT出来ます。
>
> $value['order_time'] = '';
>
> また、普通のINSERT文をpg_queryで行えばINSERT出来ます。
> 
> pg_query( $connect_id, "INSERT INTO test (order_date, order_time) VALUES ('2004-05-06','12:34:56')" );
> 
> これは、バグなのでしょうか、それとも私の環境がいけないのでしょうか?

手元の環境では問題が再現せず、INSERT が成功しましたので、問題が解決するか
どうかは分かりませんが、少し調べてみました。

PHP のソースを確認すると、pg_insert() などを使用した場合、PostgreSQL の
データ型に合わせて、入力値の正規表現によるチェックが行われるようになって
います。

php-4.3.6/ext/pgsql/pgsql.c で確認すると、PostgreSQL の time 型が
指定されている場合、以下の正規表現によるチェックが行われますが、
正規表現部分の閉じ括弧が一つ多く、括弧の対応がおかしくなっているようです。

php-4.3.6/ext/pgsql/pgsql.c

3825: if (php_pgsql_convert_match(Z_STRVAL_PP(val), "^(([0-9]{1,2}:[0-9]{1,2}){1}(:[0-9]{1,2}){0,1})){0,1}$", 1 TSRMLS_CC) == FAILURE) {
                                                                                                    ^
3826: 	err = 1;
3827: }
3828: else {
3829: 	ZVAL_STRING(new_val, Z_STRVAL_PP(val), 1);
3830: 	php_pgsql_add_quotes(new_val, 1 TSRMLS_CC);
3831: }

(PHP 4.3.3 のソースも確認しましたが、この部分は同じでした。)

手元で使用している Gentoo Linux の glibc-2.3.2 の環境で、簡単な C のソースを
書いて確認してみたのですが、この括弧の対応がおかしくても正規表現の
コンパイルエラーにはなりませんでしたので、この部分を修正することで問題が
解決するかどうかは分かりません。

ただ、この括弧の対応の問題により、正規表現のコンパイルエラーになっている
可能性がありますので、PHP をソースからインストールしている場合や、SRPM を
使ってソースを修正してパッケージを構築できるのであれば、上記の閉じ括弧が
一つ多い問題を修正して PHP を再度コンパイルしてみると、問題が解決するかも
しれません。

-- 
komura <komura @ ma9.seikyou.ne.jp>


PHP-users メーリングリストの案内