2013年12月4日水曜日

iCLUSTAサーバーでcakephpを使ってMySQLに接続

iCLUSTAサーバーでcakephpを使ってMySQLに接続

iCLUSTAは安定しているし、GMOクラウドの株主優待使うととてもコストパフォーマンスがいいので使っています。
ただ、あまりマニュアルがしっかりしていないので、サーバーの開設やcakephpを使うときのMySQLの設定がわからない部分が多かったのでここに記します。

はじめにまとめ

MySQLを使うには?

アカウントマネージャーでデータベースを申し込む

データベースの管理は?

プランマネージャーからDBManagerを使う or phpMyAdminをインストールする

cakephp側の設定は?

datebase.phpを変更する
  • host ホスト名
  • port ポート番号            *新規で追加
  • login データベース名
  • password パスワード
  • database データベース名

1、MySQLを使用可能にする

  • そのままでは使えません
  • GMOクラウドのアカウントマネージャーに行く
  • 右上にあるログイン画面からログインする
  • 各種手続き=>サービスに関する手続き=>オプション申込み=>契約してるプランを選択
  • 追加項目の「無料データベース(MySQL)」を選択=>次へ
  • この後、案内にしたがって進むと申し込みができる。

注意点

  • 一度に一つのデータベースしか申し込めないので、複数個作る時には上の操作を何回か行う必要がある
  • 申し込みから開設まで1日くらい時間がかかる

2、データベースを管理する

  • データベースができたら今度はプランマネージャーにログイン
  • ユーティリティ=>データベース設定=>パスワードなどを設定
  • ユーティリティ=>DBManager(MySQL)でデータベースの内容を書き換え可能

注意点

  • SQLを書いて操作できるが、使い勝手が悪い

推奨する方法-phpMyAdminのインストール

  • phpMyAdminの公式サイトから最新版をダウンロードする
  • 解凍してFileZillaなどを使ってサーバーの直下にディレクトリを配置
  • ユーザー名として1で設置したデータベースのデータベース名を入力
  • パスワードとしてデータベース設定で設定したパスワードを入力
  • ログイン
これでphpMyAdminが使えるようになります。自分は、ローカルではmampを使っているのでこれが一番使いやすいです。

こちら少し詳しく書いたものを投稿したので参照してください
http://lost-waldo.blogspot.jp/2014/03/iclustaphpmyadmin.html

3、cakephpの設定

  • database.phpを変更
  • cakephpのディレクトリごとサーバーにアップロード
基本的にはcakephpのディレクトリごとサーバーにアップロードすればOKです。
ただ、ここでだdatabase.phpの設定でつまずいたので(なんてことないのですが)記録します。

datebase.php

データベースとの接続の設定をするファイルですがデフォルトで以下の記述があります。

class DATABASE_CONFIG {

 public $default = array(
  'datasource' => 'Database/Mysql',
  'persistent' => false,    
  'host' => 'localhost',
  'login' => 'user',
  'password' => 'password',
  'database' => 'database_name',
  'prefix' => '',
  //'encoding' => 'utf8',
 );
}


このhost、login、password、database部分を書き換えて使っていました。

class DATABASE_CONFIG {

 public $default = array(
  'datasource' => 'Database/Mysql',
  'persistent' => false,    
  'host' => 'ホスト名:ポート番号',
  'login' => 'ログイン名(iCLUSTAではデータベース名)',
  'password' => 'パスワード',
  'database' => 'データベース',
  'prefix' => '',
  'encoding' => 'utf8',
 );
}


しかしこれでは以下のエラーが...

Cake is NOT able to connect to the database.
Database connection "Mysql" is missing, or could not be created.
SQLSTATE[HY000] [2005] Unknown MySQL server host 'データベースホスト:ポート番号' (1)


のエラーが…この問題は1ヶ月くらいわからず放置してました。ふと、cakephpのリファレンスを見に行った時に、"port"という設定項目があるとこに気が付きました。
そこで、ホストで指定していたポート番号を"port"で設定しました

class DATABASE_CONFIG {

