ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2013年2月20日水曜日

[php]翌月の末日の取得

phpにて翌月の末日を取得する方法です。

date("Y-m-t" ,strtotime("+1 month"));

2013年2月6日水曜日

[Web]キャッシュされた画像の対策

画像ファイルを同じ名前で更新しても、クライアントにキャッシュされた画像があると新しいファイルが表示されず、キャッシュされたファイルが表示されます。

HTMLのメタタグでキャッシュ制御を行っても、それはHTML自体のキャッシュであって、個別の画像ファイルについては、制御出来ないようです。

ファイル名を変えるのが一番の対策なのですが、制限によりそれが出来ませんでした。

そこでとった対策は、画像のファイル名にURLパラメーターをつける事です。


画像
上の「?abc」の部分です。
これを入れるとブラウザ側は「image.jpg?abc」で一連のファイル名と記憶するので、ファイルを入れ替えた時は「image.jpg?efg」とすれば、新しいファイルとして読み込んでくれます。

今回はphpでの対応が可能でしたので、uniqid()関数を使って対応しました。
画像
気になる点としては、ブラウザがキャッシュすることによってサーバーの負荷が軽減されているのに、毎回読ませることになってしまう所です。

この点の対策としては、パラメーターに設定する値を最終更新日時のハッシュ値とかタイムスタンプなどにしておけば、更新されないうちは同じキャッシュにヒットします。

諸事情により、今回はuniqid()での対応としました。

2012年1月26日木曜日

[PHP]AESで暗号化・復号化

暗号化と復号化する処理です。
基本的にはmanualに書いてある通りです。

受け取った文字をbase64でエンコードして、暗号化して、暗号化した文字もbase64でエンコードしています。
復号化の際も同じ感じです。

暗号・復号処理に関していつものことなのが、これがAESでうまく暗号化されているかはよく分からず、復号化がうまくいっているので良しとしています。


static public function Encrypt($value){

 //Base64でエンコードする
 $encodedValue = base64_encode($value);

 /* 暗号モジュールをオープンします */
 $td = self::getCryptModule();

 /* データを暗号化します */
 $encrypted = mcrypt_generic($td, $encodedValue);

 //暗号化された文字をBase64でエンコードする
 $encodedEncryptValue = base64_encode($encrypted);

 /* 暗号化ハンドラを終了します */
 mcrypt_generic_deinit($td);

 /* モジュールを閉じます */
 mcrypt_module_close($td);

 return $encodedEncryptValue;
}


static public function Decrypt($value){

 //Base64デコードする
 $decodedValue = base64_decode($value);

 /* 暗号モジュールをオープンします */
 $td = self::getCryptModule();

 /* 暗号化された文字列を復号します */
 $decrypted = mdecrypt_generic($td, $decodedValue);

 /* 復号ハンドルを終了し、モジュールを閉じます */
 mcrypt_generic_deinit($td);
 mcrypt_module_close($td);

 //Base64デコードする
 $decodedDecryptValue = base64_decode($decrypted);

 return $decodedDecryptValue;

}

static private function getCryptModule()
{

 /* 暗号モジュールをオープンします */
 //$td = mcrypt_module_open('tripledes', '', MCRYPT_MODE_ECB, '');
 $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_ECB, '');

 /* IV を作成し、キー長を定義します。Windows では、かわりに
  * MCRYPT_RAND を使用します */
 $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
 $ks = mcrypt_enc_get_key_size($td);

 /* キーを作成します */
 $key = substr(md5('very secret key'), 0, $ks);

 /* 復号用の暗号モジュールを初期化します */
 mcrypt_generic_init($td, $key, $iv);

 return $td;
}


2011年12月1日木曜日

[PHP]foreachの参照渡しで見落としがちな事

foreach文で参照渡しをした場合、最後の要素が1つ前の要素と同じ値になっちゃう件です。

$items = array('a','b','c');
foreach($items as &$item){
 echo($item);
}
// --> 'abb'


マニュアルにはちゃんと書いてあるんですけどね。
以下の処理を忘れない事。

unset($item);

2011年11月30日水曜日

[PHP]ディレクトリの再帰削除処理

要件は以下の感じです。

サブフォルダを含めてファイル、ディレクトリを削除する。
ただし、ルートディレクトリは消したくないケースがある。
また、ファイルの最終更新日時が1日以上経ったものだけ削除する。


function rmdirEx($rootPath , $dirDelete){

 if( !is_dir($rootPath)) return;

 $files = scandir($rootPath);

 foreach($files as $file){
  if ($file == '.' || $file == '..') continue;
  $fullpath = $rootPath . DIRECTORY_SEPARATOR . $file;
  if(is_dir($fullpath)){
   rmdirEx($fullpath , true );
  }else{
   $lastUpdateTime = filemtime($fullpath);
   //更新日時が1日以上前のファイルのみ削除する
   if( ($lastUpdateTime + (60 * 60 * 24)) < time())
    @unlink($fullpath);
  }
 }
 //消せれば消す
 if( $dirDelete) @rmdir($rootPath);

}

2011年11月29日火曜日

ajaxuploadを使った。

ブラウザで画像を選択したら、非同期でアップロードして画像を表示したくて使いました。
配布サイトここ(Ajax Upload)

最新版は完全に作り直されたらしくて、「File Upload」って名前に変わってます。
これも色々と試したみたのですが、UI周りのカスタマイズがいまいち分からなかった。

オプション設定で、template、fileTemplate、classesの当たりを設定すれば良さそう何だけど、
ドキュメントも少ないし、心が折れてあきらめました。

その点、旧バージョンのajaxuploadはiframeとか使って怪しいけど、素直で使いやすいです。

$(function(){
 new AjaxUpload('file1', { //input type="file"のid
  action: 'upload.php', //POSTを処理するphp
  name: 'PostName',  //phpで$_FILES['PostName']と使う。
  data: {paramA: 'valueA' ,paramB:'valueB'},  //オプションのデータ。$_POSTで渡される
  onComplete: function(file, response) {   //アップロード完了時のコールバック
   var ret = eval( '(' + response + ')' );  //JSONの展開
   if( ret.success ){
    $('#imageArea').attr('src', ret.path); //イメージの設定
   }
  }
 });

);


PHP側はこんな感じです。

//オプションパラメータの受取
$param = $_POST['paramA'];
$ret = null;
$uploaddir = 'D:\\upload\\';
$filename = basename($_FILES['PostName']['name'])
$uploadfile = $uploaddir . $filename;

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
 $ret = array('success'=>true,'path'=>'/images/' . $filename);
} else {
 $ret = array('success'=>false);
}
echo htmlspecialchars(json_encode($ret), ENT_NOQUOTES);