院生エンジニアのにっき

  • Change style to Blue
  • Change style to Red
  • Change style to Green
  • Change style to Pink

2008-03-07 PHPではまったこと

PHPって・・・と思いました。

  1. <?php
  2.   $hoge = array(
  3.     0 => '数字の「0」',
  4.     1 => '数字の「1」',
  5.     '2' => '文字の「2」',
  6.     'test' => '文字の「test」'
  7.   );
  8.   foreach($hoge as $key => $value){
  9.     if($key == 'test'){echo $value.'<br/>';}
  10.   }
  11. ?>


  続きを読む

コメント(2)

2008-03-06 register_shutdown_function関数内でのファイル保存時の問題

PHPのシャットダウン時(システム終了時)に実行する関数を登録するregister_shutdown_functionという関数を最近知ったのですが、その関数内でfile_put_contentsなどのファイル保存系の関数を利用すると、平常時との挙動が違うことを発見しました。

再現時のPHPのバージョンは5.2.4でした。


  続きを読む

コメント(1)

2008-02-28 ソースコードのコメントについて

Ajaxian » Every keystroke is a prisoner - a neat commenting trickより。

デバッグの最中は頻繁にコードをコメントアウトしたりコメントを除去したり面倒に思う時があります。

  1. hoge();
  2. hoge2();

  1. /*
  2. hoge();
  3. hoge2();
  4. */

でコメントアウトできますが、コメントを元に戻す場合は「/*」と「*/」の両方を除去しないといけません。デバッグの最中に毎回二行修正していては時間の無駄となってしまいます。


  続きを読む

コメント(2)

2008-01-28 mbstring に関するメモ

PHP の mbstring に関するメモが公開されています。


  続きを読む

コメント(0)

2008-01-26 PHPの三項演算子の注意点

  1. <?php
  2. $num = 15;
  3. $res = ($num < 3) ? 1 : ($num < 10) ? 2 : ($num < 30) ? 3 : ($num < 100) ? 4 : 5;
  4. echo $res;
  5. ?>

上のコードの出力結果は以下のうちどれか

  • 1
  • 2
  • 3
  • 4
  • 5
  • エラーメッセージが出力される


  続きを読む

コメント(0)

2008-01-05 正規表現ミスによるSQLインジェクション

現在なぜPHPアプリにセキュリティホールが多いのか?:第5回 まだまだ残っているSQLインジェクション|gihyo.jp … 技術評論社を読んでいるのですが、正規表現の間違いによるSQLインジェクションのいい例がありましたので紹介を。

私はわからなかったのですが、ユーザからのパラメータに対する数値チェックで以下の二つのPHPコードにおける脆弱性についてでした。

  1. if (preg_match('/^[0-9]+$/', $_GET['id'])) {
  2.         $id = $_GET['id'];
  3. }
  4. $res = pq_query('SELECT * FROM product WHERE ID = '.$id);
  1. if (ereg('^[0-9]+$', $_GET['id'])) {
  2.         $id = $_GET['id'];
  3. }
  4. $res = pq_query('SELECT * FROM product WHERE ID = '.$id);


  続きを読む

コメント(0)

2008-01-04 正規表現の最小一致

まだまだ正規表現の修行が足りなかったようです。。

preg_match_all("/\[(.*),(https?:\/\/[a-zA-Z0-9_\.\/\~\%\:\#\?=&\;\-]+)\]/i", $text, $matches);

当ブログシステムで使っているWikiコンポーネント(自作)のURL抽出部分でした。

[タイトル,URL]

でリンクを意味するWiki記法を抽出するための正規表現なのですが、

[タイトル,URL]と[タイトル,URL]

といった記述がある場合、2つに分割されず合体して抽出されてしまいました。


  続きを読む

コメント(0)

2008-01-03 phpMyAdminのタイムアウト時間を延ばす