 public $default = array(
  'datasource' => 'Database/Mysql',
  'persistent' => false,    
  'host' => 'ホスト名',
  'port' => 'ポート番号',
  'login' => 'ログイン名(iCLUSTAではデータベース名)',
  'password' => 'パスワード',
  'database' => 'データベース',
  'prefix' => '',
  'encoding' => 'utf8',
 );
}

これでディレクトリ直下にアクセスすると

Cake is able to connect to the database.

ちゃんと表示されました。

設定が少しわかりづらいけどリーズナブルですので利用してみたい方は➔

2013年12月3日火曜日

[SyntaxHighlighter] ブログ内のコードをシンタックスハイライターの強調オプションで目立たせる

SyntaxHighlighter(シンタックスハイライター)の強調オプションで変更箇所を目立たせる


Blogにコードを見やすく表示させるツールとしてこのブログでも使用しているSyntacticHighester(シンタックスハイライター)というツールを以前にブログで紹介しました。

【関連する記事】

色分けしたコードで投稿する方法

ある行を強調表示させるオプションを紹介します。

分類のindex管理(4)という記事で変更した箇所をわかりやすく表示させるために使っています。どんな感じで表示されるかは、そのページで確認してみてください。
【参考にしたサイト】
ソースコードを行番号付きで、きれいに表示する「SYNTAXHIGHLIGHTER」の導入と使い方

オプションの指定は簡単です。

<pre class="brush: *** highlight: 1">
1行目をハイライト
</pre>

<pre class="brush: *** highlight: [1, 3]">
1行目と3行目をハイライト
</pre>

こんなかんじでclass属性の中に"highlight:行数"を指定すれば強調されます。
簡単なのでぜひ活用していきたいです。

[MySQL]、[php] 分類のindex管理(4)

引き続き分類を文字列からindex管理に変更する過程です。
【関連する記事】
[MySQL]、[php] 分類のindex管理(1)
[MySQL]、[php] 分類のindex管理(2)
[MySQL]、[php] 分類のindex管理(3)

前回まではデータベースに登録されてある分類項目を選択項目としてhtmlで表示するところまで紹介しました。

今回は全ユーザー共通の分類項目とユーザー独自の分類項目を分けて管理する部分を紹介します。


実は、[MySQL]、[php] 分類のindex管理(2)で作ったテーブルにuser_idを入れておきました。このuser_idを使います。
まずはマスターのIDとしてuserテーブルのID=0にmasterとでも登録しておきます。
これが全ユーザーが使う分類項目となります。同時にuser_id=0が、この後ユーザーとして登録されないように埋めておくことにもなります。

ユーザー独自分類登録

では、ユーザーが分類を登録するページを作ります。前提としてユーザーIDが$_SESSION['user_id']によって受け取れる状態としてます。

[specification_choice.php]

<h2>ユーザー独自の分類を登録</h2>
<form action=“insert_action.php” method="post" >  
 <label>名称</label>
 <input type="text" name="specification_name" />
 <input type="submit" value="追加"/>
</form>

[insert_action.php]

$sql = sprintf('INSERT INTO pay_specifications SET name="%s", user_id=%d, created=NOW()',
  mysql_real_escape_string($_POST["specification_name"]),
  mysql_real_escape_string($_SESSION['user_id'])
  );
mysql_query($sql, $link) or die(mysql_error());

ユーザー独自分類取り出し

それでは、SQL文を書き換えます。phpのコードは前回のページを参照してください。

【やりたいこと】

pay_specificationsを読み出す時にuser_id=0(マスターのID)と使用するユーザー自身のidだけを読み込む

【コード before】

