cakephp キャッシュ周りがおかしい場合はキャッシュしないようにすること

モデルで少しトリッキーなことをしたらキャッシュが悪さをしてしまい機能によって動いたり動かなくなったりしてしまった。そういう場合はもうキャッシュ自体を無効にしてしまうことも検討すること。以下で無効にできる。

<?php
Configure::write('Cache.disable', true);

css display:inline-blockの便利さが分かりました

inline-blockすごい便利だった。今日やっと意味が分かった。

例えばspanとかのinline要素はwidthとか設定しても適用されないけど、かと言ってdivとか使うと改行されちゃうし困った、ってときにinline-blockを使うとwidthが適用されかつ改行もされないことが分かった。要はinput要素のような扱いになるっぽい。今までfloat使ってた部分もこれで代用できるケースもありそう。

今後は忘れないこと。

cakephp1.2 componentの__constructについてメモ

コンポーネントで初期化処理したい場合は__constructを使えば問題無い。

[ステップアップ! CakePHP] Controller で Component を使う | バシャログ。
ただしここにもあるように通常はinitializeかstartupを使う。__constructとの違いはShellとかでcomponentを呼んだ時にinitializeやstartupは実行されなかったはず(多分。未確認)。なのでShellとかにも対応するのなら__constructを使うべき。

ただ__constructだとcontrollerから呼んだ時に以下のようにconroller自身を渡すことができないぽい。

function initialize(&$controller) {
    $this->c =& $controller;
}

なので初期化処理は__constructに書いてcontrollerを渡したい場合は、別途initializeも定義すればよいと思う。(自信無いので後でちゃんと調べること)

17/12/13追記
var $componentsで普通にコンポーネントを読んだ時と違って、App::importで直接パス指定で読んだ場合も、initializeやstartupが呼ばれないぽいので__construct使うこと。

資産形成におすすめのFX口座はこちら。
http://s2fx.com/ranking/856.html

php5.3.3 centos6.8 composerインストール手順

インストール

curl -sS https://getcomposer.org/installer | php

composer.pharが出来るので移動

mv composer.phar /usr/local/bin/composer

composer.jsonを作成する

cd /usr/local/bin
vi composer.json

内容

{
    "require": {
        "monolog/monolog": ">=1.0.0"
    }
}

jsonに書いたmonologをインストール(5~10分くらいかかる)

php composer install

vendor配下にインストールされる。後composer.lockが作成される。
さらにパッケージを追加してみる。composer.jsonにpayjpを追加。

{
    "require": {
        "monolog/monolog": ">=1.0.0",
        "payjp/payjp-php": "0.0.x"
    }
}

インストール

php composer install

エラーが出た

Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files

Composerを使ってみた - 戦場のプログラマー
こちらのサイトによるとどうやらupdateが必要らしい

php composer update payjp/payjp-php

これでインストールできた
composerのrequireコマンドでパッケージを後から追加する - Qiita
こちらのサイトによるとrequireでも良かったぽい。
phpでは以下のようにrequireすれば使えるようになる。

<?php
require 'vendor/autoload.php';

参考サイト
composerとは? - Qiita
composer 導入をまじめに考える - Qiita
Composer ドキュメント日本語訳
composerの使い方:Composer でphp のパッケージを楽にする - それマグで!

資産形成におすすめのFX口座はこちら。
http://s2fx.com/ranking/856.html

cakephp1.2 Shellからモデルとコンポーネントを呼ぶ方法

コントローラーであれば$usesと$componentsを使うけど、Shellの場合は$usesは使えるけど$componentsは使えない、というなんとも中途半端な感じだったのでメモ。以下のようにする。

<?php
App::import('Component', 'Sample');
                           
class TestShell extends Shell {
    var $uses  = array('Hoge');

    function initialize() {
        parent::initialize();
        $this->Sample = new SampleComponent($this); 
    }
}

資産形成におすすめのFX口座はこちら。
http://s2fx.com/ranking/856.html

mysql group_concatにorder byを指定する時の注意事項

group_concatにorder byを指定しても意図したソートにならないケースがある。
まず以下のように、group_concatに指定したcategory_idをそのカラム順でソートするケースの場合は問題ない。

group_concat(category_id order by category_id)

問題となるのは以下のようなgroup_concatの対象(category_name)とソートの基準となるカラム(category_id)が異なるケース。この場合、category_nameがcategory_id順に並ばない場合がある。

group_concat(category_name order by category_id)

これを防ぐには【group by-group_concatする前に、データをorder byでソートしておく】ことが必要。なので一つのSQLではできない(はず)ため、サブクエリ等を使う必要がある。

select group_concat(category_name order by category_id) from
(
select item_id,category_id,category_name
from item i
inner join item_category ic on i.id = ic.item_id
inner join category c on i.id = ic.category_id
order by category_id
) as tmp_tb
group by item_id

資産形成におすすめのFX口座はこちら。
http://s2fx.com/ranking/856.html

php csrf対策

参考サイト
PHPでクロスサイトリクエストフォージェリ(CSRF)対策するときのメモ - Qiita

php

<?php
//トークンをセッションにセット
function setToken(){
    $token = sha1(uniqid(mt_rand(), true));
    $_SESSION['token'] = $token;
}

//トークンをセッションから取得
function checkToken(){
    //セッションが空か生成したトークンと異なるトークンでPOSTされたときは不正アクセス
    if(empty($_SESSIOIN['token']) || ($_SESSION['token'] != $_POST['token'])){
        echo '不正なPOSTが行われました', PHP_EOL;
        exit;
    }
}
//GETでアクセスされたとき
if($_SERVER['REQUEST_METHOD'] != 'POST'){
    setToken();
}
//POSTでアクセスされたとき
else{
    checkToken();
}

html

<form method="post" action="">
...
<!--hiddenで生成したワンタイムトークンの文字列をPOST送信-->
<input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">
<input type="submit" value="登録">
...
</form>

post時にtokenをポストする必要がある