Memo plus Alpha

メモにプラスアルファを加えて価値ある情報に。

PHPでチェックボックス(checkbox)の値を受け取る

【ポイント】チェックボックスは配列

 

チェックボックスは複数選択可能な入力であるので、注意が必要です。PHPなど、CGIで入力を受け取るとき、値が0のときもあり、1のときもあり、それ以上のときもあるので、それに対応しなければなりません。

 

どのように対応するか、というと、チェックボックスを配列として扱うことです。例えば、checkboxという名前の配列があるとすると、この1つ目にチェックされたチェックボックスのvalueの1つ目が、2つ目にチェックされたチェックボックスのvalueの2つ目が入る、ということです。

 

次の例では、checkboxという配列に値を格納しています。

 

<form method="POST" action="checkbox.php">

<INPUT type="checkbox" id="A"  name="checkbox" value="A">

<LABEL for="comma">Aを選ぶ</LABEL>

<INPUT type="checkbox" id="B"  name="checkbox[]" value="B">

<LABEL for="colon">Bを選ぶ</LABEL>

※labelを設定することで文字列を選んでもチェックできるようになります。

 

両方チェックされていれば、checkbox[0]のvalueはA、checkbox[1]のvalueはBとなります。

 

Aだけチェックされていたら、checkbox[0]はA、checkbox[1]は空っぽです。

 

Bだけチェックされていたら、checkbox[0]はB、checkbox[1]は空っぽです。

 

このとき、必ず0番目から値が埋められていくことに注意してください。つまり、checkbox[0]には、常にはじめにチェックされたもののvalueが格納されるということです(配列番号がチェックボックスの順番と対応しているということではありません)。

 

値の受け取りは、次のようにやはり配列を指定して受け取ります。

<?php

//値の受け取り

$checkbox1 = $_POST["checkbox"][0];

$checkbox2 = $_POST["checkbox"][1]; 

>

この場合、この後に条件分岐をするとすれば、(1)両方チェックされている場合、(2)Aだけチェックされている場合、(3)Bだけチェックされている場合の3つがあります。

 

(1)はif ($checkbox1=="A" AND $checkbox2=="B")

(2)はelseif ($checkbox1=="A") 

