Posts tagged error
[iPhone] Xcode3.2 で cocos2d の Device Build でエラーになる
1cocos2d の Device Build で以下のエラーがでました。シミュレータでは出ずに実機ビルドだけです。
[iPhone] 実機転送時にセキュリティーエラーになった時の対処方法
1Xcode から iPhone にアプリを転送しようとしたら、コンソールに下記のエラーメッセージが出て転送できませんでした。
Error launching remote program: security policy error.
原因と解決方法を先に書くと、原因は期限が切れたプロファイルがあったためで、解決方法は期限切れのプロファイルを削除すると無事転送できるようになりました。
この期限切れのプロファイルは転送するアプリで使用しているプロファイルとは関係なくてもセキュリティーエラーに引っかかるようです。今回も実際に転送するアプリとは違うアプリで使用しているプロファイルが期限切れでした。
(続きを読む…)
[iPhone] XML を NSXMLParser を使用して解析する
1iPhone では NSXMLDocument がシュミレータでは動作するが実機では動作しないそうなので、NSXMLParser を使用して解析してみました。
解析したのは下記のような XML です。
<?xml version="1.0" encoding="UTF-8"?> <users> <user name="hoge" age="20" /> <user name="fuga" age="30" /> </users>
PHP の flock 関数を勘違いしていました
1PHP の flock 関数を数年ぶりに使用したのですが、すごい勘違いをしていました。DB を使用するようになってからいうものめっきりファイルロックなど使わなくなっていたので。。。(言い訳です^^)
(続きを読む…)
CakePHP1.2 Security コンポーネントを使用して SSL でのみアクセスを許可する
0開発案件でアクション毎に SSL でのアクセスを必須にしたかったので調べていたところ下記の情報がありました。
SSL経由でのアクセスを必須にする[CakePHP] YARETOKO「ヤレトコ」メインブログ
早速 cake/cake/libs/controller/components/security.php のソースを確認して検証してみました。
(続きを読む…)
CakePHP 1.2 Form ヘルパーで input タグとエラーメッセージを別々に表示する方法
2CakePHP1.2 では Form ヘルパーの input メソッドでエラーメッセージを自動的に表示することが可能です。 自動的にエラーメッセージを表示するためには CakePHP1.2 のバリデーション で書いたようにモデルのバリデーションでエラーメッセージを設定しておきます。
/* モデルのバリデーション */ var $validate = array( 'email' => array( 'required' => array( 'rule'=>VALID_NOT_EMPTY , 'message' => '必須項目です' ), ); /* View の Form ヘルパー */ echo $form->input('User/email', array('type'=>'text'));
CakePHP Ajax のフォームを作成する
5今さらなのですが CakePHP1.1 で Ajax のフォームを作成するというのをやったのでメモしておきます。
Ajax , Javascript ヘルパーを使用できるようにする
コントローラで Ajax, Javascritp ヘルパーを使用できるようにする。
var $helpers = array('Ajax', 'Javascript');
prototype.js を読み込む
webroot/js に prototype.js を配置し、ビューで読み込みます。
<?php echo $javascript->link('prototype'); ?>
ビューでフォームを作成する
今回は submit ボタンを押した後、更新中には submit ボタンを消して変わりに「更新中」というメッセージを表示し、更新終了後にメッセージをボタンの下の id=ajax_message に表示するようにしました。
<?php $options = array( "update" => "ajax_message", "loading" => "Element.hide('ajax_button'); Element.show('ajax_loading');", "complete" => "Element.show('ajax_button'); Element.hide('ajax_loading');", ); echo $ajax->form("/controller/action/", "post", $options); ?> <?php echo $html->input('Model/Field', array('type'=>'text')); ?><br> <input type="submit" id="ajax_button"> <div id="ajax_loading" style="display:none;">更新中...</div> <div id="ajax_message"></div>
$ajax->form の $options の
“update” で更新するメッセージ領域を指定し、
“loading”でアップロード中の動き、
“complete” で処理終了後の動き
を指定しています。
コントローラに Ajax で処理するアクションを作成
function action() { $this->layout = 'ajax'; /* $this->data にフォームの内容が渡るので必要な処理を書く */ $this->Model->id = $this->data['Model']['id']; $this->Model->saveField("Field", $this->data['Model']['Field'], true); }
$this->layout で ‘ajax’ を指定して余計なヘッダ、フッタが出ないようにします。
Ajax で出力するビューを作成する
上のコントローラのアクションで出力するビューを作成します。
上の例では saveField でフォームから送られてきたデータを使用して更新処理しています。その結果によってメッセージを送信します。
<?php if($msg=$error->messageFor('Model/Field')) { echo $msg; } else { echo "更新しました"; } ?>
CakePHP jQuery を使用した Ajax ファイルアップロード
6下記ページを参考にさせていただきました。
“jQueryを使ったAjaxファイルアップロード” フォーラム – CakePHP Users in Japan
David Golding Design Blog -
上記ページでは jQuery を使用してテキストファイルをアップロードしてテキストの内容を表示するというものですが、画像をアップロードしてアップロードした画像をフォームの下に Ajax を利用して表示するというのをやってみました。
jQuery 使用準備
jquery.js と jquery.form.js を app/webroot/js/ 以下に配置します。
アップロードするビューで上記 JavaScript ファイルを読み込むため下記コードをビューに追加します。
<?php echo $javascript->link(array('jquery.js','jquery.form.js')); ?>
ビューにアップロードするフォームを作成する
今回は users コントローラの form アクションでフォームを表示します。Ajax の処理を行うのは users コントローラの upload アクションです。
views/users/form.ctp
<h1>upload test</h1> <?php echo $form->create('User',array('name'=>'uploadForm','id'=>'uploadForm','type'=>'file'));?> <?php echo $form->input('upload_file',array('label'=>'Upload Text File ','type'=>'file'));?> <?php echo $form->button('アップロード',array('onClick'=>'$('#uploadForm').ajaxSubmit({target: '#uploadFile',url: '/users/upload'}); return false;'));?> </form> <div id="uploadFile"></div>
コントローラの処理
views/users/form.ctp から「アップロード」ボタンを押すと users/upload アクションの $this->data にアップロードファイルの情報が入ってきます。ここでは mime タイプによって JPEG ファイルのみをアップロードできるようにしています。アップロード後に views/users/upload.ctp を出力します。
function upload() { if (!$this->data['User']['upload_file']) { $this->set('error','アップロードするファイルを選択してください'); $this->render('upload','ajax'); } else { if ($this->data['User']['upload_file']['type'] != 'image/jpeg') { $this->set('error','アップロードできる画像は JPEG のみです'); $this->render('upload','ajax'); } else { $filename = '/files/'.intval(rand()).'.jpg'; rename($this->data['User']['upload_file']['tmp_name'], WWW_ROOT.$filename); $this->set('filename', $filename); $this->render('upload','ajax'); } } }
Ajax が返すビューを作成する
/users/upload で処理した結果を返すビューを作成します。今回は veiws/users/upload.ctp として作成しました。ここで img タグによりアップロードしたファイルを表示しています。
<?php if (!empty($error)): ?> <p><?php echo $error;?></p> <?php else: ?> <p>Upload successful</p> <?php echo $html->image($filename); ?> <?php endif; ?>
以上で jQuery を使用して Ajax で画像のアップロードができます。
.htaccess で error_reporting を設定するときの注意点
5.htaccess で PHP が出力するエラー表示を制御するには E_ALL などの定数は使えないので、ビット値で指定する必要があります。
E_ALL & ~E_NOTICE を設定する場合
php.ini
error_reporting = E_ALL & ~E_NOTICE
php コード内
error_reporting(E_ALL ^ E_NOTICE);
.htaccess
php_value error_reporting 6135
error_reporting に設定する値は PHP: error_reporting – Manual を参照するといいでしょう。
値 | 定数 |
---|---|
1 | E_ERROR |
2 | E_WARNING |
4 | E_PARSE |
8 | E_NOTICE |
16 | E_CORE_ERROR |
32 | E_CORE_WARNING |
64 | E_COMPILE_ERROR |
128 | E_COMPILE_WARNING |
256 | E_USER_ERROR |
512 | E_USER_WARNING |
1024 | E_USER_NOTICE |
6143 | E_ALL |
2048 | E_STRICT |
4096 | E_RECOVERABLE_ERROR |
ちなみに E_ALL & ~E_NOTICE の値が 6135 になる理由は E_ALL の値が 6143、E_NOTICE の値が 8 なので 6143-8=6135 になります。(または E_NOTICE と E_STRICT 以外の値を足した数が 6135 になります。
私は開発中は E_NOTICE も表示するようにしていますが、結構表示させない人が多いようで人のコードを修正するときなど Notice エラーが出て困ることがあります。E_NOTICE を表示するようにしておくと未定義の変数などバグの元になりやすいものを教えてくれるのでお勧めです。
また、開発終了して本番運用するときにはブラウザにエラーを出力しないように
error_reporting(0);
を設定しておくことを忘れずに!
その際も PHP のエラーはエラーログに記録されるようにしておかないのも忘れずに。
HTTP_Request を使用してファイルをアップロードする方法
1PEAR の HTTP_Request を使用してファイルをアップロードする方法です。
<form action='POST_URL' method='post' enctype='multipart/form-data'> <input type='text' name='title'> <textarea name='body'></textarea> <input type='file' name='upload_file'> <input type='submit'> </form>
上記のような HTML でファイルをアップロードする場合と同じような処理をするには、下記のように HTTP_Request を使用します。
// POST パラメータ $post_data = array( 'title' => $title, 'body' => $body, ); // アップロードパラメータ $upload_file = array( 'name' => 'file', 'path' => '/path/to/file', ); // アップロード $rs = http_send(POST_URL, $post_data, $upload_file); function http_send($url, $params, $upload_file=null) { $req = new HTTP_Request(); $req->setMethod(HTTP_REQUEST_METHOD_POST); foreach ($params as $key => $val) { $req->addPostData($key, $val); } $req->setURL($url); if ($upload_file) { $res = $req->addFile($upload_file["name"], $upload_file["path"]); if (PEAR::isError($res)) { echo $res->getMessage(); exit; } } if (!PEAR::isError($req->sendRequest())) { return $req->getResponseBody(); } else { return false; } }