[PHP-users 35747] PostgreSQL配列型カラムへのプリペアドステートメント実行

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PHP-users 35747] PostgreSQL配列型カラムへのプリペアドステートメント実行

おさ
こんにちは、おさです。

PostgreSQLの配列型カラムへデータを投入したいのですが、
エラーになってしまい困っています。

id bigint
data text[]
というカラム定義のテーブルがあり
insert into tbl (id,data)values($1,$2)
というプリペアドステートメントを定義しました。

そこで
pg_execute($dbconn, $stmtname, array(1, array("abc","def")))
を実行したのですが、PostgreSQL側で
ERROR:  配列値は"["か次元情報から始まらなければなりません
というエラーが出ます。
pg_executeに直接配列は渡せないのでしょうか?
なにか正しいやり方があるのが、自前でなんとしないといけないのでしょうか?

環境はPHP5.4.8、PostgreSQL9.2.1です。

--
+-----------------------------------------------------------------------+
 HANDLE:おさ
 EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
+-----------------------------------------------------------------------+
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PHP-users 35748] Re: PostgreSQL配列型カラムへのプリペアドステートメント実行

quatrecentsept
こんにちは

この場合、execute時に$2に代入する値を、phpの配列ではなく、
postgresqlが理解できる配列の型にしてあげる必要があります。

具体的には array("abc","def") のところが、
{abc,def}
という文字列になります。

ex.
$pg_array = "{abc,def}";
pg_execute($dbconn, $stmtname, array(1,$pg_array));


On 2012/11/07, at 14:09, おさ <[hidden email]> wrote:

> こんにちは、おさです。
>
> PostgreSQLの配列型カラムへデータを投入したいのですが、
> エラーになってしまい困っています。
>
> id bigint
> data text[]
> というカラム定義のテーブルがあり
> insert into tbl (id,data)values($1,$2)
> というプリペアドステートメントを定義しました。
>
> そこで
> pg_execute($dbconn, $stmtname, array(1, array("abc","def")))
> を実行したのですが、PostgreSQL側で
> ERROR:  配列値は"["か次元情報から始まらなければなりません
> というエラーが出ます。
> pg_executeに直接配列は渡せないのでしょうか?
> なにか正しいやり方があるのが、自前でなんとしないといけないのでしょうか?
>
> 環境はPHP5.4.8、PostgreSQL9.2.1です。
>
> --
> +-----------------------------------------------------------------------+
> HANDLE:おさ
> EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
> +-----------------------------------------------------------------------+
> _______________________________________________
> PHP-users mailing list  [hidden email]
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3

_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PHP-users 35749] Re: PostgreSQL配列型カラムへのプリペアドステートメント実行

おさ
ありがとうございます。

やっぱり自前で変換してやらないといけないんですね。
配列の要素をクォーテーションで括って、カンマ区切り波括弧括りにして、
無事投入できました。
まだエスケープ処理からは逃れられないのですね。


2012年11月7日 15:25 Kiyotaka sumii <[hidden email]>:

> こんにちは
>
> この場合、execute時に$2に代入する値を、phpの配列ではなく、
> postgresqlが理解できる配列の型にしてあげる必要があります。
>
> 具体的には array("abc","def") のところが、
> {abc,def}
> という文字列になります。
>
> ex.
> $pg_array = "{abc,def}";
> pg_execute($dbconn, $stmtname, array(1,$pg_array));
>
>
> On 2012/11/07, at 14:09, おさ <[hidden email]> wrote:
>
>> こんにちは、おさです。
>>
>> PostgreSQLの配列型カラムへデータを投入したいのですが、
>> エラーになってしまい困っています。
>>
>> id bigint
>> data text[]
>> というカラム定義のテーブルがあり
>> insert into tbl (id,data)values($1,$2)
>> というプリペアドステートメントを定義しました。
>>
>> そこで
>> pg_execute($dbconn, $stmtname, array(1, array("abc","def")))
>> を実行したのですが、PostgreSQL側で
>> ERROR:  配列値は"["か次元情報から始まらなければなりません
>> というエラーが出ます。
>> pg_executeに直接配列は渡せないのでしょうか?
>> なにか正しいやり方があるのが、自前でなんとしないといけないのでしょうか?
>>
>> 環境はPHP5.4.8、PostgreSQL9.2.1です。
>>
>> --
>> +-----------------------------------------------------------------------+
>> HANDLE:おさ
>> EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
>> +-----------------------------------------------------------------------+
>> _______________________________________________
>> PHP-users mailing list  [hidden email]
>> http://ml.php.gr.jp/mailman/listinfo/php-users
>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>> http://oldwww.php.gr.jp/php/novice.php3
>
> _______________________________________________
> PHP-users mailing list  [hidden email]
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3