(3)はeseif(($checkbox1=="B") 

 

となります。

 

 

 

【Perl】ホームページの更新日時を取得する(html,pdfなど)

ホームページの更新日時取得する方法。

 

「更新が滞っているページ」や「最も古いページ」を調べたい場合、以下のPerlのコードで更新日時を取得できます。

(1) modifieddate.pl

  1. use LWP::Simple;
  2. use HTTP::Status;
  3. require LWP;
  4. require LWP::UserAgent;
  5.  
  6. $ua = new LWP::UserAgent;
  7. $ua->agent("LWP::GETHEAD");
  8. open(URLLIST, "< urllist.txt") or die("error :$!");
  9.  
  10. while (my $line = <URLLIST>){
  11. chomp($line);
  12. $url = $line;
  13. $request = new HTTP::Request HEAD => $url;
  14. $response = $ua->request($request);
  15.  
  16. print "$url\t";
  17. print $response->header('Last-Modified');
  18. print "\n";
  19.  
  20.  
  21. }
  22.  
  23. を参考に作成
  24.  

(2) urllist.txt

調べるURLはurllist.txtに1行ずつ書いておきます。スクリプトと同じフォルダにおいてください。

http:// hogehogehogehoge/xx.html

http:// hogehogehogehoge/yy.html

http:// hogehogehogehoge/zz.html

 

ウェブページからリンクを抽出するには以下のようなサイトが便利(リンク、抽出、で検索)。

http://t.mscl.jp/chk/

 

(3)実行

コマンドラインでmodifieddate.plのフォルダに移動し以下を実行。

perl modifeddate.pl > result.txt

(4)結果

result.txtはこんな感じになります。pdfなどでも取得できるようです。タブ区切りで生成されるのでエクセルなどで読み込んでください。

http:// hogehogehogehoge/zz.pdfThu, 15 Sep 2011 02:23:46 GMT

http:// hogehogehogehoge/zz.html Thu, 15 Sep 2011 02:23:46 GMT

CRONで一定時間ごとにファイルを削除する(さくらレンタルサーバーの場合)

CRONを利用して、サーバー上のファイルを一定時間ごとに削除する方法(さくらレンタルサーバーを利用)。

【CRONで動かすスクリプト】

CRONで直接コマンドを書くこともできますが、スクリプトのほうが柔軟性があるので、次のPHPファイルを動かすことにします。

<?php

 

foreach (glob('www/XXXX/images/*.jpg') as $filename) {

//変更があってから1時間以上たったファイルを削除

if(time()-filemtime($filename)>=3600){

unlink ($filename);

}

}

?>

このスクリプトでは、globでimagesフォルダ内のjpgファイルを対象に、filemtimeでファイルの更新日時を取得し、timeで現在の時間を取得して比較しています。1時間は3600秒なので、これよりも大きい場合(つまり1時間以上経過している場合)はファイルを削除します。

公開フォルダ(www)には置きたくないので、FTPでwwwの上のフォルダ(home/username)直下におきます。

 

【CRONの設定】

さくらのコントロールパネルから、「CRONの設定」で次のコマンドを入力(homeの後は自分のユーザー名になります)。

cd /home/XXXX; /usr/local/bin/php xxxxx.php 1> /dev/null

 

(1)

cd /home/XXXX;

プログラムを置いたところにまずは移動します。

(2)

/usr/local/bin/php

セミコロンと半角スペースを開け、phpの実行ファイルまでのパス。

(3)

xxxxx.php

さらに半角スペースを開けて、home/XXXX直下においたスクリプト名を指定。

(4)

1> /dev/null

これは実行結果をメールでは送らない場合につけます。付けない場合は実行されるごとにpostmasterにメールが届きます。

(5)

時間を指定します。

f:id:semanticist:20130516192244p:plain

上の図は、「8時間毎にxxxxx.phpを実行する」という設定です。このスクリプト内で1時間以内のファイルは消さないことになっていますので、厳密には「9時間以内には必ず消去される」ということになりますね。

 

 

IEで画像のキャッシュを回避する方法(動的に画像を生成する場合など)

ウェブページを早く表示するためのキャッシュ。

これをページで利用させないためには:

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache">

<meta http-equiv="Expires" content="0">

 

とhead部分に書けばよいわけですが、画像の場合、IEではこれが効きません。

 

発生する問題としては:

 

(1)image.jpg→プログラムで変更して上書き保存→(2)image.jpg

 

という場合、IEは(1)のキャッシュを表示してしまうため、(2)の変更後の画像が表示されません(Chrome, FFでは更新されます)。

 

で、いろいろと試したのですが、結局ファイルをリネームすることに。

 

(1)image.jpg→プログラムで変更してimage2.jpgとして保存→(2)image2.jpgを表示し、image.jpgを削除

ちょっと手間ですが、今のところこれしか方法は無さそうです。

PHPでexif情報を削除する(iPod, iPhoneで画像が回転する問題)

 

iPod, iPhoneで撮影した画像は、特殊なExifがつき、ウェブにアップロードされたときに画像が意図しない方向に回転してしまう。

その場合、(1)exifを削除して、(2)アップロード後に画像を回転することで対応。

(1)exifの削除

これにはimagemagickを使う。

さくらインターネットレンタルサーバーを利用している場合、コントロールパネルから「PHP設定の編集」でphp.iniにextension = imagick.soを追加。

phpでの呼び出しはsystem関数を利用する。パスは以下の通り:

system("/usr/local/bin/convert -strip $filepath $filepath");

ここでは、ファイル名を変えずに元のファイルにexifをとったファイルを上書きしている。なお、ダブルクォーテーションの中は変数が展開されるので、$filepathにはあらかじめファイル名をいれておく。

(2)ファイルの回転

ファイルの回転にはgdのImageRotateを使う。これのライブラリはさくらでは設定なしに使用出来る。

//ファイル名と回転角度をpostで受け取る

$filepath = htmlspecialchars(@$_POST{"filepath"}, ENT_QUOTES);

$degree = htmlspecialchars(@$_POST{"degree"}, ENT_QUOTES);

//画像を読み込む

$original_image = ImageCreateFromJPEG($filepath); 

//画像の回転

$newimage = ImageRotate($original_image, $degree, 0);

//ファイルの上書き保存

imagejpeg($newimage,$filepath,100);

 

これでファイルが回転した状態で上書き保存される。なお、回転情報はexifではなく、JPEG(JFIF)のヘッダーに保存される模様。