file_get_contentsの引数は1つだけではない

2011/02/21 | PHPの基本

今まで普通にfile_get_contents($path)として使っていたけど、いろいろな使い方ができることを初めて知った。もちろんfile_get_contents($url)でHTTP経由でファイルを取得できることは知っていたけれど、相手がBASIC認証を要求するような場合でも対応できるなんて・・・知らなかった。

$username='username';
$password='password';
$option=array(
  "http"=>array(
    "method"=>"GET",
    "header"=>"Authorization: Basic "
         . base64_encode($username.":".$password)
  )
);
$context=stream_context_create($option);
$result=file_get_contents($url,false,$context);

この例も踏まえて、全部で5つの引数が取れるなんて。ちょっと驚きました。

imagepngとimagejpeg

2011/02/09 | PHPの基本

画像を出力する関数imagepngとimagejpegの第3引数について。両者は意味が全く異なる。

imagepngの場合、第3引数は圧縮レベルを意味し、値は0(圧縮なし)から9(最高レベルの圧縮)を指定する。

imagejpegの場合、第3引数は品質(こちらも圧縮のことかなぁ)を意味し、値は0(最低品質)から100(最高品質)を指定する。

つまり意味が全く異なる。意味が違うのだからマニュアルの表記も変えて欲しい。マニュアルではどちらも「quality」との表記になっている。引数の取り方がほぼ同じなのに、受け付ける値の範囲がそもそも違うし、かたや値が小さいほうが品質が良くて、かたや値が大きいほうが品質が良い、なんていうのは使う側にとっては混乱をきたすだけ。

sprintfで小数をフォーマットする

2011/02/05 | PHPの基本

以前記事にした記憶があったけど、見つからないので再度メモ。小数をフォーマットするときの記述方法。

例えば「3.205」という数があったとする。これを「03.20500」と表示させるときの記述は以下のようになる。

printf(‘%08.5f’,3.205);

最初の0は「足りない部分は0で埋めましょう」の意味。

次の8は「文字は全部で8文字にしましょう」の意味。

次の.5fは「小数点以下は小数点第5位まで文字にしましょう」の意味(小数点を合わせれば6文字なので、必然的に整数部分は2文字)。

session_set_cookie_params関数

PHPしかやっていなかったときは、極力クッキーを使って値を保存するようなことはしないようにしていた(セッションは使うけど)。クライアントサイドにデータを保存しても改ざんされる前提で使わないといけないからだ。しかし最近はいろいろ使うようにしている。そもそもGETやPOSTでの値引渡しと同じという前提でやれば問題ないわけで。ただ、GETやPOSTと違うのは値をセットする方法で、setcookie関数を使わないといけないところだ。GETやPOSTと同様にこんな感じでクッキーがセット出来ればいいのに。

$_COOKIE[‘_key’]=’_value';

まぁ、できないほうがいいという理由もわかるのだけれど。

で、最近使うようになったクッキーだが、便利な関数があることを知った。session_set_cookie_params関数だ。この関数一つでクッキー周りの設定がすべてできてしまう。

void session_set_cookie_params (
int $lifetime
[, string $path
[, string $domain
[, bool $secure = false
[, bool $httponly = false ]]]]
)

第1引数:セッション有効期限(秒)
第2引数:クッキーが動作するパス
第3引数:クッキーが有効なドメイン名
第4引数:https時のみ使用可能とするかどうか
第5引数:JavaScript等からのクッキーへのアクセスを許可するかどうか

デフォルトではPHPでセットしたクッキーを、JavaScriptから読み込むことはできないのかな。その逆はできるけど。

n進数に変換

ユーザに一意な値を割り当てたいときがある。将来永劫にわたって同じ値は使いたくない。こんなとき一番便利なのはmicrotime関数でUNIXタイムスタンプ値を少数単位まで算出してやればだいたい問題なさそう。ただ、整数部分だけでも10桁あり、例えば少数第4位まで使用するにしても、合計で14桁の数値(文字列)を使わなければならない。これではちょっと長すぎて使いづらい。

そこで思いついたのだが、各桁で使用する数字が10種類(0、1、2、3・・・)しかないから14桁も必要になるわけで、使用する文字種を増やしてやればもっと小さな桁数で表現することができる。数字は10種類あるので、これにアルファベット26文字を足せば合計36種類になる。つまり10進数を36進数で表現すれば文字列の桁数を減らすことができる。

進数の変換をするための関数が用意されている。base_convert関数だ。

この関数を使って14桁の数値(10進数)を36進数に変換すると9文字の英数字に変換してくれる。5文字のお得となる訳だ。ただし、base_convert関数は、極端に大きな数を対象とする場合は誤差が生じるらしい。おおむね14桁の精度らしいが、OSに依存するようだ。

変換関数を作らなければならないと思っていたけど、とりあえずこれで使うことにする。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net