@blog.justoneplanet.info

日々勉強

PHPの基本-チェックボックスのデータを受け取る

■失敗例(HTML側)

ソース
<form action="test.php" method="post">
<ol>
<li><input type="checkbox" name="check" value="check1" /></li>
<li><input type="checkbox" name="check" value="check2" /></li>
<li><input type="checkbox" name="check" value="check3" /></li>
<li><input type="checkbox" name="check" value="check4" /></li>
<li><input type="checkbox" name="check" value="check5" /></li>
<li><input type="checkbox" name="check" value="check6" /></li>
<li><input type="checkbox" name="check" value="check7" /></li>
<li><input type="checkbox" name="check" value="check8" /></li>
<li><input type="checkbox" name="check" value="check9" /></li>
<li><input type="checkbox" name="check" value="check10" /></li>
</ol>
<input type="submit" value="submit" />
</form>
受信データ($_POST[‘check’]の中身)

たとえば6番目と10番目がチェックされていた場合は、「check10」のみ、1つのデータしか読み出せない。

■解決策(HTML側)

ソース
<form action="test.php" method="post">
<ol>
<li><input type="checkbox" name="check[]" value="check1" /></li>
<li><input type="checkbox" name="check[]" value="check2" /></li>
<li><input type="checkbox" name="check[]" value="check3" /></li>
<li><input type="checkbox" name="check[]" value="check4" /></li>
<li><input type="checkbox" name="check[]" value="check5" /></li>
<li><input type="checkbox" name="check[]" value="check6" /></li>
<li><input type="checkbox" name="check[]" value="check7" /></li>
<li><input type="checkbox" name="check[]" value="check8" /></li>
<li><input type="checkbox" name="check[]" value="check9" /></li>
<li><input type="checkbox" name="check[]" value="check10" /></li>
</ol>
<input type="submit" value="submit" />
</form>
理由

name属性値の末尾に[]の記述がない場合配列としてPHPが受け取れない

チェックボックスでチェックできる個数をJavaScriptでコントロールしよう

■サンプルプレビュー

下記から好きなものを3個まで選んでください。
  • 1.blue
  • 2.yellow
  • 3.red
  • 4.pink
  • 5.green
  • 6.orange
  • 7.gray
  • 8.silver
  • 9.gold
  • 10.white

■サンプルソース(justoneplanet.js

使い方
  1. justoneplanet.jsをダウンロードする
  2. html上にチェックボックスを配置し、制御したいチェックボックスのname属性に同じ属性値を与える
  3. headタグ内に
    <script type="text/javascript" src="ダウンロードしたjsファイルまでのパス"></script>
    と記述する
  4. <script type="text/javascript">
    justoneplanet.utility.limitedCheckbox('上記属性値', 上限個数);
    </script>

    とヘッド内に記述する
注意
  1. JavaScriptを使えない環境のユーザーへ配慮し、厳密に制限したい場合はCGI側でも個数のチェックなどをさせる必要がある

画像を使わずCSSのみで丸角を表現しよう

■サンプルソース

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無題ドキュメント</title>
<style type="text/css">
#test {
    -webkit-border-radius: 20px;
    -moz-border-radius: 20px;
    background-color: #00FFCC;
    width: 200px;
    padding: 50px;
}
</style>
</head>
<body>
<div id="test">
この丸角はFirefoxやSafari3では表示されるが、Internet ExplorerやOperaでは従来どおりの角ばった表示しかされない。
</div>
</body>

■実際の表示

対応ブラウザ(Firefox、Safari3)でご覧ください。その他のブラウザでは従来どおりの角ばった表示しかされません。

この丸角はFirefoxやSafari3では表示されるが、Internet ExplorerやOperaでは従来どおりの角ばった表示しかされない。

■注意

  • 現在のところ大多数が使用しているIEでは未対応の為、IEユーザーへの配慮が必要である。

■Firefoxにおけるプロパティ名

-moz-border-radius

■Safari3におけるプロパティ名

-webkit-border-radius

