PHP初心者向けのコードの最適化

php_code_image

こんにちは。GeNERACEのみきあらいです。
今回はPHP初心者の方に向けて、コードの最適化について書かせて頂きました。初めにコードを書くにあたって意識したことをまとめ、その後に実際にどのようなコードを書いたのか、サンプルコードをご紹介します。

Continue reading

俺のコントローラのprotectedがpublicなわけがない

こんにちは。
最近、東北TECH道場(仙台道場)でAndroidの講師してます、GeNERACE CTOけんたろです。
今回は東北TECH道場で行なっている活動やハックについて書こうと思いましたが、弊社の仕事でCakePHP(v2.3.1)を使っていて気になったことについてメモします。

Continue reading

CakePHPでMongoDBを使う基本

こんにちは、ピンキリエンジニアのひろゆきです。

最近は久しぶりにPHPを書いており、MongoDBも始めてみたので、CakePHPとMongoDBについて少し書いてみたいと思います。

今回はちょこっと触った程度の、CakePHPからMongoDBを使用するための内容になります。

※CakePHPは1.xの時に少し使った、MongoDBはほぼ初心者な状態です

今回使用した環境は

・AmazonEC2のRedhat
・PHP 5.3.3
・Apache 2.2.15
・MongoDB 2.2.3
・CakePHP 2.3

になってます。

これでCakePHPからMongoDBを操作してみたいと思います。

まずはMongoDBをインストールします。

リポジトリの追加

sudo vi /etc/yum.repos.d/10gen.repo

リポジトリ設定

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=0

インストール

sudo yum install mongo-10gen-server.x86_64 mongo-10gen.x86_64 --enablerepo=10gen

起動

sudo /etc/init.d/mongod start

これでMongoDBの準備はOKです。

次はこれをCakePHPから操作します。

CakePHPではデフォルトでいくつかのDBを使用でき、簡単にWEBサイトを構築出来ますが、
MongoDBについてはichikawayさんが提供しているPluginを使用することで可能になります。

https://github.com/ichikaway/cakephp-mongodb
※githubから

cloneするかもしくは別の方法で

app/Plugin/MongoDB

に配置します。

次にdatabase.phpを変更してMongoDBへの接続を定義します。

public $default = array(
	'datasource' => 'Mongodb.MongodbSource',
	'host' => 'localhost',
	'database' => 'your_database_name',
	'port' => '27017',
	'encoding' => 'utf8',
);

では、実際に操作をしてみます。

データを登録する

$data = array();
$data['value1'] = 1;
$data['value2'] = array(1,2,3);
$data['value3'] = array('a' => 1, 'b' => 2, 'c' =>3);
$data['value4'] = array('a' => array(1,2,3), 'b' => array(4,5,6));
$this->Sample->save($data);

発行されたクエリ

db.samples.insert( {"value1":1,"value2":[1,2,3],"value3":{"a":1,"b":2,"c":3},"value4":{"a":[1,2,3],"b":[4,5,6]},"modified":"MongoDate(0.39200000 1363326797)","created":"MongoDate(0.39200000 1363326797)","_id":ObjectId ("5142b74d2dc6b69371000002")} , true)

登録された内容

{ "_id" : ObjectId("5142b74d2dc6b69371000002"),
  "value1" : 1, 
  "value2" : [ 1, 2, 3 ], 
  "value3" : { "a" : 1, "b" : 2, "c" : 3 }, 
  "value4" : { "a" : [ 1, 2, 3 ], "b" : [ 4, 5, 6 ] }, 
  "modified" : ISODate("2013-03-15T05:17:21.393Z"), 
  "created" : ISODate("2013-03-15T05:17:21.393Z") }

データを取得する

$this->Sample->find('all');

発行されたクエリ

db.samples.find( [], [] ).sort( [] ).limit( 0 ).skip( 0 )

取得した内容

array(1) { 
 [0]=> array(1) {
  ["Sample"]=> array(7) { 
   ["value1"]=> int(1) 
   ["value2"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
   ["value3"]=> array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } 
   ["value4"]=> array(2) { ["a"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["b"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
   ["modified"]=> object(MongoDate)#38 (2) { ["sec"]=> int(1363325551) ["usec"]=> int(106000) } 
   ["created"]=> object(MongoDate)#39 (2) { ["sec"]=> int(1363325551) ["usec"]=> int(106000) } 
   ["id"]=> string(24) "5142b74d2dc6b69371000002"
  }
 }
}

データが作成されました。

今回はidを指定せず自動で生成しています。

データを更新する

$list = $this->Sample->find('all');
$data = $list[0]['Sample'];
$data['value1'] = 100;
$data['value5'] = 'Hello World';
$this->Sample->save($data);

発行されたクエリ

db.samples.update( {"_id":ObjectId ("5142b74d2dc6b69371000002")}, {"$set":{"value1":100,"value2":[1,2,3],"value3":{"a":1,"b":2,"c":3},"value4":{"a":[1,2,3],"b":[4,5,6]},"modified":"MongoDate(0.39200000 1363326797)","created":"MongoDate(0.39200000 1363326797)","value5":"Hello World"}}, {"multiple":false} )

変更後の内容

array(1) {
 [0]=> array(1) {
  ["Sample"]=> array(8) {
   ["created"]=> object(MongoDate)#38 (2) { ["sec"]=> int(1363326797) ["usec"]=> int(392000) } 
   ["modified"]=> object(MongoDate)#39 (2) { ["sec"]=> int(1363326797) ["usec"]=> int(392000) } 
   ["value1"]=> int(100) 
   ["value2"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
   ["value3"]=> array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } 
   ["value4"]=> array(2) { ["a"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["b"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
   ["value5"]=> string(11) "Hello World" 
   ["id"]=> string(24) "5142b74d2dc6b69371000002" } } }

CakePHPを使用しているので、同idがデータに存在する場合は更新にしてくれます。
新しく追加したカラム「value5」もちゃんと反映されています。

データを削除する

$list = $this->Sample->find('all');
$data = $list[0]['Sample'];
$this->Sample->delete($data['id']);

発行されたクエリ

db.samples.remove( {"_id":ObjectId ("5142b74d2dc6b69371000002")} )

指定されたidのデータが削除されました。

上記でCRUDについての操作が行えました。

Pluginのおかげで、これくらいであればサクッと簡単にできちゃいます。

まだまだ基本的な部分を触りながら確認している状況ですので、もう少し慣れたら詳しくメモも含めてログを残したいと思ってます。

MongoDBならではの操作方法についてとか書いておくと良いかなー、と。

以上、ありがとうございました!!