[PHP-users 15246]PEAR DBの汎用ステートメントについて

Osamu Shigematsu m5issige @ mr.hitachi-medical.co.jp
2003年 5月 13日 (火) 17:51:06 JST


重松です。こんにちは。

SQL インジェクションに、PEAR DB の汎用ステートメントが使えるんじゃない、
という話が以前に持ち上がったかと思いますが、「?」と置換のルールについて、
マニュアルにも記載がない (よう) なので、現実装ではなくて、設計方針を
ご存知の方がいらっしゃいましたら、アドバイスいただければと思います。

「?」はその説明として、

	(推奨される) 文字列や数値のようなスカラー値を意味し、
	値はデータベースに依存してクオートされます

となっていますが、当然、int ならば、'' は必要でないでしょうし、
逆に文字 (列) ならば、'' でくくったりが必要になりますね。

しかし、サンプルを見ると、

<?php
// データを挿入する例
$alldata = array(
	array(1, 'one', 'en'),
	array(2, 'two', 'to'),
	array(3, 'three', 'tre'),
	?array(4, 'four', 'fire'));

$sth = $dbh->prepare("INSERT INTO numbers VALUES(?,?,?)");

foreach ($alldata as $row) {
	$dbh->execute($sth, $row);
}
?>

のように文字であっても、自前で '' をつけなくても、良いようです。

ここで疑問なのですが、、PHP で FORM から数値を受け取った場合には、
基本的に文字になっているかと思うのですが、このあたりの型の整合性は
どうなりますか?

ソース上では、quote() によって、クオートされるようですが、
PostgreSQL 用のファイルを見ると、NULL, 数値 (int, double),
論理地 (boolean), 文字列 (string) にしか対応していないようですから、
TIME_STAMP だとか、その辺は自力で何とかしないといけなさそうですが、
そういうものでしょうか?

それとも、将来的には、各テーブルの定義を知っていれば、
当然、どういうデータが入れられるのか、わかるわけだから、
数値に変換しておいたりする必要がなくなりますよね?

pg_convert() のような感じを期待したのですが。

現状の実装だと、値を事前にきちんと変換しないと、
うまく動かない気がしています。PostgreSQL の場合には。

-- 
Osamu Shigematsu <m5issige @ mr.hitachi-medical.co.jp>



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