--
+-----------------------------------------------------------------------+
 HANDLE:おさ
 EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
+-----------------------------------------------------------------------+
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PHP-users 35750] Re: PostgreSQL配列型カラムへのプリペアドステートメント実行

Yasuo Ohgaki
大垣です。

pg_array_to_string()という関数を作ろうか、と思った事もあるのですが
配列データは文字列データとは限らず、デフォルトのデータ型だけでも
正しく処理するには

pg_secape_string と pg_escape_bytea

を使い分けないとならないので作っていません。データ型を指定するAPI
にする事も可能ですが煩雑になるので、ユーザが必要な処理をスクリプト
で実装する方が良いと思っています。

全て文字列データとしてエスケープ処理します、それ以外のケースは自分
でエスケープ処理してください、というAPIもありとは思いますが、色々
な意味で微妙かなと思っています。

--
Yasuo Ohgaki
[hidden email]


2012年11月7日 15:56 おさ <[hidden email]>:

> ありがとうございます。
>
> やっぱり自前で変換してやらないといけないんですね。
> 配列の要素をクォーテーションで括って、カンマ区切り波括弧括りにして、
> 無事投入できました。
> まだエスケープ処理からは逃れられないのですね。
>
>
> 2012年11月7日 15:25 Kiyotaka sumii <[hidden email]>:
>> こんにちは
>>
>> この場合、execute時に$2に代入する値を、phpの配列ではなく、
>> postgresqlが理解できる配列の型にしてあげる必要があります。
>>
>> 具体的には array("abc","def") のところが、
>> {abc,def}
>> という文字列になります。
>>
>> ex.
>> $pg_array = "{abc,def}";
>> pg_execute($dbconn, $stmtname, array(1,$pg_array));
>>
>>
>> On 2012/11/07, at 14:09, おさ <[hidden email]> wrote:
>>
>>> こんにちは、おさです。
>>>
>>> PostgreSQLの配列型カラムへデータを投入したいのですが、
>>> エラーになってしまい困っています。
>>>
>>> id bigint
>>> data text[]
>>> というカラム定義のテーブルがあり
>>> insert into tbl (id,data)values($1,$2)
>>> というプリペアドステートメントを定義しました。
>>>
>>> そこで
>>> pg_execute($dbconn, $stmtname, array(1, array("abc","def")))
>>> を実行したのですが、PostgreSQL側で
>>> ERROR:  配列値は"["か次元情報から始まらなければなりません
>>> というエラーが出ます。
>>> pg_executeに直接配列は渡せないのでしょうか?
>>> なにか正しいやり方があるのが、自前でなんとしないといけないのでしょうか?
>>>
>>> 環境はPHP5.4.8、PostgreSQL9.2.1です。
>>>
>>> --
>>> +-----------------------------------------------------------------------+
>>> HANDLE:おさ
>>> EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
>>> +-----------------------------------------------------------------------+
>>> _______________________________________________
>>> PHP-users mailing list  [hidden email]
>>> http://ml.php.gr.jp/mailman/listinfo/php-users
>>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>>> http://oldwww.php.gr.jp/php/novice.php3
>>
>> _______________________________________________
>> PHP-users mailing list  [hidden email]
>> http://ml.php.gr.jp/mailman/listinfo/php-users
>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>> http://oldwww.php.gr.jp/php/novice.php3
>
>
>
> --
> +-----------------------------------------------------------------------+
>  HANDLE:おさ
>  EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
> +-----------------------------------------------------------------------+
> _______________________________________________
> PHP-users mailing list  [hidden email]
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PHP-users 35751] Re: PostgreSQL配列型カラムへのプリペアドステートメント実行

Yasuo Ohgaki
大垣です。

エスケープ処理の話ついでにプリペアードクエリでエスケープ処理が必須な
ケースをもうひとつ紹介します。