phpMyAdminは文字のエンコード周りの設定さえうまくいけばデータの簡易チェックとしてとても便利なツールです(最近はクエリのチェックにはシンプルなCSE+ODBCを利用しています)。ただ、以前はconfigファイルの設定をちょっといじればタイムアウト時間を変更することが出来たのですが、最近(私の環境は2.11.2.1です)はちょっと調べないとタイムアウト時間を延ばすことが出来ません。


  続きを読む

コメント(1)

2007-12-16 定期的にWebアクセスを実行させる

cronを定期的に処理を実行させることはよくあります。PHPの場合、

sudo -u user_name /usr/bin/php -f /var/www/html/hage/hoge.php

で(PHPの実行ファイルが/usr/bin/phpにある場合)ユーザ名:user_nameで、/var/www/html/hage/hoge.phpのphpファイルをPHPで実行させることができます。

同一PC内ならそれでもいいのですが、Cron機能が使えないサーバーのためWebアクセスをトリガーにしてで定型処理を行う必要があったためその方法についてです。


  続きを読む

コメント(0)

2007-11-04 For lazy PHP developers. 面倒くさがりなPHP開発者へ

6 PHP coding tips to write less code | Alex @ Netにてlazy developerへPHPのコードを短く書くためのTipsが掲載されていましたので簡単に紹介しておきます。

1. Use || (or) and && (and) operations instead of if.(if文の代わりにand・orを使う)

  1. $status = fwrite($h, 'some text');
  2. if (!$status) {
  3.     log('Writing failed');
  4. }

  1. fwrite($h, 'some text') or log('Writing failed');

に。DRYな感じに出来ます。これは知っている人も多いのではないでしょうか?

A and B→Aがtrue、ならばB

A or B→AがtrueでなければB(つまりAがfalseならB)

確かに以前こんなソースを見たことありますが、実際使う際は書き慣れた書き方になってしまう気もします。


2. Use ternary operator.(一時的なオペレータを使う)はよくやる手法ですね。

  1. if ($age < 16) {
  2.     $message = 'Welcome!';
  3. } else {
  4.   $message = 'You are too old!';
  5. }

  1. $message = 'You are too old!';
  2. if ($age < 16) {
  3.     $message = 'Welcome!';
  4. }

にします。

if文を使う場合に

  1. if($age < 16){
  2.         return false;
  3. } else {
  4.         return true;
  5. }

  1. if($age < 16){
  2.         return false;
  3. }
  4. return true;

とするのはバリデーションがらみの箇所でよく使いますね。


3. Use for instead of while.(while文の代わりにfor文を使う)

  1. $i = 0;
  2. while ($i < 100) {
  3.   $source[] = $target[$i];
  4.   $i += 2;
  5. }

  1. for ($i = 0; $i < 100; $source[] = $target[$i+=2]);

にしています。

ただ、for文の3番目の評価式に数値演算以外($i+=2など)を入れるのは個人的には嫌いだったりします。私の場合上の例でしたら

  1. for ($i = 0; $i < 100; $i+=2)$source[] = $target[$i];

のようにしています(サンプルより2文字多くはなります)。


4. In some cases PHP requires you to create a variable. Some examples you can find in my PHP fluent API tips article. Another example is getting array element when array is returned by the function. (意訳:PHPはjQueryなどのようにメソッドチェーンが出来ないけど汎用関数を使えば出来るよ)

  1. $ext = pathinfo('file.png')['extension'];

  1. $ext = a(pathinfo('file.png'), 'extension');
  2. // returns reference to the created object
  3. function &r($v) { return $v; }
  4. // returns array offset
  5. function &a(&$a, $i) { return $a[$i]; }

で書くことができます(関数aと関数rを定義)。使いどころによってはちょっと便利かもですね。

ってかpathifo($file_name)で連想配列に帰ってくるんですねぇ。今まで

  1. function get_ext($file_name) {
  2.         return echo substr($file_name, strrpos($file_name,'.'));
  3.         //拡張子にドットを含みたくない場合は
  4.         //strrpos($file_name,'.') + 1を使用
  5. }

などの関数を書いていました。。

コメント(0)