BIBORock

BIBORock

プログラミングやサイト作成の備忘録です

Amebaでブログを始めよう!
Google chromeの設定→ツール→デペロッパーツールを起動(Ctrl+Shift+i)
右下の歯車(Setting)→OverridesタブのUseragentのチェックボックスにチェック
プルダウンのユーザーエージェントから選択するか、Otherを選択し入力枠に任意のユーザーエージェントを設定
foreachなどでループさせながらデータベースに新規保存する場合、
$this->Foo->save()
とやるとUPDATEとなり同じ行が更新されるので、毎回
$this->Foo->create()
をコールしてから保存することで解決できる
独自バリデーションを記述する

  'picture' => array(
'rule1' => array(
'rule' => array('filesize', 204800),
'message' => '200KB以下にしてください。'
),
'rule2' => array(
'rule' => array('width', 2048),
'message' => '幅を2048pxまでにしてください'
),
'rule3' => array(
'rule' => array('height', 2048),
'message' => '高さを2048pxまでにしてください'
)
)


呼び出す関数の方はこのように。

    function filesize($data, $limit) {
return $data['picture']['size'] < $limit;
}

function width($data, $limit) {
list($width, $height, $type, $attr) =
getimagesize($data['picture']['tmp_name']);
return $width < $limit;
}

function height($data, $limit) {
list($width, $height, $type, $attr) =
getimagesize($data['picture']['tmp_name']);
return $height < $limit;
}


バリデーションが通る式をreturnすれば、その式通りでない場合はバリデーションルールに引っ掛かる形になる
掲示板などの記事で、入力されたメールアドレス、URLを自動的にリンクを生成する

preg_replace('/(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/', '$lt;a href="\\1\\2"$gt;\\1\\2$lt;/a$gt;', $comment);
preg_replace('/([a-zA-Z0-9_\.-]+\@)([a-zA-Z0-9_\.-]+)([a-zA-Z]+)/', '$lt;a href="mailto:\\1\\2\\3"$gt;\\1\\2\\3$lt;/a$gt;', $comment);


のような仕組みだと、例えばGoogleカレンダーのようなURLに@を含むものをメールアドレスと認識してしまう

@をURLエンコードし、%40と記述することでURLとして認識されるようになる
.htaccessで自前の404などを用意している場合、
404ファイルなどのアドレスを絶対パスで記述すると302 Foundと認識されて、
ページに 404 と表示されても、404 が返されたわけではありません。
という現象が発生しクロールエラーを生みます

404ファイルなどのアドレスをスラッシュから始まる相対パスで記述することでこの問題は回避されます
preg_replace('/(\d{4})-(\d{1,2})-(\d{1,2})/e', '\'$1\'.\'年\'.intval(\'$2\').\'月\'.intval(\'$3\').\'日\'', $date);

preg_replace('/(\d{4})-(\d{1,2})-(\d{1,2})\s(\d{1,2}):(\d{1,2}):(\d{1,2})/e', '\'$1\'.\'年\'.intval(\'$2\').\'月\'.intval(\'$3\').\'日 \'.intval(\'$4\').\'時\'.intval(\'$5\').\'分\'.intval(\'$6\').\'秒\'', $datetime);

\dは整数 \d{1,2}は数字が一つか二つにマッチ
intval関数でゼロサプレス(頭にある余計な0を排除)する
(数字が一桁の場合はゼロサプレスする必要はないが、それだと一桁の場合は置換対象から外れてしまうため一緒に処理させています)
$tnum = 0;
$anum = 0;
$ary = str_split('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%=~|`{+*}?_-^\@[;:],./');

echo '<input tabindex="' . $tnum++ . '" accesskey="' . $ary[$anum++] . '" type="submit" value="更新">';

<input tabindex="<?php echo $tnum++ ?>" accesskey="<?php echo $ary[$anum++] ?>" type="submit" value="更新">

tabindex属性に上から順に数値を、
accesskey属性に0~9の数値、それを超えるとA~Zと記号を割り当てる

それぞれ指定する内容は
input要素とtextarea要素にはtabindex属性とaccesskey属性
select要素にはtabindex属性
置換対象に関数を使用したい場合はe修飾子を付けて第2引数をphpコードとして評価させる

$foo = 'fooaaabarbbbfoo';
preg_replace('/foo(.*?)bar(.*?)foo/e', '\'foo\'.substr("$1$2",0,5).\'foo\'', $foo);


出力結果
fooaaabbfoo

第2引数の中身はシングルクォーテーションの中に入れた場合シングルクォーテーションをエスケープすること

'url=' . $1 . '&id=' . rawurlencode("$2")

のように関数に入れない変数がある場合も、

\'url=\' . "$1" . \'&id=\' . rawurlencode("$2")

と変数をダブルクォーテーションで括ること
javascriptを外部ファイルにしたいけど、引数も渡したいという場合

<?php
$data = $_GET['data'];
header('Content-type: application/x-javascript');
?>


と、phpファイルにしてクエリを受け取りつつheader関数でjavascriptファイルであることを宣言することができる