$sql = sprintf('SELECT * FROM pay_specifications
 ORDER BY ID ASC',
 mysql_real_escape_string($_SESSION['user_id']

【コード after】

$sql = sprintf('SELECT * FROM pay_specifications
 WHERE user_id=0 OR user_id=%d
 ORDER BY ID ASC',
 mysql_real_escape_string($_SESSION['user_id']


2行目にWHERE句を追加しました。
これで、他のユーザーが独自に使用する分類項目は表示されないはずです。

ユーザー独自分類の非表示

最後に、ユーザー独自の分類項目を入力ではもう使わないが、一覧表示にはそのまま残したい。そんな時のためにユーザー独自の分類項目は削除ではなく使用フラグでかんりするようにしました。これもテーブルには用意してあって、usesカラムを使って

  1. 使用
  2. 不使用

と定義して、

[insert_action.php内書き込みのSQL]

$sql = sprintf('INSERT INTO pay_specifications SET name="%s", user_id=%d, created=NOW(), uses=1',
  mysql_real_escape_string($_POST["specification_name"]),
  mysql_real_escape_string($_SESSION['user_id'])
  );
mysql_query($sql, $link) or die(mysql_error());

[読み込みのSQL]

SELECT * FROM pay_specifications
 $sql = sprintf('WHERE user_id=0 OR user_id=%d AND uses=1
 ORDER BY ID ASC',
 mysql_real_escape_string($_SESSION['user_id']

[新たに、削除用のページを作り以下のSQLを発行]

UPDATE pay_specifications SET uses=2 
 $sql = sprintf('WHERE id=%d AND user_id=%d',
 mysql_real_escape_string($_POST['not_use_id']),
 mysql_real_escape_string($_SESSION['user_id'])

deleteするのではなくuses=2とすることで選択肢として表示されず、一覧表示にはそのまま表示される仕組みになっています。

2013年12月2日月曜日

[MySQL]、[php] 分類のindex管理(3)

引き続き分類を文字列からindex管理に変更する過程です。
【関連する記事】
[MySQL]、[php] 分類のindex管理(1)
[MySQL]、[php] 分類のindex管理(2)

前回は、DBの追加と変更について書きました。

今回は実際にデータを取得してhtmlに表示する部分です

データベースの素晴らしい機能であるリレーションを使います。

初めて使った時は感動でした。form部分にセレクトタグを使って表示します。

<?php 
$sql=sprintf('SELECT * FROM pay_specifications
 ORDER BY ID ASC',
 mysql_real_escape_string($_SESSION['user_id'])
);
$result = mysql_query($sql) or die(mysql_error());

$record=NULL;
while ($row = mysql_fetch_assoc($result)) {
 $record[] = $row;
}
?>

<select  name="pay_specification_id">

<?php 
for ($i=0,$count_record=count($record); $i<$count_record; $i++){
 print('<option value="'.h($record[$i]['id']).'">'.h($record[$i]['name']).'</option>');
}
?>

</select>


書いてあるコードの内容

2~11行目

支払分類テーブルからデータを取り出して$recordに格納する。
     SQL文生成ークエリ発行ーフェッチして各行を格納

18~19行目

selectタグで挟まれた部分のoptionに先ほどデータを格納した$recordを使って値を入れる。
postする値にpay_specifications.idを、htmlで表示される値にpay_specifications.nameを指定

<option value=1>食費</option>');
<option value=2>交際費</option>');
<option value=3>その他</option>');
のようにデータベースに登録されている値が出力されます。

次回

共通して表示される分類項目とユーザー独自で設定する分類項目をどうやって管理し、表示するようにしたかを紹介していきます。


2013年12月1日日曜日

[MySQL]、[php] 分類のindex管理(2)

前回の記事の続きです。
【関連する記事】
[MySQL]、[php] 分類のindex管理(1)

前回は改造前の状態とやることをザクっと把握したところまで書きました。

今回はデータベースの変更点

を主に紹介します。支払情報を例にとって見てみます

まずは支払情報のデータベースに分類IDという項目を追加します。


ALTER TABLE `pay` ADD `specification_id` INT NOT NULL AFTER `count`

次に分類テーブルを作ります。

カラムにはID、名称、ユーザーID、使用フラグ、作成日、更新日を作っておきます。

CREATE TABLE `pay_specifications` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `user_id` int(11) NOT NULL,
  `uses` int(11) NOT NULL,
  `created` datetime NOT NULL,
  `modefied` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8  AUTO_INCREMENT=1 ;

これで支払DBのspecification_idを使って支払分類DBの情報を持ってくる準備ができるようになりました。

次回

実際にデータを取得してhtml上に選択画面として表示させるところまで書きたいと思います。