Tomo のすべての投稿

imagecreatefromstring (PHP)

画像ファイルをバイナリデータとしてデータベースなどに保存した場合、下記のようにヘッダを加え、保存したデータを加えると、画像ファイルそのものをブラウザに出力することができます。

header("Content-Type: image/jpeg");

そのとき、何らかの処理をしたい場合は imagecreatefromstring を使うと便利です。本来であれば、テンポラリファイルを作成、加工、出力、テンポラリファイル削除、といった手順が必要になりますが、その手間を省くことができます。 テーブル名:TABLE、項目名:JPEG、ID:123の画像を横幅100pxに縮小して表示する場合の例です。 続きを読む imagecreatefromstring (PHP)

sortの挙動 (PHP)

配列の並び替えsortを使う際には、データの形式に注意しましょう。2 番目のパラメータの指定によって挙動は下記のように変化します。

  • SORT_REGULAR 通常通りに項目を比較
  • SORT_NUMERIC 数値的に項目を比較
  • SORT_STRING 文字列として項目を比較

文字列として入っていた数値を並び替える場合(たとえば少数など)は明示的にSORT_NUMERICとする必要があります。

sort($array,SORT_NUMERIC)

このようにして数値として並び替えます。

実行時間の測定 (PHP)

処理にかかる時間を計りたいときは以下のようにします。
どれくらい正確かは不明ですが、かなり細かく計測できます。

$start = microtime(TRUE);
//いろいろな処理
$stop = microtime(TRUE);
print ($stop-$start);

分単位または数十秒単位ならtime();でも可能です。

2015/1/28修正
microtime()の引数にTRUEを指定しました。デフォルトではFALSEが指定され、この場合、文字列として返されるため、引き算ができません。

文字列中に指定した文字が何回出現するか (PHP)

文字列中に指定した文字が何回出現するかを確認するためにはsubstr_countを使います。

substr_count('123/13/222/3', '/');

結果は4となります。区切り文字等を数えて、項目数を数えたりできます。もちろん、検索する文字は2文字以上でも可能です。ただし、重なる場合は1つとカウントされます。

substr_count('abcabcabc', 'abcabc');

この場合の結果は1です。

半角文字から全角文字を取り除く (PHP)

文字列の中の全角文字をを取り除くか、別の文字に変換するために以下のようにしてみました。mb_strlenとstrlenを使っています。

$line = 123あいう456
$newline = '';
for ($i = 0;$i <= mb_strlen($line);$i++){
	if (strlen(mb_substr($line,$i,1)) == mb_strlen(mb_substr($line,$i,1))){
		$newline .= mb_substr($line,$i,1);
	}else{
		$newline .= 'a';
	}
}

結果は 123aaa456となります。
else内を消せば、結果は123456です。
単純に半角にするだけならmb_convert_kanaが使えます。半角に対応のない全角文字を消去または置き換える場合には使えません。

getやpostで受け取った値を表示 (PHP)

formからpostまたはgetで送られた値をデバッグ中などに参照したいときは<pre>タグとprint_rを使うと見やすく表示されます。

<?php
print"<pre>";
print_r($_POST);
print"</pre>";
?>

とすれば、

Array
(
[name] => 名前
[mail] => メール
)

などと表示されます。getやpostのデータだけでなく、配列を表示する際にも便利です。ネスト(入れ子)された状態でもすべて表示されます。

私はだれ?(スクリプト自身の名前) (PHP)

phpスクリプト自身の名前は$_SERVER[‘PHP_SELF’]に入っています。デバッグなどでは簡単に使うことができますが、クロスサイトスクリプティング(XSS)脆弱性があるので以下のようにするのが望ましいです。

$_SERVER['PHP_SELF']  = htmlspecialchars($_SERVER['PHP_SELF']);

しかし、CGI版でなければ$_SERVER [‘SCRIPT_NAME’]が推奨らしいです。
ほかにも$_SERVER[] には脆弱性があるようなので注意しましょう。
ディレクトリ部分を除いたファイル名のみを表示する場合はbasename()を使用します。

ブラウザが閉じても処理を続ける (PHP)

PHPで処理に時間がかかっている場合、途中でブラウザを閉じてもPHPは実行を続けようとします。 その中で、ブラウザとの接続が無いと(無いことがわかったところで)処理が中断されます。中断せずにそのまま続行するためには、php.iniのignore_user_abortをtrueにします。例えば、ページを開くことをトリガーにしてなにかの処理を完結する場合などでは必要だと思います。

通常は ignore_user_abort をfalseとし、例外的にtrueにしたい場合は、スクリプトの中で以下のように記述することででも可能です。デフォルトでは多くのレンタルサーバーではfalse(off)になっているようです。さくらインターネット、Coreserverではfalseでした。

ignore_user_abort(true);

このほうが、サーバーへの負荷は少なくなります。
ブラウザとの接続については出力しようとしたときに確認されるようなので、ignore_user_abortがfalseでも、ブラウザを閉じたと同時に処理が中断するわけではなさそうです。