2011年3月18日金曜日

よくわかるPHPの教科書その1

■目標
本の内容をひと通りさらうその1
PHP+DBで本格的なWebシステムを作る

■前準備
本に書いてあるDB作成
>ターミナル上で日本語入力ができない

■ターミナルで日本語が文字化けしないようにする
>.inputrcファイルを作成、以下を記述する
set convert-meta off
set meta-flag on
set output-meta on

>my.cnfファイルに以下を追加
[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

>ところが表示がなおらない
※文字化けしたまま入力しても、きちんと反映はされる
ただターミナル上で?のまま表示される

■本格的にmysql文字コードチェック
・mysqlの文字コードを調べる
show variables like 'char%';

・chracter_set_databaseがなぜかlatin1
my.cnfの設定変更の一部が足りなかったらしい

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

・変更すると
mysql> show variables like 'char%';
+--------------------------+------------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /Applications/XAMPP/xamppfiles/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------+

全部utf8になった

・でもまだ文字化けする
mysql> ?^???^?^??^?^?;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'だめか' at line 1

・ホームディレクトリの.bash_profile書き換え
expert LANG-jp_JP.UTF-8
を追加
echo $LANGで状態を確認
>でもなおらない

・なんと!
ターミナルの文字の文字エンコーディングを”日本語(EUC)”にするとなおった!
※いままで全体に合わせてutf-8だった
※mysqlをexitして、通常のbashにもどると、今度はそっちで文字化けする
>とりあえず、.bash_profileのexpert LANGを削除したら両方いけるようになった
ただし、echoすると、jp_JP.eucJPにセットされている
今度はDB内容が文字化けして表示される

というわけで、mysqlターミナル文字化け処理をあきらめutf-8に戻す


■mysql文について
・datetimeとtimestampの差
timestampを使うとDBを更新したときに自動的にdateが更新される

・集計コマンド
合計
select sum(price) from my_items;

最大値
select max(price) from my_items;

最小値
select min(price) from my_items;

データ数
select count(id) from my_items;

平均値
select avg(price) from my_itmes;

・group by コマンド
item_idごとの集計
select item_id, sum(count) from carts group by item_id;

リレーションを使って、item名をidと対応させて同時表示
SELECT i.item_name, sum( c.count )
FROM my_items i, carts c
WHERE i.id = c.item_id
GROUP BY c.item_id

0 件のコメント:

コメントを投稿