開発メモ,主に補足by子連れ親父プログラマー

2011-09-05

CakePHP1.3で作る会員管理システム(3) データベース接続

データベース接続

データベースに接続するための設定を行います。
設定ファイルは /app/config/database.php.default を書き換えて、/app/config/database.php にリネームするだけなので、エディターで開いて編集すればいいのですが、ここでは console の cake コマンドを使ってやってみます。
大元の /cake/console の中にあるのがcakeコマンドです。
自分のhomeディレクトリから、

cd Sites/cake/cake/console
./cake
と打てば
Welcome to CakePHP v1.3.11 Console
---------------------------------------------------------------
Current Paths:
 -app: app
 -working: /Users/myname/Sites/cake/app
 -root: /Users/myname/Sites/cake
 -core: /Users/myname/Sites/cake

Changing Paths:
your working path should be the same as your application path
to change your path use the '-app' param.
Example: -app relative/path/to/myapp or -app /absolute/path/to/myapp

Available Shells:
 acl [CORE]                             i18n [CORE]                            
 api [CORE]                             schema [CORE]                          
 bake [CORE]                            testsuite [CORE]                       
 console [CORE]                         

To run a command, type 'cake shell_name [args]'
To get help on a specific command, type 'cake shell_name help'
と表示され、とりあえず動くのが分かります。

で、一応このcakeコマンドにパスを通しておきます。

vim .profile
としてvim エディターを起動し、
export PATH=/Users/myname/Sites/cake/cake/console:$PATH
の一行を追加します。
ターミナルに戻って、
. .profile
して、
printenv PATH
で、パスを確認します。
/Users/myname/Sites/cake/cake/console:
と入っていればOK.

基本、自分の app フォルダーの中で作業するのがいいです。

cd Sites/cake/app
cake bake
別の場所にいる場合は、 app の場所を指定します。今自分がhomeにいるんだったら、
cake -app Sites/cake/app bake
とすると、
Welcome to CakePHP v1.3.11 Console
---------------------------------------------------------------
App : app
Path: /Users/myname/Sites/cake/app
---------------------------------------------------------------
Your database configuration was not found. Take a moment to create one.
---------------------------------------------------------------
Database Configuration:
---------------------------------------------------------------
Name:  
[default] > 
というように対話式の設定画面になりますので、必要な項目を入力します。
---------------------------------------------------------------
The following database configuration will be created:
---------------------------------------------------------------
Name:         default
Driver:       mysql
Persistent:   false
Host:         localhost
User:         cake_user
Pass:         ********
Database:     cake_db
Encoding:     utf8
---------------------------------------------------------------
という感じに、データベースの設定を入れて[y]すると、自動で /app/config/database.php が作られます。

ブラウザで http://localhost/~myname/cake/ を開いてみると

Your database configuration file is present.
Cake is able to connect to the database.
と出てるはずです。


CakePHP1.3で作る会員管理システム(2) CakePHPの設置

CakePHPの設置

本家サイトからダウンロードした CakePHP を設置します。
「Download」の画像をクリックするとgithub のページに飛ぶので、そちらから、 1.3.11.zip — 1.3.11 をクリックします。

ダウンロードしたファイルを解凍すると、 cakephp-cakephp-3b830a4 という名前のフォルダーが出来るので、これを cake とリネームしてローカル環境のドキュメントルート以下にコピーします。
MacOSXの場合は、いわゆる「サイト」フォルダー

/Users/myname/Sites
以下ということになります。

Windows の場合は、apache をどこにインストールしたかにもよるんでしょうが、その htdocs 以下、ということです。例えば、

c:¥Program Files¥apache・・・・¥htdocs
になるかと思います。
本番リリースと同じ構造にしておく、という手もありますが、開発用のローカル環境ではなにもいじらない方がやりやすいんじゃないですかね。
なにしろ、まっさらの状態でも本体をダウンロードしてきてそのまま始められる訳ですから。

で、 http://localhost/~myname/cake/ をブラウザから開きます。

Warning (512): /Users/myname/Sites/cake/app/tmp/cache/ is not writable [CORE/cake/libs/cache/file.php, line 267]
Warning (512): /Users/myname/Sites/cake/app/tmp/cache/persistent/ is not writable [CORE/cake/libs/cache/file.php, line 267]
Warning (512): /Users/myname/Sites/cake/app/tmp/cache/models/ is not writable [CORE/cake/libs/cache/file.php, line 267]
Notice (1024): Please change the value of 'Security.salt' in app/config/core.php to a salt value specific to your application [CORE/cake/libs/debugger.php, line 694]
Notice (1024): Please change the value of 'Security.cipherSeed' in app/config/core.php to a numeric (digits only) seed value specific to your application [CORE/cake/libs/debugger.php, line 698]
という3つの Warning と2つの Notice が出ますが、とりあえず動いてるってことでOKでしょう。

