_onichannn

【HTML】disabled属性のついたinput要素は値がポストされない。

嵌ったのでメモ。

inputで要素を生成する際にdisabled属性を指定するとブラウザ側が操作をできないようにしてくれるが、単に値の変更が出来ないだけだと思っていたら大間違いだった。
disabled属性をつけたselect要素の値をjQueryにて書き換え、その値をポストさせようとしていたところ、どうもバリデーションに引っかかる。
徐にPOST値をダンプしてみたところどうもブラウザが値を送信していない模様だったので、試しにdisabledをはずしてみたら普通に受け取ることが出来た。

まぁ普通に考えればその挙動は正しい。フォームを無効にしているのだから値がポストされてはセキュリティ的にマズイ場合も当然あるだろう。
ということで今回は原因が判明し別のアプローチをとることができたのでスッキリ。
今後同じミスで時間を浪費しないためにも今回の件を忘れないようメモっておく。

 

【MySQL】DBのDumpファイルをターミナルからインポートする方法。

PhpMyAdminでダンプファイルを生成したはいいものの、インポートする際にsqlファイルのアップロード容量制限にひっかかってしまうので、どうにかこうにか流し込む方法はないかと調べてみた。

1, まずは手に入れたダンプファイル(.sql)を任意のディレクトリに置く

2, 次にターミナルを起動。su権限でログインしたら、ダンプファイルが置いてある階層まで移動する

3, 最後に下記コマンドを実行

mysql -u [ユーザー名] -p [テーブル名] < [ダンプファイル名]  

例。

mysql -u root -p hoge < dump.sql

この方法であれば何十メガだろうが何百メガだろうが数ギガバイトだろうがSQLを流し込むことが出来る(はず)。
しかもブラウザからインポートするよりも圧倒的に高速なので激オススメ。

 

【CakePHP2.3】ポスト可能なテキストリンクを出力する。

めも。

FormHelper::postLink()メソッドを使用する。
サブミットボタンではなく、あくまでもテキストリンクのクリックをトリガーに値の送信を開始したい場合に便利。

■書式

$this->Form->postLink($title, $url, $options, $confirmMessage);

■引数詳細

プロパティ 初期値 詳細
$title 省略不可 リンクのタイトル
$url null 値のサブミット先URL。Router::url()と同一のフォーマットで指定
$options array() フォームオプションの他、array(‘data’)が使用可能
$confirmMessage false 文字列を指定すると、確認メッセージとして出力してくれる

FormHelper::postButton()と似ているが、こちらはボタンではなくリンクである点が特徴。同時にJavascriptが生成され、ポスト自体はJavascriptによって行われる。postButton()メソッドと同様、$options[‘data’]にフォームからの値を渡すことでhiddenにて値を保持してくれる。

例えば以下のようなコードで。

<?php echo $this->Form->postLink('Submit', array('controller' => 'Hoges', 'action' => 'complete'), array('data' => $data)); ?>

※第三引数array(‘data’)の形式はpostButton()メソッドをまとめた際のエントリを参照されたし。↓

【CakePHP2.3】単独動作するサブミットボタンを出力する。

このようなHTMLが出力される。

<form action="/designs/test" name="post_524bb0f13ae60601421806" id="post_524bb0f13ae60601421806" style="display:none;" method="post">
	<input type="hidden" name="_method" value="POST">
	<input type="hidden" name="data[name]" value="hoge">
	<input type="hidden" name="data[password]" value="fuga">
	<input type="hidden" name="data[url]" value="http://google.com">
</form>
<a href="#" onclick="document.post_524bb0f13ae60601421806.submit(); event.returnValue = false; return false;">Submit</a>

 

【PHP】strtotime()に00日を渡すと、前月最終日の値が返却される。

はまったのでメモ。

たとえば。

$time = strtotime('2013-10-01');
var_dump(date('Y-m-d H:i:s', $time));
↓
string(19) "2013-10-01 00:00:00"

これは当然。
しかしこの状態で日付を00にした場合。

$time = strtotime('2013-10-00');
var_dump(date('Y-m-d H:i:s', $time));
↓
string(19) "2013-09-30 00:00:00"

00を指定した場合、1日前と判定される模様。
すなわち9月30日が返却される。

微妙にはまったので今後は気をつけよう。

 

【PHP】ファイル、及びディレクトリがシンボリックリンクかどうか調べる。

めも。

// ファイル単位の調査
$bool = is_link('/path/to/targetFile.ext');

もしくは。

// ディレクトリがシムリンクかを調査
$bool = is_link('/path/to/targetDir');

 

【PHP】ファイル、及びディレクトリの存在チェック、書き込み可否を同時に行う。

めも。

// ファイルの書き込みチェック
$bool = is_writable('/path/to/file.ext');

もしくは。

// ディレクトリの書き込みチェック
$bool = is_writable('/path/to/dir');

以前記事にしたfileperms()を用いたやり方よりもお手軽で便利。厳密にパーミッションを判定したい場合を除き、ほぼこれでことたりるかと思われる。

