PHPにPOSTできるファイルサイズを調整する

こんばんは。
今日の朝方は、また一段と冷えましたよ!
油断していると風邪をひきそうですね、皆さんも気をつけてくださいな。


システムを作っていると、ファイルのアップロード処理とかありますよね。
でも、アップロードできるファイルの最大サイズは、基本的にサーバー側で設定されています。

post_max_sizeと、upload_max_filesize。
違いはよくわかりませんが、たとえば今借りているこのサーバーだと、

post_max_size 8M
upload_max_filesize 5M

と設定されています。
これで十分だったらいいんですが、そうでない場合もあります。


やり方1:php.iniを修正してApacheなどのサーバーを再起動させる。
サーバー管理者でもないと、無理です。


やり方2:.htaccessで制御する。

php_value upload_max_filesize 20M
php_value post_max_size 20M


これで出来たら問題ないですが、私の借りているサーバーだと制限されているようで、エラーになりました。




やり方3:php.iniで制御する。
↑で「サーバー管理者でもないと、無理です」と書きましたが、php.iniというファイルを作って、必要なディレクトリに置くと設定が反映されます。

upload_max_filesize = 20M
post_max_size = 20M




私の借りているサーバーでも、このやり方だと反映され、phpinfo()でも値が変わっていることが確認できます。








困った時には、お試しください。

CakePHPで論理削除するSoft Deletable Behavior3

『おにぎり家一粒』というお店を知っていますか?
関西にしかないのですが、その名のとおり、おにぎりを売っているお店です。

おにぎりとはいえ、あなどってはいけませんよっ。
注文が入ってから握ってくれるおにぎりはホクホクで、べちょっとしてることはありません。
塩と海苔もとても風味がよく、
「おにぎりってこんなに美味しかったのかー!」
って思えます。

関西に住んでいる人は、一度は食べてみるといいと思います。





本題なのですが、先日記事にしたSoft Deletable Behavior。
CakePHPで論理削除するSoft Deletable Behavior1

CakePHPで論理削除するSoft Deletable Behavior2

既にとあるシステムで積んでいるんですが、ぶっちゃけると、今後も使うにはちょっとなぁという感じです。
理由はいくつかあって、

1.削除する際、削除日時以外にも任意のパラメータを登録したいけど、それが出来ない。
2.削除に成功したかどうかが判らないので、別口でSELECTして削除されているかどうかを確認しないといけない。


というところですね。
1に関しては、たとえば削除する前にsaveで削除者を登録すればいいんですが、それならその時に削除日時と削除フラグも登録してしまう方がスマートです。

2に関しては、「きっと削除されているさ♪」なんてのはシステムの欠陥になりかねないので、削除されているかどうかははっきりしていないとマズイです。
なので別口で確認するのですが、わざわざ別口で確認しないといけないのがスマートじゃないです。
UPDATEする時にわかるはずの項目なのに。


という感じですので、記事にして紹介はしましたが、
あまりオススメしません。

IE6でaタグにonClickを書く時の注意点

チキンタツタが食べたーい!
ということで、この土曜日のお昼に買いにいきました。
やっぱりウマイですね、レギュラーメニューじゃないのが不思議です。
コスト的なものでしょうか?

さて本題は、IE6でおこるバグのお話です。
よくフォームの登録ボタンなどを画像にするために、aタグのhrefにjavascript:void(0)を入れて、onClickでサブミットさせることが多いです。
なのですが、先日ふとIE6で試したら、動かない。
IE7やFirefoxだと無事動くのに・・・。
続きを読む

MySQLでlatin1のデータベースにUTF-8のデータを移行する

チキンタツタが復活してますよねっ、チキンタツタ!!
嫁も「チキンがたった!」とか言って喜んでます。
でも10月15日までの限定メニューらしいですね、この週末に一度は買いに行こうと思います。



仕事ではPostgreSQLを使うことが多い私ですが、ちょっとMySQLのデータベースを移行することがありました。
元のデータベースはUTF-8だったのですが、移行先のデータベースはlatin1。
そのままデータをdumpして持っていっても、間違いなく文字化けします。(しました)

データベースを作る権限があれば作りなおすんですが、ユーザーに権限がなかったので違う方法で。

ALTER DATABASE hogehoge charset=utf8;
ALTER DATABASEでデータベースの文字コードを変換して、それからdumpしておいたデータで復元すると文字化けせずに復元できます。
コンソールから確認する時は、
set names utf8;
するのも忘れずに。

画像がキャッシュされてしまう時の強引な対処法

こんばんわ。

今日は会社の先輩へ送る餞別の品を求めてコムサイズムに行きました。

シンプルなシャツ一枚にしても、ユニクロとかと比較するとちょっとオサレな感じがしますよねっ。

そんなコムサで、シンプルdeオサレなベルトを買いました。







それはさておき、ブラウザのキャッシュ機能ってすごいですよね!

光回線とかのおかげで回線速度が数年前に比べると格段に早くなっているとはいえ、キャッシュ機能でさっき読み込んだ同じ画像をまた読み込んで・・・とかしていると、画像を多様しているサイトはチラチラしたりもっさりしてしまうと思いますし。



でもいいことばかりでもなく、プログラムで画像のアップロード・更新処理などの機能を作った時に先方さんから



「さっき画像をアップロードしたのですが、画像が更新されていないようです」



という問い合わせが飛んできました。

どうもブラウザがキャッシュに残っている古い画像を表示しているようで、「更新ボタン(F5)」を押すとやっと新しい画像がでてくるという状態でした。





それならno-cacheさせたらいいだけだよねと思い、HTMLのMETAに

<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="Mon, 26 Jul 1997 05:00:00 GMT" />
と入れても改善されず。



PHP側から出力されているから、header出力すればいいのかなと思い、PHPで画像を動的に出力する際にキャッシュさせない – KEINOSの日記を参考に
$sEtag = md5(time());
header('pragma: no-cache');
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Etag: "{$sEtag}"\n\n");
と入れても改善されず。





CakePHPが何か悪さしているのかなと思ったりもしましたが、その辺はわからず。。。





なので、強引な手段にいきます。

ブラウザがキャッシュを読み込みにいく条件の一つとして、同じファイル名であるということがあります。

たとえまったく同じ画像でも、ファイル名が違うと違うファイルとなる、当然と言えば当然ですよね。

なので、それを利用します。





こんな感じです。
$image_name = "uploaded.jpg?time=".time();
プログラムを併用して画像の後ろにアクセスごとに変化する何かしらのGETパラメータ(クエリ・ストリング)を付随してあげます。

そうすると、ブラウザが「違うファイルかもしれない」と認識するので、画像を読み込みなおしてくれるようになります。

これはPHPでやっていますが、たとえばjavascriptでもonLoadイベントなどで処理すればできると思います。





ファイル名そのものを書き換える方が無意味なパラメータをつけなくてすむのでいいんですが、そのファイル名が何の画像かを把握できるようにしてあげる必要性があるので、手間を増やさない為にこの方法で強引にやりました。