一つ一つ対応していきます。

/app/tmp/cache を書き込み可能にします。
ついでに /app/tmp も書き込み可能にするので、/appに移動して、

chmod -R 0777 tmp
とします。 ブラウザをリロードします。

引き続き、/app/config/core.php を開いて、

 Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
 Configure::write('Security.cipherSeed', '76859309657453542496749683645');
の2つの部分の値を書き換えます。

これでOKのはずですが、もし、php が 5.3 で、しかも php.ini に default timezone の設定をしていなかったりすると、

Warning (2): strtotime() [function.strtotime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead [CORE/cake/libs/cache.php, line 597]
というような激しいエラーが出ますので、その場合は、 /app/config/core.php の、
 //date_default_timezone_set('UTC');
となっているところを、
 date_default_timezone_set('Asia/Tokyo');
としておきます。
できれば php.ini の方を設定することをおすすめします。

最後、ついでなので、以下の一行のコメントアウトを外しておきます。

 //Configure::write('Routing.prefixes', array('admin'));


CakePHP1.3で作る会員管理システム(1) データベースの作成

データベースの作成

いろんなやり方があるとは思いますが、まずはデータベースを作っておくのがいいと思います。
今回はMySQLで作りました。

CREATE DATABASE cake_db CHARACTER SET utf8;
GRANT all ON cake_db.* TO cake_user@localhost IDENTIFIED BY 'password';

users は管理側の管理者アカウントです。
管理側はAuthコンポーネントを使って認証するので、テーブル名を users にしておきます。
他の名前でも可能ですが、users が Auth コンポーネントのデフォルトなのでそうしておいた方が面倒がなくてよいです。

CREATE TABLE users (
 id INT(11) AUTO_INCREMENT,
 username VARCHAR(100) NOT NULL,
 password VARCHAR(100) NOT NULL,
 name VARCHAR(100),
 email VARCHAR(100),
 PRIMARY KEY (id)
);

membersは会員の情報を入れるテーブルです。
本当はここにstatusフィールドを入れて、仮登録・本登録の処理を入れたかったのですが、今回は見送りました。

CREATE TABLE members (
 id int(11) AUTO_INCREMENT,
 email VARCHAR(100) NOT NULL,
 password VARCHAR(100) NOT NULL,
 type_id INT(11) NOT NULL,
 birthday DATE,
 img1 VARCHAR(255),
 img2 VARCHAR(255),
 created DATETIME,
 modified DATETIME,
 PRIMARY KEY (id),
 KEY type_id (type_id)
);

typesは会員種別のマスターです。
一般会員、とか特別会員、とかのデータを入れます。

CREATE TABLE types (
 id int(11) AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL,
 PRIMARY KEY (id)
);

favoritesは会員の「好きな物」の選択値を入れます。
「好きな物」でも「趣味」でも何でもいいんですが、要は複数選択の場合の処理を入れたいのです。

CREATE TABLE favorites (
 id int(11) AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL,
 PRIMARY KEY (id)
);

members_favorites は会員情報と好きな物を関連づけるためのテーブルです。
多対多の関係になるのでいわゆる HABTM の連結になります。

CREATE TABLE members_favorites (
 id int(11) AUTO_INCREMENT,
 member_id INT(11) NOT NULL,
 favorite_id INT(11) NOT NULL,
 PRIMARY KEY (id),
 KEY member_id (member_id),
 KEY favorite_id (favorite_id)
);

2011-09-03

OGタグ用のサムネイル

テスト
インゲン

OSX で MacPorts を使って、CoffeeScript を試してみる

WEB+DB PRESS Vol.64 の記事で面白そうだったので早速試してみた。
記事では CoffeeScript のコンパイラをインストールするのに、まず Node.js と npm が必要とあり、
その Node.js のインストールには nvm を使ってみる、とあるが、面倒なので port でやってみる。
$ port search node*
とすると、以下の4つが見つかるので、
nodejs @0.4.11 (devel, net)
    Evented I/O for V8 JavaScript

nodejs-devel @0.5.4 (devel, net)
    Evented I/O for V8 JavaScript

nodejuice @1.5.0 (www)
    A web development tool to autorefesh the browser on changes.

npm @1.0.26 (devel)
    node package manager

Found 4 ports.
$ sudo port install nodejs
$ sudo port install npm
でよさそうだ。
が、
$ port search coffee*
とすると、
coffee-script @1.1.2 (lang)
    a language that compiles into JavaScript
こう出るので、もしかすると
$ sudo port install coffee-script
だけでもよかったのかもしれない。いずれにしろ、これで
$ coffee -v
CoffeeScript version 1.1.2
というように入ったので、記事の通りに
hello = ->
  console.log "Hello, World!"

hello()
を hello.coffee として保存し、

コンパイル。
$ coffee -c hello.coffee 
Node.js から実行。
$ node hello.js
Hello, World!
CoffeeScript から直接実行。
$ coffee hello.coffee 
Hello, World!
生成された js ファイルは、
(function() {
  var hello;
  hello = function() {
    return console.log("Hello, World!");
  };
  hello();
}).call(this);
となっている。
うまくいったようだ。
WEB+DB PRESS Vol.64

2011-08-05

外部のサイトに置いたphpからのjsonデータをjqueryで読み込む

簡単にできると思って実装してしまって、実際に外部のサーバーに設置してから、ありゃ動かないわ、
あ〜そうだった、Javascript って外部のサーバーのファイル読めないんだっけ、と気づいていつもあきらめていたんだが。
これを ajax の crossdomain と言うらしい。
検索すると jquery のプラグインとかで沢山ヒットするが、jquery のドキュメントを見ると1.5以降 jquery 単体でも実現できるようになっている。
ということで試してみた。
まず javascript 側は、
$.ajax({
    url: "http://xxxxxxxxxxxxxx/get_json.php",
    data: "name=123",
    dataType: 'JSONP',
    async: false,
    crossDomain: true,
    success: function(data){
        console.log(data);
    }
こんな感じ。dataType を JSONP にするのがミソだ。データは必ず get で送られるので
type: "POST"
とか書いても意味はない。
で、php 側は
echo $_GET['callback'].'({"error":"no data"})';
こんな感じ。
普通の json 形式データを()で囲んで、その前に
$_GET['callback']
をくっつける。

2011-08-02

OSX、terminal で postgres を操作していて、なぜか SELECT * FROM した時だけ文字化けする時の話

そんな馬鹿な、というような話だが。
postgres なので EUC_JP の文字コードのDBがまだ残っていたりする。
ということで今、terminal の環境設定の詳細の文字エンコーディングが
日本語(EUC)
になっていたとする。この状態で、psql に入り、DB操作を開始、「やべえ、このDBは UTF-8 だった」
と気づいて、terminal の環境設定の詳細の文字エンコーディングを
Unicode(UTF-8)
に変更したとする。
そうすると、
SELECT name FROM items;
というようにひとつのカラムをセレクトする場合は文字化けしないが、
SELECT * FROM items;
というように全部をセレクトすると文字化けする。
もちろん、一旦 terminal を終了してちゃんと
Unicode(UTF-8)
になってるのを確認してから psql に入れば文字化けしない。
まったくもって馬鹿馬鹿しい現象だが、やってる本人は一体何故なのかさっぱり分からない。
そして一日を棒にふる訳である。

2011-08-01

JSON形式のつづき。DBからselectしたデータが連想配列になってるのでそのまま処理したい編。

なにはともあれ、DBからselectしたデータがある訳です。
で、selectしたデータのid列の値がキーになっているとなにかと便利な訳ですよ。
後から参照する時にidだけ分かれば一発ですから。
ということでデータが今phpでこんなになってるとします。
Array
(
    [4] => Array
        (
            [id] => 4
            [year] => 2012
            [created] => 2011-07-26 19:37:37.985709
        )

    [7] => Array
        (
            [id] => 7
            [year] => 2011
            [created] => 2011-07-27 16:43:11.697075
        )
)
こいつをJSON形式で出力したいってことです。
最終的にこんな形になればいいので、
{
    "4": {
        "id": "4",
        "year": "2012",
        "created": "2011-07-26 19:37:37.985709"
    },
    "7": {
        "id": "7",
        "year": "2011",
        "created": "2011-07-27 16:43:11.697075"
    }
}
昨日のファンクションを以下のように修正。
$json = "{".toJson($data)."}";

function toJson($data) {   
    $json = array();
    foreach ($data as $string => $value) {
        $key = "\"$string\":";

        if (is_array($value)) {
            $json[] = sprintf("%s {%s}", $key, toJson($value));
        } else {
            $json[] = sprintf("%s \"%s\"", $key, addslashes($value));
        }
    }
    return implode(", ", $json);
}
こうすると、例えば返って来た json を javascript で例えば data とかいうオブジェクトに入れたとしたら、
data[4].year
とかで処理できる訳です。
    var tbl='';
    for (key in data) {
        tbl += '<tr><td>'+data[key].year+'</td></tr>";
    }
みたいにね。

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー