2010年8月5日木曜日

PHP: mkdir の recursive と「表」などバックスラッシュ(0x5C)を含む文字

php の mkdir($pathname, $mode, $recursive) で $recursive=true とすると入れ子構造のディレクトリの作成が可能です。
しかしながら、ディレクトリ名が SJIS の場合は「表」などバックスラッシュ(0x5C)を含む日本語文字をディレクトリ名に使用するとうまく処理してくれません。
以下のように独自に入れ子構造を処理する関数を定義する必要があります。
class sample {
 function mkdir($pathname, $mode, $recursive) {
  if (!$recursive) {
   return mkdir($pathname, $mode);
  }

  if (!is_dir(dirname($pathname))) {
   if (!$this->mkdir(dirname($pathname), $mode, $recursive)) {
    return false;
   }
  }
  return mkdir($pathname, $mode);
 }
}
$recursive=true としない mkdir はバックスラッシュ(0x5C)を含む日本語文字も正しく扱いますので心配ないです。

PHP: 携帯で checkbox を配列で受けるには

php で checkbox の複数選択状態を配列で受け取るには通常の場合、
<input type="checkbox" name="cb[]" value="A" />A<br />
<div class="codeblock"><input type="checkbox" name="cb[]" value="B" />B<br />
<div class="codeblock"><input type="checkbox" name="cb[]" value="C" />C<br />
と名前に[]をつけてやればいいのですが、携帯ではうまくいきません。
[]を外してもだめです。
結局、
<input type="checkbox" name="cb[1]" value="A" />A<br />
<div class="codeblock"><input type="checkbox" name="cb[2]" value="B" />B<br />
<div class="codeblock"><input type="checkbox" name="cb[3]" value="C" />C<br />
のように配列風の名前をつけて、受け取った側で名前の形式をチェックし、
配列にセットし直すなどの工夫が必要になります。