PostgreSQLはバイナリ型のフィールドをサポートしていますが、バイナリ型
がある場合はプリペアードクエリ型のAPIを利用していてもpg_escape_bytea()
でエスケープ処理しないと正しく処理できません。

これは仕様です :)

--
Yasuo Ohgaki
[hidden email]


2012年11月12日 15:18 Yasuo Ohgaki <[hidden email]>:

> 大垣です。
>
> pg_array_to_string()という関数を作ろうか、と思った事もあるのですが
> 配列データは文字列データとは限らず、デフォルトのデータ型だけでも
> 正しく処理するには
>
> pg_secape_string と pg_escape_bytea
>
> を使い分けないとならないので作っていません。データ型を指定するAPI
> にする事も可能ですが煩雑になるので、ユーザが必要な処理をスクリプト
> で実装する方が良いと思っています。
>
> 全て文字列データとしてエスケープ処理します、それ以外のケースは自分
> でエスケープ処理してください、というAPIもありとは思いますが、色々
> な意味で微妙かなと思っています。
>
> --
> Yasuo Ohgaki
> [hidden email]
>
>
> 2012年11月7日 15:56 おさ <[hidden email]>:
>> ありがとうございます。
>>
>> やっぱり自前で変換してやらないといけないんですね。
>> 配列の要素をクォーテーションで括って、カンマ区切り波括弧括りにして、
>> 無事投入できました。
>> まだエスケープ処理からは逃れられないのですね。
>>
>>
>> 2012年11月7日 15:25 Kiyotaka sumii <[hidden email]>:
>>> こんにちは
>>>
>>> この場合、execute時に$2に代入する値を、phpの配列ではなく、
>>> postgresqlが理解できる配列の型にしてあげる必要があります。
>>>
>>> 具体的には array("abc","def") のところが、
>>> {abc,def}
>>> という文字列になります。
>>>
>>> ex.
>>> $pg_array = "{abc,def}";
>>> pg_execute($dbconn, $stmtname, array(1,$pg_array));
>>>
>>>
>>> On 2012/11/07, at 14:09, おさ <[hidden email]> wrote:
>>>
>>>> こんにちは、おさです。
>>>>
>>>> PostgreSQLの配列型カラムへデータを投入したいのですが、
>>>> エラーになってしまい困っています。
>>>>
>>>> id bigint
>>>> data text[]
>>>> というカラム定義のテーブルがあり
>>>> insert into tbl (id,data)values($1,$2)
>>>> というプリペアドステートメントを定義しました。
>>>>
>>>> そこで
>>>> pg_execute($dbconn, $stmtname, array(1, array("abc","def")))
>>>> を実行したのですが、PostgreSQL側で
>>>> ERROR:  配列値は"["か次元情報から始まらなければなりません
>>>> というエラーが出ます。
>>>> pg_executeに直接配列は渡せないのでしょうか?
>>>> なにか正しいやり方があるのが、自前でなんとしないといけないのでしょうか?
>>>>
>>>> 環境はPHP5.4.8、PostgreSQL9.2.1です。
>>>>
>>>> --
>>>> +-----------------------------------------------------------------------+
>>>> HANDLE:おさ
>>>> EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
>>>> +-----------------------------------------------------------------------+
>>>> _______________________________________________
>>>> PHP-users mailing list  [hidden email]
>>>> http://ml.php.gr.jp/mailman/listinfo/php-users
>>>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>>>> http://oldwww.php.gr.jp/php/novice.php3
>>>
>>> _______________________________________________
>>> PHP-users mailing list  [hidden email]
>>> http://ml.php.gr.jp/mailman/listinfo/php-users
>>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>>> http://oldwww.php.gr.jp/php/novice.php3
>>
>>
>>
>> --
>> +-----------------------------------------------------------------------+
>>  HANDLE:おさ
>>  EMAIL :[hidden email] twitter:osapon URL:http://www.osa-p.net/
>> +-----------------------------------------------------------------------+
>> _______________________________________________
>> PHP-users mailing list  [hidden email]
>> http://ml.php.gr.jp/mailman/listinfo/php-users
>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>> http://oldwww.php.gr.jp/php/novice.php3
_______________________________________________
PHP-users mailing list  [hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3
Loading...