2016年3月31日木曜日

【CakePHP】余計なヴァリデーションはしない(saveがなぜか失敗する場合)

CakePHPで開発中のシステムで、少し前まで問題なく動いていた新規データ登録フォームからのデータ登録ができなくなってしまっていた。

原因を検索したところ、以下のページがヒット:
cakePHPでsaveできない時

Model->save()の際にヴァリデーションが自動で行われる。
該当のモデルクラスのヴァリデーション設定に問題がないかどうかをチェック。

そういえば、複数のテーブルで同じ名前のフィールドがあったので、自作のModelクラスが共通で継承する抽象クラスにそのフィールド名のヴァリデーション設定を追加していた。
required を true にし、allowEmpty を false にしていたので、Model->save()の際のPOST送信値に該当の名前のデータがない場合ヴァリデーションエラーになってしまう。これが原因だった。新規登録が出来なくなっていた該当テーブルには継承した抽象クラスで設定したヴァリデーションに該当するフィールドがなかった。

教訓:ヴァリデーション設定は横着せずに。

2016年3月25日金曜日

【PHP】ファイルのアップロードについて

cakePHPを使っておなじみな感じのCMS(コンテンツマネジメントシステム)を作っています。
以前お世話になっていた会社の取り扱い商品の情報をバイヤー向けにWeb上で
どんどん発信したいという要求にこたえるもの。

ファイルアップロード処理についてメモ:

【大きなサイズのファイルのアップロードに失敗する場合】
■PHPのタイムアウト設定を疑う
これはおなじみのPHP記述で対応。
set_time_limit(300);

■PHPのアップロードファイルサイズ容量制限設定を疑う
参考 : http://d.hatena.ne.jp/knowledgetree/20110217/1297939617
「php_value upload_max_filesize」だけでなく「php_value memory_limit」
「php_value post_max_size」もセットで気を付けること。
今回はPHPスクリプトからの設定はうまく動かず、.htaccessに記述したらうまく動いた。



【ZIPをサーバー上で解凍する場合】
複数の画像をZIPで一括でアップロードしたいという場合。
たぶん常套手段はZIP解凍用のディレクトリに一時的に解凍して、
ファイル名なんかをチェックしながら本番ディレクトリに移動するというものだろう。

普通に1ファイルずつファイルをアップロードする時と処理を共通化させたいので
通常アップロードメソッドに処理を回したらなかなかうまくいかない。

原因は、move_uploaded_file()関数を使っていたからで、ZIP解凍でサーバー上に出現した
ファイルをこの関数で移動することはできない。
ZIP解凍で出現したファイルを移動する場合はrename()関数を使うこと。

2016年3月14日月曜日

【PHP】__DIR__ は使わない

お馴染みのcakePHPとMySQLとでシステムを作っています。商社のサイトで取扱商品の配布販促物(サムネイルやバナーなど)を表示・管理するシステム。

cakePHP3系を使おうと思ったんですがサーバーにインストールされているPHPのヴァージョンの関係で使えませんでした。

ファイルのインクルードをするとき、現在のファイルのディレクトリ名を取得するのに「__DIR__」という定数を使っていて、ZAMPPでは動いたんですがサーバーではエラーになりました。これ結構新しい定数なんですね。

 dirname(__FILE__) と書き直したら大丈夫でした。

同様に、ある読み込みファイルが画像だったらその幅と高さとを取得したいというとき、
exif_imagetype() 関数を使ってたんですが、これも古いPHPでは真っ白エラーになりました。
getimagesize() 関数のほうが重いらしいんですがこっちは動いたのでこっちで書き直しました。

古いサーバーにシステムを作る際はいろんな注意が必要になりますね。