■CSS3におけるプロパティ名

border-radius

PHPでファイルへ書き込みをしよう

■サンプルソース

<?php
$data = date('Y/m/d H:i:s') . "\t";
$data .= $_SERVER['SCRIPT_NAME'] . “\t”;
$data .= $_SERVER['HTTP_USER_AGENT'] . “\t”;
$data .= $_SERVER['HTTP_REFERER'] . “\n”;
$file = fopen(’dat/access.log’, ‘a’);
flock($file, LOCK_EX);
fwrite($file, $data);
flock($file, LOCK_UN);
fclose($file);
print(’アクセスログを記録しました’);
?>

■出力ファイル例

2008/01/10 17:15:06 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
2008/01/10 17:15:20 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
2008/01/10 17:15:20 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
2008/01/10 17:15:21 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
2008/01/10 17:15:21 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
2008/01/10 17:15:21 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
2008/01/10 17:15:22 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
2008/01/10 17:15:23 /php10/write/index.php Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

■スーパーグローバル変数の解説

  • $_SERVER[‘SCRIPT_NAME’]
    実行中のスクリプト
  • $_SERVER[‘HTTP_USER_AGENT’]
    クライアント環境(ブラウザの種類等)
  • $_SERVER[‘HTTP_REFERER’]
    リファラー(リンク元)

■関数の解説

  • resource fopen(string file, string mode [,int use_path])
    対象のファイルパス、オープン時のモードからオープンに成功した場合、ファイルハンドラを返す
  • int fwrite(resource handle, string string [,int length])
    ファイルハンドルで書き込みファイルを指定し、(指定文字バイト数だけ)文字列を書き込む
  • bool flock(resource handle, int operation)
    ファイルをロックする。ロックのモードは下記のようになる

    • LOCK_SHは共有ロック
    • LOCK_EXは排他ロック
    • LOCK_UNはロック解除
    • LOCK_NBロック中にflockによるブロックを禁止
  • fclose($file);でファイルを閉じる

■追記

  • アクセスログなどにも多少の変更で流用可能

PHPでディレクトリの一覧を表示しよう

■サンプルソース

<body>
<table border="1">
<tr>
<th>ファイル名</th>
<th>サイズ</th>
<th>最終アクセス日</th>
<th>最終更新日</th>
</tr>
<?php
clearstatcache();
$place = './dat/';
$dir = opendir($place);
while($file = readdir($dir)){
//if($file != '..' && $file != '.'){
print('<tr>');
print('<td><a href="' . $place . $file . '">' . $file . '</a></td>');
print('<td>' . filesize($place . $file) . '</td>');
print('<td>' . date('Y/m/d H:i:s', fileatime($place . $file)) . '</td>');
print('<td>' . date('Y/m/d H:i:s', filemtime($place . $file)) . '</td>');
print('</tr>');
//}
}
closedir($dir);
?>
</table>
</body>

■表示例

ファイル名 サイズ 最終アクセス日 最終更新日
. 512 2008/01/10 16:24:38 2008/01/10 16:03:10
.. 512 2008/01/10 16:24:37 2008/01/10 16:03:10
1.txt 0 2008/01/10 16:03:10 2008/01/10 16:17:01
2.txt 4 2008/01/10 16:03:10 2008/01/10 16:17:42
3.txt 0 2008/01/10 16:03:10 2008/01/10 16:17:01
4.txt 0 2008/01/10 16:03:10 2008/01/10 16:17:01

■関数の解説

  • int filesize(string filename)
    ファイルサイズ(バイト)を返す
  • int fileatime(string filename)
    ファイルの最終アクセス日時(タイムスタンプ)を返す
  • int filemtime(string filename)
    ファイルの最終更新日時(タイムスタンプ)を返す
  • 上記string filenameには実行したPHPファイルからのパスを文字列として与える事

■注意

  • ユーザーにディレクトリを指定させる場合は、サーバー上の非公開領域閲覧(ディレクトリトラバーサル)などに注意しましょう。