ちなみにis_writeable()はis_writable()のエイリアスなので、全く同じ動作をする。
※「e」が在るか無いかの違い。

 

【CakePHP2.3】単独動作するサブミットボタンを出力する。

FormHelper::postButton()メソッドを使う。
フォーム入力の確認画面やAjaxを用いたサブミットボタンなどを実装したい場合にとても便利。

■関数定義

$this->Form->postButton($title, $url, $options)

■引数詳細

プロパティ 初期値 詳細
$title 省略不可 ボタンに表示する文字列を指定
$url 省略不可 値のサブミット先URLを指定。例の如くRouter::url()形式のフォーマットで指定可能
$options array() オプション値。フォームオプションの他、array(‘data’)に入力データを渡してやることでhiddenタグを吐かせることも可能

 

以下例。

まずは入力欄のビューで以下のようなフォームを生成したと仮定。
※項目は超適当。

<?php echo $this->Form->create('Hoge'); ?>

<?php echo $this->Form->input('name', array('type' => 'text')); ?>

<?php echo $this->Form->input('password', array('type' => 'password')); ?>

<?php echo $this->Form->input('url', array('type' => 'url')); ?>

<?php echo $this->Form->end('Send'); ?>

上記で出力されたフォームより送信された値を処理するアクション内(確認画面を想定)で以下のように値をそのままビューに渡してやる。
※ここでは省略しているが、バリデーション処理をしないと脆弱性の塊なので注意。

$this->set('data', (!isset($this->data['Hoge'])) ? null : $this->data['Hoge']);

そして確認画面のビューでは下記の通り。

<?php echo $this->Form->postButton('Submit', array('controller' => 'Hoges', 'action' => 'confirm'), array('data' => $data)); ?>

すると一気に以下のようなHTMLを吐き出してくれる。
※実際は改行とインデント無しの一行で出力される。

<form action="/Hoges/confirm" method="post" accept-charset="utf-8">
	<div style="display:none;">
		<input type="hidden" name="_method" value="POST">
	</div>
	<input type="hidden" name="data[name]" value="hoge">
	<input type="hidden" name="data[password]" value="fuga">
	<input type="hidden" name="data[url]" value="http://google.com">
	<button type="submit">Submit</button>
</form>

「hidden」属性で入力値を保持してくれているので、出力されたボタンをクリックすれば次のアクションへ値をそのまま送信できるのである。
ユーザーへのプレビューはビューにセットされた$dataを好きに調理して表示してやればよい。

今までは確認画面での値保持をSessionでやっていたが、Sessionの有効期限が切れてしまった場合を考慮するのであればこっちのほうが親切なのかもしれない。hiddenのvalueを悪意ある文字列に直接書き換える輩がいるとも考えられるが、CakePHPを使っていればsave()メソッド前にどうせ自動的にバリデーションがかかるので、モデルさえしっかり設計しておけばなんら問題はないであろう。

 

【CakePHP2.3】パンくずリストを生成する方法。

HtmlHelper::addCrumb()、HtmlHelper::getCrumbs()、HtmlHelper::getCrumbList()を利用すると便利。

■関数定義

$this->Html->addCrumb($name, $link, $options)
$this->Html->getCrumbs($separator, $startText)
$this->Html->getCrumbList($options, $startText)

 

■引数詳細

・addCrumb()

※パンくずリストを追加する

引数 初期値 詳細
$name 省略不可 項目のテキストそ指定
$link null 項目のリンク先を指定。文字列または配列形式。link()メソッドの引数と同じ形式が利用可能
$options null link()メソッドに渡す追加オプション

 

・getCrumbs()

※パンくずリストを生成する

引数 初期値 詳細
$separator ‘&raquo;’ パンくずリストの区切り文字を指定
$startText false パンくずの先頭項目を指定。文字列の場合リンクが「/」になる。連想配列を渡す場合、キー「url」でURL、「startText」でテキストを指定できる。「url」をfalseにするとリンクを無効にでき、「startText」をfalseにすると追加処理を無視することが可能

 

・getCrumbList()

※ul/liタグを用いてパンくずリストを生成する

引数 初期値 詳細
$options array() ul/liタグに含めるオプションを指定する。詳細は下記表を参照
$startText false パンくずの先頭項目を指定。文字列の場合リンクが「/」になる。連想配列を渡す場合、キー「url」でURL、「startText」でテキストを指定できる。「url」をfalseにするとリンクを無効にでき、「startText」をfalseにすると追加処理を無視することが可能

※$optionsで指定可能なプロパティ一覧

キー 初期値 詳細
firstClass ‘first’ 最初の項目に指定するCSSクラス名
lastClass ‘last’ 最後の項目に指定するCSSクラス名
separator パンくずリストの区切り文字

以下例。

■パンくずを追加する際。

$this->Html->addCrumb('hoge', array('controller' => 'piyo', 'action' => 'fuga'));

■パンくずを出力する際

$this->Html->getCrumbList(array(), 'Home')

これめっちゃ便利ですやん。素敵やん。