文字列中に指定した文字が何回出現するかを確認するためにはsubstr_countを使います。
substr_count('123/13/222/3', '/');
結果は4となります。区切り文字等を数えて、項目数を数えたりできます。もちろん、検索する文字は2文字以上でも可能です。ただし、重なる場合は1つとカウントされます。
substr_count('abcabcabc', 'abcabc');
この場合の結果は1です。
文字列中に指定した文字が何回出現するかを確認するためにはsubstr_countを使います。
substr_count('123/13/222/3', '/');
結果は4となります。区切り文字等を数えて、項目数を数えたりできます。もちろん、検索する文字は2文字以上でも可能です。ただし、重なる場合は1つとカウントされます。
substr_count('abcabcabc', 'abcabc');
この場合の結果は1です。
phpの便利なところはHTMLとの親和性が高いことです。(成立過程から当然ですが。)
HTMLのタグを取り除くにはstrip_tags()が使えます。第2引数に取り除きたくないタグを指定できるなど、柔軟性もそこそこあります。
文字列の中の全角文字をを取り除くか、別の文字に変換するために以下のようにしてみました。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が使えます。半角に対応のない全角文字を消去または置き換える場合には使えません。
formからpostまたはgetで送られた値をデバッグ中などに参照したいときは<pre>タグとprint_rを使うと見やすく表示されます。
<?php print"<pre>"; print_r($_POST); print"</pre>"; ?>
とすれば、
Array ( [name] => 名前 [mail] => メール )
などと表示されます。getやpostのデータだけでなく、配列を表示する際にも便利です。ネスト(入れ子)された状態でもすべて表示されます。
phpスクリプト自身の名前は$_SERVER[‘PHP_SELF’]に入っています。デバッグなどでは簡単に使うことができますが、クロスサイトスクリプティング(XSS)脆弱性があるので以下のようにするのが望ましいです。
$_SERVER['PHP_SELF'] = htmlspecialchars($_SERVER['PHP_SELF']);
しかし、CGI版でなければ$_SERVER [‘SCRIPT_NAME’]が推奨らしいです。
ほかにも$_SERVER[] には脆弱性があるようなので注意しましょう。
ディレクトリ部分を除いたファイル名のみを表示する場合はbasename()を使用します。
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でも、ブラウザを閉じたと同時に処理が中断するわけではなさそうです。
PHPでは変数が数値かどうかを確かめるための関数があります。
is_numeric($nanika)で$nanikaが数値ならtrueを返しますが、ここで注意が必要です。
注意としては、0xで始まる16進数や、小数、またはピリオドから始まる数字(たとえば”.12″など)も数値として判断されます。
整数のみを判別する場合は、is_int()を使うべきかもしれません。小数かどうかを判定するis_floatという関数もありますがこちらは、整数をfalseとし、”1e7″などの科学記法はtrueと判断されます。いわゆる「数字」というものがどれを指すか(指したいのか)を、十分考慮に入れて使用する必要があります。そのため、正規表現を用いた方が確実な場合もあります。
PHP5には標準でSQLiteが付属しています。
データが一つのファイルで完結するので非常に管理が楽です。この点はバックアップなどでは有利です。
ところで、多くのデータベースで、レコードの追加、削除を繰り返すと、ファイルが肥大化してしまいます。(処理速度向上のため削除したレコードに削除フラグを立てるだけにすることが多いようです。)
SQLiteの最適化はVACUUMコマンドで行うことができます。
続きを読む SQLiteのデータベースファイル最適化 (PHP)
PHPで日付を生成する際にはチェックが必要な場合があります。
例えば、2100年2月29日は存在するか?といったことです。
閏年は4年に一度ですが、さらに100年に1度の2月29日はありません。さらに400年に一度は2月29日があります。従って2100年2月29日は存在しません。2200年2月29日も存在しません。ところが、2000年2月29日は存在します。
2000年2月29日を何の感慨もなく過ごしましたが、400年に1度の珍しい日であったようです。
時間のかかる処理を行った場合、Maximum execution time of 30 seconds exceededというエラーで止まることがあります。
こんなときは以下のように対処します。
set_time_limit(60);
(数値は制限時間、この場合は60秒)
0をセットすることで、制限なしにもできますが、さくらインターネットのライトでPHPを使う場合は無視されている様子です。
呼び出しごとにタイマーがリセットされるので、処理の途中で再度呼び出すことで制限時間を延ばすことができます。