php

foreachで連想配列に代入した後はcurrentが変わるのでwhileでeachするとハマる

php

へぇ、phpってこういう動きするんだーと思ったので。 普段while each使わないのでハマったことなかったのだけど、何かbugがあるなぁと思うコードを見てみたらforeachの後にwhile使ってるのが原因ってことがわかった。 bugをわかりにくくしていたのは以下のこ…

Rubyはハッシュに数値と文字列のkeyが持てるんですね

Rubyで書かれたコードにbugがあって調べることになり、初めて知りました。 Ruby % ruby -e 'h = {1 => true, "1" => false}; p h' {1=>true, "1"=>false} Perl % perl -MData::Dumper -e '$h = {1 => true, "1" => false}; warn Dumper $h' $VAR1 = { '1' =>…

CakePHPで動的にBehaviorを切り替えてModelの振舞いを変えるときはunload、loadを使う

CakePHP DocumentのBehaviorsの項にも書いてありますが、「ある時はこういう処理をして欲しいけど、違う時は別の処理をして欲しい」みたいな話。 やりたいこと あるModelがあって、今はAという処理だけあれば良いのだけど、今後BやCという処理も増やしたい …

testActionを使う時はautoRenderがfalseだとダメ

CakePHPでBake使ってControllerのテストを作るとき、一緒にテストしたいControllerクラスのMockみたいのができるのだけど、 そのクラスはredirectされないようにoverrideされていたり、renderされないように public $autoRender = false; となってたりする。…

CakePHPでMasterとSlaveにリクエストを振り分けるベストプラクティス的なものが知りたい

DBの負荷分散用に「更新はMaster」、「参照は複数のSlaveたちへ」的なことをCakePHP2.0でやろうと思ったのですが、 ハマってしまったのでメモを残します。 やりたいこと 更新はMasterへ、参照は複数のSlaveへ ただし、ざっくりでいい。参照のいくつかがSlave…

app/Config/core.phpのCacheの初期値はapp/Config/bootstrap.phpで上書きできないのですね

CakePHPを使っている時、app/Config/core.phpはcake本体のupdateのタイミングで変更される可能性があるためapp/Config/bootstrap.phpに

PHPで連想配列にkeyが存在したら値を追加しない、存在しなければ値を追加する、の書き方

php

たまたまCakePHPのFilelLogエンジンのソースを見ていたら $options += array('path' => LOGS); という書き方があって「あれ、この書き方知らない」となったので確認した。 結果はタイトル通り、「keyがあれば何もしない、keyがないなら値を追加する」だった…

CakePHPのcore部分をgit submodule化してgithubで管理する

2011-11-09追記 app/webroot/test.phpのCAKE_CORE_INCLUDE_PATHを修正することを書いてなかったので追加 bakeのときにはappディレクトリを指定する必要があることを追加 ここから元記事 CakePHP as a Git submodule | Bravo Kernelの通りやればできる。 重要…

CakeEmailを使ってMac OS XからGmail経由でメールをする

CakePHP2.0でGmailを利用してメールを送ろうとして 「SwiftMailerってのが使えるのかぁ。それならそれ使おう」 とか思ったのですが、どうやらCakeEmailというのがあるようなのでそれを使うことにした # たぶんCakePHP1.3まではなかったんだよね?よく調べて…

TestでFixturesのデータをexpectedに再利用したい

Modelのテストをする時に「Modelから取得できたデータ」と 「Fixturesで定義したデータ」が一致してるかを確認したくてfixtureを呼び出せないか調べた。 $this->fixtureManager ってやるとCakeFixtureManagerオブジェクトが取れるのでそれでゴリゴリやるのか…

phpのmakeで/usr/bin/ld: cannot find -lmysqlclientというエラー

久しぶりにphpをmakeしたら下のようなエラーが出て進まず。 /usr/bin/ld: skipping incompatible /usr/lib/mysql/libmysqlclient.so when searching for -lmysqlclient /usr/bin/ld: skipping incompatible /usr/lib/mysql/libmysqlclient.a when searching …

staticとconstはクラスのもの、プロパティはオブジェクトのもの。

php

追記 コメントでPHP5.3からはstaticキーワードが使えるのを教えてもらった。 勉強しないとダメだなぁ。。 子クラスのconst,staticの値を使うのは、PHP5.3からできます。var_dump(static::$S);http://www.php.net/manual/ja/language.oop5.late-static-bindin…

floatにしたときには.0を付けて比較する

php

追記 ってのはダメだよとコメントで教わりました。 元記事 あんまりやったことないから知らなかった。小数点付けないとfalseになるんすね。

$obj->varと$varの初期化の違い。PHP Noticeの出る出ない

php

僕はよくPHPのスコープを忘れてしまい右往左往するのですが、 今回は宣言したのにPHP Notice出てアレレとなってしまったのでメモ。 まず、いつも変数を使う時に $obj = null; みたいな感じで初期化してから使ってました。 で、「Perlの時みたく変数だけ書い…

findで複数のORを使う場合はarrayで囲む

CakePHPでfind使うとき SELECT * FROM t WHERE "id" = '1' AND (("status" = '1') OR ("flg" = '1')); というSQLが書きたければ find('find', array( 'conditions' => array( 'id' => 1, 'OR' => array( 'status' => 1, 'flg' => 1, ), ), )); みたいな感じ…

bindModelで別のモデルを関連づけてsaveAllする際、isUniqueのバリデーションルールのせいでsave()できない場合は第2引数にfalseをセットする

タイトルの通りですがsaveAll()で保存に失敗してハマったのでメモ。 流れは以下のような感じ ModelA hasMany ModelB ModelBはModelAのキーであるmodel_a_idをもつ(外部キーがmodel_a_id) ModelA->saveAll()を使ってModelAとModelBの両方を同時に保存したい…

hasManyなどで関連づけたテーブルにシーケンスがない場合のsaveAll

以下のようにCakePHPのCookbookに関連したテーブルへの保存方法が載ってますが、 PostgreSQLのシーケンス部分でハマってしまったのでメモ。 saveAll(array $data = null, array $options = array())次のいずれかの目的で使用します。 (a) 単一のモデルに、個…

findするときのconditionsなどにモデル名を書く習慣を付ける

CakePHPのCookbookを読んでると、いろんなところで「SQL内にモデル名を含めましょう」みたいなことが書いてあります。 conditions: 関連モデルのレコードを限定するための SQL。SQL 内でモデル名を使用することを習慣にしておくようにしておきましょう:“appr…

CakePHPで「create時は必須入力」「update時は任意入力」のvalidationをする

CakePHPでDBにデータを保存するときにはmodelの$validate変数を使ってバリデーションをすると思うのですが、 ちょっとやり方がわからなくてハマった所があったのでメモ。 前提 簡単に話を進めるためにtitleとstatusというカラムをもつテーブルがあったと仮定…

SimpleTestでprotected methodのテスト

protectedなメソッドのテストがしたい場合はどうしたらいいのかなと思い、 CakePHPを覗いてみたところ、cake/tests/cases/libs/http_socket.test.phpでテストしてたのでメモ。 http_socketのテストのsetUp()でMockHttpSocketクラスやMockHttpSocketRequests…

CakePHPのfindで複数のカラムのDISTINCT

CakePHPのfindメソッドで複数のカラムのDISTINCTを実行したいなと思いcookbookを確認したのですが、 サンプルには1カラムのものしかない。 DISTINCT クエリを用いた簡単な例は次のようになります。MIN() や MAX()、その他の演算子も、同じように扱えます。 a…

CakePHPのバリデーションルールにマジックナンバーを使わないようにするためどこに定数をまとめるか

「最小文字数が8」っていうバリデーションルールを書く例で Cookbookだと下のような感じでマジックナンバーにしてある。 'rule' => array('minLength', '8'), 多分簡単に説明するためにマジックナンバーにしてあるんだろうけど、 実際に開発するときは作用み…

find('prevnext')とか作ってたけど、find('neighbors')があった

またCakePHP。 リストのひとつを選んだときに、その前後の要素をページングとして表示したかったので、 $total = parent::find('count', $options); $prev = ($id === 1) ? null : parent::find('first', array_merge( array( 'conditions' => array('id' =>…

CakePHP1.3で$this->pageTitleは使えない

久々にphpの勉強を兼ねて、昨日から何となくCakePHPを触りだしました。ちょっと楽しい。 で、本題。 app/views/layouts/default.ctp(cake/libs/view/layouts/default.ctpからコピー)に$title_for_layout;というのがあり、それを設定するためにcontrollerで…

PHPカンファレンス2008プログラム概要見に行ってきた

でも広島の友達が急遽くることになったので結構後半から参加。 自分ではあんまりPHPを使ってないけど楽しめました。 PHPもっとちゃんとやらんといかんね。 あと、id:TAKESAKOさんとid:amachangさんと初めて話したけど、すげーいい人だった。 ユーザ会活動報…

symfonyのプラグインsfAmazonECSPluginの設定がうまくいかず

amazonアフィリエイトを実装してみる - ( ゜Д゜)..タイトル考え中を見ながらsfAmazonECSPluginの設定をしてたんだけど、 $product = new sfAmazonECS("ここに英語のページで取得したSubscriptionIdを書く","ここに日本語のページで取得したAssociateTagを書…

magic_quotes_gpcをoffにした

1 - VALUE DOMAIN:バリュードメイン php.iniでmagic_quotes_gpcをonにしておくと、アプリケーションが遅くなります。リクエストパラメータですべてのクォートをエスケープするようにPHPに伝えるからですが、symfonyは体系的にそれらを後でエスケープし、結果…

sf_sandboxで500 Internal Server Error

[ThinkIT] 第2回:Symfonyを例にしたフレームワークを使ったPHP開発 (1/3)を見ながらsymfony使ってみようと、簡単なsf_sandboxだけやってみることに。で、はまった。 何が駄目なのかわからず色々検索してもなかなか出てこなかったけど、 さくらにsymfonyイン…

さくらレンタルサーバ覚書

.cshrcを変更 cdで常にll alias cwdcmd 'll' プロンプトに時間とディレクトリ表示 set prompt = "[%T@%c]%" 補完候補ファイルを表示 set autolist 補完候補に色付ける set color コマンドラインで日本語入力をONにする setenv LANG ja_JP.eucJP viをjvimへ。…