PHP の is_int と is_numeric
2005年2月4日 コンピュータ2009年6月24日追記
この日記の内容は「当時こうした」というもので、
is_int の動作や使い方に関しては
他によりよいページがあると思います。
なお、「End_Of_SQL」で探してきた人は
http://diarynote.jp/d/10395/20071001.html
を見てください。
========================================
僕は基本的に型の強い言語の方が好きである。
(でも、コンパイラ言語よりインタプリタ言語が好き。)
PHP から PostgerSQL を使っているが、
ヒアドキュメントに変数を埋め込む形で
SQL 文を作って渡すようにしている。
で、SQL インジェクション を防止するため、
サニタイズしてから埋め込む。
文字列なら
NULL を考慮するときは
みたいにして。
で、問題は数値。特に整数値。
PHP は 型の弱い言語で通常は型を強く意識する必要はない。
最初にその変数に代入したときの値で内部に型を持ち、
必要なときに暗黙に型変換を行う。
is_numeric という関数はその変数が数値か数値文字列なら
TRUE を返す。
しかし、PHP の組み込み関数の is_int は
変数の内部に持つ型が int型かどうかを判定する。
SQL文に渡す前の前チェックで、
変数に is_numeric を噛ますことで
SQL インジェクションは防いでいた。
しかし、整数でなければならないところで
整数値かどうかのチェックをしていなかった。
で、実験してみた。
みたいなテーブルがある状態で
ってのはまぁいい。
int_field を numeric型にキャストして比較されるので。
問題は関数を使ったとき。
としてあるときに
とすると エラーが発生する。
実際、html の Form で
数値を直接入力させるところは無かったが、
SELECT で数値を選ぶところがあり、
Form を改竄して直接値を放り込むテストをしたところ、
PostgreSQL のエラーが出てしまった。
で、数値を入れて query を投げるときに
数値が整数かどうかをチェックすることにした。
でも、is_int ではだめ。
Form から送られてくるのを $_REQUEST から取り出して
変数に代入するので
内部型は整数ではない。
全部明示的に整数型にキャストすることも検討したが、
意図しない値に変わるのを嫌った。
で、
という関数を作った。
但し、これでは
の場合にエラーとなるので
チェック後に明示的に int型にキャストするようにした。
この日記の内容は「当時こうした」というもので、
is_int の動作や使い方に関しては
他によりよいページがあると思います。
なお、「End_Of_SQL」で探してきた人は
http://diarynote.jp/d/10395/20071001.html
を見てください。
========================================
僕は基本的に型の強い言語の方が好きである。
(でも、コンパイラ言語よりインタプリタ言語が好き。)
PHP から PostgerSQL を使っているが、
ヒアドキュメントに変数を埋め込む形で
SQL 文を作って渡すようにしている。
で、SQL インジェクション を防止するため、
サニタイズしてから埋め込む。
文字列なら
$foo = pg_escape_string($foo);
$SQL=<<End_Of_SQL
SELECT ’$foo’;
End_Of_SQL
NULL を考慮するときは
if(is_null()){
$foo = ’NULL’;
} else {
$foo = "’" . pg_escape_string($foo) . "’";
}
$SQL=<<End_Of_SQL
SELECT $foo;
End_Of_SQL
みたいにして。
で、問題は数値。特に整数値。
PHP は 型の弱い言語で通常は型を強く意識する必要はない。
最初にその変数に代入したときの値で内部に型を持ち、
必要なときに暗黙に型変換を行う。
$foo = 3;
echo $foo . ’ +1 は?’;
echo $foo + 1;
$foo = ’3’;
echo $foo . ’ +1 は?’;
echo $foo + 1;
結果:
3 +1 は?
4
3 +1 は?
4
is_numeric という関数はその変数が数値か数値文字列なら
TRUE を返す。
$foo = 3;
echo is_numeric($foo);
$foo = 3.0;
echo is_numeric($foo);
$foo = ’3’;
echo is_numeric($foo);
結果:
true
true
true
しかし、PHP の組み込み関数の is_int は
変数の内部に持つ型が int型かどうかを判定する。
$foo = 3;
echo is_int($foo);
$foo = 3.0;
echo is_int($foo);
$foo = ’3’;
echo is_int($foo);
結果:
true
false
false
SQL文に渡す前の前チェックで、
変数に is_numeric を噛ますことで
SQL インジェクションは防いでいた。
しかし、整数でなければならないところで
整数値かどうかのチェックをしていなかった。
で、実験してみた。
CREATE TABLE boo(int_field INTEGER UNIQUE);
みたいなテーブルがある状態で
$foo = 3.1
$SQL=<<End_Of_SQL
SELECT int_field FORM boo
WHERE int_field = $foo
End_Of_SQL
ってのはまぁいい。
int_field を numeric型にキャストして比較されるので。
問題は関数を使ったとき。
CREATE FUNCTION woo(INTEGER) RETURNS INTEGER AS
’SELECT $1’ LANGUAGE SQL;
としてあるときに
$foo = 3.1
$SQL=<<End_Of_SQL
SELECT woo($foo)
End_Of_SQL
とすると エラーが発生する。
実際、html の Form で
数値を直接入力させるところは無かったが、
SELECT で数値を選ぶところがあり、
Form を改竄して直接値を放り込むテストをしたところ、
PostgreSQL のエラーが出てしまった。
で、数値を入れて query を投げるときに
数値が整数かどうかをチェックすることにした。
でも、is_int ではだめ。
Form から送られてくるのを $_REQUEST から取り出して
変数に代入するので
内部型は整数ではない。
全部明示的に整数型にキャストすることも検討したが、
意図しない値に変わるのを嫌った。
で、
function is_int_numeric($var){
returns is_numeric(var) && ((int)$var == $var)
}
という関数を作った。
但し、これでは
$foo = 3.0
if(is_int_numeric($foo)){
exit();
}
$SQL=<<End_Of_SQL
SELECT woo($foo)
End_Of_SQL
の場合にエラーとなるので
チェック後に明示的に int型にキャストするようにした。
$foo = 3.0
if(is_int_numeric($foo)){
exit();
}
$foo = (int)$foo;
$SQL=
家計簿を付けることにした。
今まで、貯金の残高を見て大体のペースを抑えていたのだが、
ここのところ、出費が激しくなり、、お金が全然溜められない。
次の MSDN の更新はもうできなさそう。
(MSDN Universal Subscription より上位のものが出るようなのに)。
で、とりあえず、家計簿を付けることにした。
本屋で家計簿帳をいくつか見てみたけど、
EXCEL や Access を使ってすること以上の
利点が見いだせるものは無かった。
レシートを張り付ける形式の家計簿があると聞いたが
現物を見られず。
パスネットやバスカード、
EDYカードや Suica まで含めると
現金資産の形態は複雑だし。
複式でやりたかったし。
(簿記帳ならよかったかも・・・
でも、その場合でも手書きでする意味はない。)
で、困ったのはレシートや領収書のの管理。
そこで、100円ショップで A4のファイリングケースを買って来て
そこに入れることにしてみた
・・・が、これじゃぁ整理にならないな・・・
と翌日、封筒を買ってきて1日毎にレシートを入れることにした。
封筒には
日付とその日の支出額合計、
レシートの無い支出、
レシートにあっても支出でない金額
(Suica のチャージや金券の購入などなど)
を書いていくことにする。
Excel で現金残高の管理と支出の合計を管理。
これは暫定で Access できちんとしたものを
作る予定。
勘定科目の取り扱いが結構面倒になるけどね。
2/2 から始めたけど、つづくか?
今まで、貯金の残高を見て大体のペースを抑えていたのだが、
ここのところ、出費が激しくなり、、お金が全然溜められない。
次の MSDN の更新はもうできなさそう。
(MSDN Universal Subscription より上位のものが出るようなのに)。
で、とりあえず、家計簿を付けることにした。
本屋で家計簿帳をいくつか見てみたけど、
EXCEL や Access を使ってすること以上の
利点が見いだせるものは無かった。
レシートを張り付ける形式の家計簿があると聞いたが
現物を見られず。
パスネットやバスカード、
EDYカードや Suica まで含めると
現金資産の形態は複雑だし。
複式でやりたかったし。
(簿記帳ならよかったかも・・・
でも、その場合でも手書きでする意味はない。)
で、困ったのはレシートや領収書のの管理。
そこで、100円ショップで A4のファイリングケースを買って来て
そこに入れることにしてみた
・・・が、これじゃぁ整理にならないな・・・
と翌日、封筒を買ってきて1日毎にレシートを入れることにした。
封筒には
日付とその日の支出額合計、
レシートの無い支出、
レシートにあっても支出でない金額
(Suica のチャージや金券の購入などなど)
を書いていくことにする。
Excel で現金残高の管理と支出の合計を管理。
これは暫定で Access できちんとしたものを
作る予定。
勘定科目の取り扱いが結構面倒になるけどね。
2/2 から始めたけど、つづくか?
とある魔術の禁書目録(インデックス) (4)
2005年2月11日 読書
ISBN:4840228582 文庫 鎌池 和馬 メディアワークス 2004/12 ¥599
買ってから暫く積読状態だったのですが、
やっと読みました。
当初はギャルゲー路線強化か?
と思ったが、結構ハードな展開に。
ちょっと納得がいかない部分もあるけど、
まぁ良しかな。
買ってから暫く積読状態だったのですが、
やっと読みました。
当初はギャルゲー路線強化か?
と思ったが、結構ハードな展開に。
ちょっと納得がいかない部分もあるけど、
まぁ良しかな。
ISBN:4044507015 文庫 雨川 恵 角川書店 2004/11/29 ¥480
Standard な話の展開だけど、面白い。
小さなお姫様がもっとでてくれば良かったなぁ。
(はっ、お姫様ロリ属性か(自爆)
十二国記の「風の万里 黎明の空」で
ちょっと出ただけの 供王珠晶さまに転んだし。(連爆))
まぁよしかな。
属性があう人には
物足りないかもしれないけどおすすめ(笑)。
Standard な話の展開だけど、面白い。
小さなお姫様がもっとでてくれば良かったなぁ。
(はっ、お姫様ロリ属性か(自爆)
十二国記の「風の万里 黎明の空」で
ちょっと出ただけの 供王珠晶さまに転んだし。(連爆))
まぁよしかな。
属性があう人には
物足りないかもしれないけどおすすめ(笑)。
2009年12月16日記:
追記に失敗して内容ふっ飛ばしました><
===============================
PostgreSQL ver 8.2 以降では
random value in the range 0.0 <= x < 1.0
となっています。
PostgreSQL ver 8.1 以前では
random value between 0.0 and 1.0
です。
PostgreSQL 8.2 のマニュアル
http://www.postgresql.org/docs/8.2/interactive/functions-math.html
PostgreSQL 8.1 のマニュアル
http://www.postgresql.org/docs/8.1/interactive/functions-math.html
===============================
追記に失敗して内容ふっ飛ばしました><
===============================
PostgreSQL ver 8.2 以降では
random value in the range 0.0 <= x < 1.0
となっています。
PostgreSQL ver 8.1 以前では
random value between 0.0 and 1.0
です。
PostgreSQL 8.2 のマニュアル
http://www.postgresql.org/docs/8.2/interactive/functions-math.html
PostgreSQL 8.1 のマニュアル
http://www.postgresql.org/docs/8.1/interactive/functions-math.html
===============================
「まいじゃー推進委員会」(http://maijar.jp/)の
リンクからたどって
「【涙を】泣けるライトノベルは何ですか?【振り絞れ】」
(http://www.geocities.jp/eternal_sisters/lightnovel/cry_lightnovel.html)
を見に行った。
「『猫の地球儀』がいいせん行っているだろうなぁ。
僕的にはやっぱ『LAST KISS』だな。」
って見てみたら「猫の地球儀」が5位で「LAST KISS」が3位。
で、アンケート時のコメントが名前無しで載っていたのだが、
「LAST KISS」の一つ目のコメント、
どっかで見たことあるような〜って考えたら
そういや昔自分が投票したことを思い出した(爆)
なんとなく、うれしい。
=====
2012/01/25 リンクを修正しました。
リンクからたどって
「【涙を】泣けるライトノベルは何ですか?【振り絞れ】」
(http://www.geocities.jp/eternal_sisters/lightnovel/cry_lightnovel.html)
を見に行った。
「『猫の地球儀』がいいせん行っているだろうなぁ。
僕的にはやっぱ『LAST KISS』だな。」
って見てみたら「猫の地球儀」が5位で「LAST KISS」が3位。
で、アンケート時のコメントが名前無しで載っていたのだが、
「LAST KISS」の一つ目のコメント、
どっかで見たことあるような〜って考えたら
そういや昔自分が投票したことを思い出した(爆)
なんとなく、うれしい。
=====
2012/01/25 リンクを修正しました。
コメントをみる |

2日から1日という切れの悪い周期で始まった家計簿、
今月抑え気味だったにもかかわらず、もう赤字突入。
(判明している今月中の支出を含めて。)
しばらく昼飯抜きか。
早く転職しないと、大変なことに。
転職しても給料が上がる可能性も少ないか。。。
今月抑え気味だったにもかかわらず、もう赤字突入。
(判明している今月中の支出を含めて。)
しばらく昼飯抜きか。
早く転職しないと、大変なことに。
転職しても給料が上がる可能性も少ないか。。。