今回は、具体的なサンプルを使って、前回の冒頭で紹介したPHPでMySQLを利用する方法をまとめます。なお、MySQLのデータベースは事前に用意しているものと仮定しています。慣れていない方のために、そのあたりをきちんと書いてからとも思いましたが、結論を後回しにしてしまうと、興味が薄れてしまうかも知れないので、先に書いてしまいます。
前回のサンプルを簡略化して、CSSでスタイルを反映させてみました。PHPを選んだ理由は、CSSを適用するのに通常のhtmlと同様に扱うことができることと、WEBアプリケーションを作るのに、おそらく最も簡単で初心者でもすぐに使えるプログミング言語ではなかろうかと思っているからです。
Perlを使ったCGIも試してみましたが、PerlではCSSを適用させるだけでも、結構苦労しました。
動的なサイトを作る際に利用されるスクリプトには、PHPの他にも、PerlやPythonやJavascriptなどがあります。[2012.3.31 一部削除しました]
ちなみに、PHPの場合、出力された結果だけが表示されるので、ユーザ側からページのソースをみても、設定がきちんとされていれば、PHPのソースコードを見ることはできません。設定を間違えて、ソースコードだけが丸見えになってしまうことはあり得ますけど。
基本的にPHPのコードは、htmlファイルの中に、次のような形で挿入します。
<? php
PHPのコマンド;
?>
例えば、次の内容のtest.phpというファイルを作成し、前回作成した/home/user/wwwの中に保存して、http://(ローカルIPアドレス)/test.php にアクセスしてみてください。
<html><body><p>
Today:
<?php
echo date("Y/m/d");
?>
</p></body></html>
Today: 2012/03/30 (←日付が入ります) と表示されれば、PHPがきちんと動作しています。
なお、PHPの処理結果は、冒頭部分が<html>で始まっていたとしても、拡張子を.phpとしておかないと反映されませんので、注意が必要です。
ここでPHPの解説を長々とやってしまうと、なかなか本題に入れませんので、詳しくはPHPの入門用のサイトを参照していただくとして、早速、MySQLとの連携の話に移りましょう。
$ sudo nano /etc/mysql/my.cnf
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server=utf8
skip-character-set-client-handshake
設定を変更したらMySQLを再起動します。次のコマンドを実行してください。
$ sudo service mysql restart
「skip-character-set-client-handshake」はあまり筋のいい方法ではないようですが、他にPHPのMYSQL関数の文字化けに対する有効な対策は見つけられませんでした。また、「character-set-server=utf8」の部分について、次のように記載しているサイトもありますが、Ubuntu12.04で使われている mysql-server-5.5 では、サーバー側の設定であるmysqldには使えないようです。
✖ default-character-set=utf8
上記の変更を適用する前と後で、MySQLのフォント設定が実際どう変化しているのか確かめてみましょう。 $ mysql -u root -p でMySQLサーバーにログインします。パスワードを訊かれますが、ここで入力するのはLAMPサーバーを導入した際に設定したrootのパスワードです。
【適用前】
mysql> SHOW VARIABLES LIKE 'char%';
→ character_set_databaseとcharacter_set_serverの文字コードだけがlatin1になっています。
【適用後】
mysql> SHOW VARIABLES LIKE 'char%';
→ character_set_databaseとcharacter_set_serverも含め、すべての文字コードがutf8になります。
【test.csv】
MySQLに登録するcsvファイルのサンプル。
1,"東京都",12988797
2,"神奈川県",9005176
3,"大阪府",8840372
4,"愛知県",7414098
5,"埼玉県",7170362
6,"千葉県",6183743
7,"兵庫県",5599359
8,"北海道",5517449
9,"福岡県",5066856
10,"静岡県",3787982
11,"茨城県",2967404
12,"広島県",2866571
13,"京都府",2631441
14,"新潟県",2383650
15,"宮城県",2340029
16,"長野県",2160602
17,"岐阜県",2086590
18,"福島県",2042816
19,"栃木県",2010732
20,"群馬県",2006903
21,"岡山県",1943655
22,"三重県",1862575
23,"熊本県",1815985
24,"鹿児島県",1711746
25,"山口県",1456800
26,"愛媛県",1437549
27,"長崎県",1432236
28,"滋賀県",1402132
29,"奈良県",1400951
30,"沖縄県",1385725
31,"青森県",1382637
32,"岩手県",1340852
33,"大分県",1197220
34,"山形県",1179964
35,"石川県",1166656
36,"宮崎県",1132768
37,"秋田県",1097626
38,"富山県",1095217
39,"和歌山県",1005710
40,"香川県",1000169
41,"山梨県",869132
42,"佐賀県",852825
43,"福井県",808589
44,"徳島県",789269
45,"高知県",767520
46,"島根県",720112
47,"鳥取県",591150
ちなみに、WindowsでMicrosoft Excelを使用したデータをLinuxで使う場合、改行コードをUNIX用に合わせ、文字コードをUTF-8に変更する必要がありますが、これはUbuntu上でnkfを使って、次のコマンドで変更できます。
$ nkf -Lu --overwrite test.csv
nkfはデフォルトでは入っていないため、事前にインストールしておきましょう。
【index.php】
ドキュメントルートの直下に配置する。PHPのコードを含むため、拡張子は.phpとする。
<html>
<head>
<title>PHP + MYSQL sample</title>
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="stylesheet" href="css/style.php" type="text/css"">
</head>
<body>
<h2>PHPとMYSQLのサンプル</h2>
<?php
$db_host = 'localhost';
$db_user = 'user';
$db_pwd = 'password';
$database = 'data1';
$table = 'table1';
if (!mysql_connect($db_host, $db_user, $db_pwd))
die("データベースに接続できません");
if (!mysql_select_db($database))
die("データベースを選択できません");
// sending query
$result = mysql_query("SELECT * FROM {$table} WHERE 順位 <= '20'");
if (!$result) {
die("テーブルからのフィールドの表示に失敗しました");
}
$fields_num = mysql_num_fields($result);
echo "<table><tr align='center'>";
// printing table headers
for($i=0; $i<$fields_num; $i++)
{
$field = mysql_fetch_field($result);
echo "<th>{$field->name}</th>";
}
echo "</tr>\n";
// printing table rows
while($row = mysql_fetch_row($result))
{
echo "<tr align='center'>";
foreach($row as $cell)
echo "<td>$cell</td>";
echo "</tr>\n";
}
echo "</table>\n";
mysql_free_result($result);
?>
</body>
</html>
データベース情報の部分と、MySQLに関わる関数の意味を簡略にまとめると、次のようになります。
青字の部分(データベースの情報)
$db_host = 'localhost'; ⇒サーバ側で処理するので、ホスト名はlocalhostでよい。
$db_user = 'user'; ⇒使用するデータベースを所有するユーザ名
$db_pwd = 'password'; ⇒上記ユーザのパスワード
$database = 'data1'; ⇒使用するデータベース名
$table = 'table1'; ⇒使用するテーブル名
赤字の部分(MySQL関数)
mysql_query("SELECT文")
MySQL クエリを送信します。
ここに表示させるセルの条件を指定。上のコードでは、$result という変数に代入しています。
mysql_num_fields($result)
mysql_queryの結果におけるフィールドの数を得ます。
mysql_fetch_fields($result))
mysql_queryの結果からカラム情報を取得し、オブジェクトとして返します。
mysql_fetch_row($result))
mysql_queryの結果を添字配列として取得します。
mysql_free_result($result)
結果保持用のメモリを開放します。
※ PHPのMySQL関数の詳細はこちらのサイトを参照してください。
cssファイルのPHP版。PHPのコードを含むため、拡張子は.phpとします。このCSSファイルは、ドキュメントルートの直下にcssというフォルダを作り、その中に配置します。テキストや背景の色の指定は、PHPの変数として定義しないと反映してくれませんので、注意が必要です。
<?php
header("Content-type: text/css");
$para_color = '#FF6666';
$field_back_color = '#669966';
$field_color = '#FFFFFF';
$cell_back_color = '#EEFFEE';
$cell_text_color = '#226622';
$heading_size = '2em';
$heading_color = '#c0c0c0';
$border_color = '#337733';
?>
p {
color: <?php echo $para_color; ?>;
font-weight: bold;
font-size: 1.2em;
text-align: left;
}
th {
border: 1px <?php echo $border_color; ?> solid;
background-color: <?php echo $field_back_color; ?>;
color: <?php echo $field_color; ?>
}
td {
border: 1px <?php echo $border_color; ?> solid;
background-color: <?php echo $cell_back_color; ?>;
color: <?php echo $cell_text_color; ?>
}
MySQLでユーザーを追加したり、データベースとテーブルを用意する方法は、以前の記事MySQLで試すデータベース入門《その1》、MySQLで試すデータベース入門《その2》を参照。
ツイート
前回のサンプルを簡略化して、CSSでスタイルを反映させてみました。PHPを選んだ理由は、CSSを適用するのに通常のhtmlと同様に扱うことができることと、WEBアプリケーションを作るのに、おそらく最も簡単で初心者でもすぐに使えるプログミング言語ではなかろうかと思っているからです。
Perlを使ったCGIも試してみましたが、PerlではCSSを適用させるだけでも、結構苦労しました。
動的なサイトを作る際に利用されるスクリプトには、PHPの他にも、PerlやPythonやJavascriptなどがあります。[2012.3.31 一部削除しました]
ちなみに、PHPの場合、出力された結果だけが表示されるので、ユーザ側からページのソースをみても、設定がきちんとされていれば、PHPのソースコードを見ることはできません。設定を間違えて、ソースコードだけが丸見えになってしまうことはあり得ますけど。
PHPの基礎知識
さて、前回の方法でLAMPサーバーを導入すると、PHPでMySQLを扱う環境はすでに出来上がっていますので、ちょっと試してみましょう。基本的にPHPのコードは、htmlファイルの中に、次のような形で挿入します。
<? php
PHPのコマンド;
?>
例えば、次の内容のtest.phpというファイルを作成し、前回作成した/home/user/wwwの中に保存して、http://(ローカルIPアドレス)/test.php にアクセスしてみてください。
<html><body><p>
Today:
<?php
echo date("Y/m/d");
?>
</p></body></html>
Today: 2012/03/30 (←日付が入ります) と表示されれば、PHPがきちんと動作しています。
なお、PHPの処理結果は、冒頭部分が<html>で始まっていたとしても、拡張子を.phpとしておかないと反映されませんので、注意が必要です。
ここでPHPの解説を長々とやってしまうと、なかなか本題に入れませんので、詳しくはPHPの入門用のサイトを参照していただくとして、早速、MySQLとの連携の話に移りましょう。
PHP+MySQLでの文字化け解消
MySQLのデフォルトの設定では、MySQLのデータとPHPの書かれたファイルの双方をUTF-8で保存していて、PHPのコードにも誤りがないのに、何故かフォントが文字化けします。これはMySQLサーバー側の文字コードとPHPの内部処理に扱われる文字コードが一致していないためです。そこで、まず、MySQLの設定ファイル(/etc/mysql/my.cnf)に下記の赤字部分の変更を加えます。$ sudo nano /etc/mysql/my.cnf
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server=utf8
skip-character-set-client-handshake
$ sudo service mysql restart
「skip-character-set-client-handshake」はあまり筋のいい方法ではないようですが、他にPHPのMYSQL関数の文字化けに対する有効な対策は見つけられませんでした。また、「character-set-server=utf8」の部分について、次のように記載しているサイトもありますが、Ubuntu12.04で使われている mysql-server-5.5 では、サーバー側の設定であるmysqldには使えないようです。
✖ default-character-set=utf8
上記の変更を適用する前と後で、MySQLのフォント設定が実際どう変化しているのか確かめてみましょう。 $ mysql -u root -p でMySQLサーバーにログインします。パスワードを訊かれますが、ここで入力するのはLAMPサーバーを導入した際に設定したrootのパスワードです。
【適用前】
mysql> SHOW VARIABLES LIKE 'char%';
→ character_set_databaseとcharacter_set_serverの文字コードだけがlatin1になっています。
【適用後】
mysql> SHOW VARIABLES LIKE 'char%';
→ character_set_databaseとcharacter_set_serverも含め、すべての文字コードがutf8になります。
今回利用したcsvデータ
まず、データベースに登録した各都道府県の人口のデータは下記の「test.csv」です。テキストのデータは、ダブルクォーテーション「"」で挟み、カラム(構成要素、フィールドとも呼ぶ)間はカンマ「,」で区切った形のテキストファイルとしています。LibreOfficeのCalc(表計算)あるいはMicrosoft Excelでcsvとして保存すれば簡単に作成できます。Calcの場合、保存時に拡張子を.csvとすると、これらの区切りなどの設定を訊いてきますので、「"」と「,」を指定してください。【test.csv】
MySQLに登録するcsvファイルのサンプル。
1,"東京都",12988797
2,"神奈川県",9005176
3,"大阪府",8840372
4,"愛知県",7414098
5,"埼玉県",7170362
6,"千葉県",6183743
7,"兵庫県",5599359
8,"北海道",5517449
9,"福岡県",5066856
10,"静岡県",3787982
11,"茨城県",2967404
12,"広島県",2866571
13,"京都府",2631441
14,"新潟県",2383650
15,"宮城県",2340029
16,"長野県",2160602
17,"岐阜県",2086590
18,"福島県",2042816
19,"栃木県",2010732
20,"群馬県",2006903
21,"岡山県",1943655
22,"三重県",1862575
23,"熊本県",1815985
24,"鹿児島県",1711746
25,"山口県",1456800
26,"愛媛県",1437549
27,"長崎県",1432236
28,"滋賀県",1402132
29,"奈良県",1400951
30,"沖縄県",1385725
31,"青森県",1382637
32,"岩手県",1340852
33,"大分県",1197220
34,"山形県",1179964
35,"石川県",1166656
36,"宮崎県",1132768
37,"秋田県",1097626
38,"富山県",1095217
39,"和歌山県",1005710
40,"香川県",1000169
41,"山梨県",869132
42,"佐賀県",852825
43,"福井県",808589
44,"徳島県",789269
45,"高知県",767520
46,"島根県",720112
47,"鳥取県",591150
ちなみに、WindowsでMicrosoft Excelを使用したデータをLinuxで使う場合、改行コードをUNIX用に合わせ、文字コードをUTF-8に変更する必要がありますが、これはUbuntu上でnkfを使って、次のコマンドで変更できます。
$ nkf -Lu --overwrite test.csv
nkfはデフォルトでは入っていないため、事前にインストールしておきましょう。
PHP本体のサンプル
こちらが今回のメインとなるPHPでMySQLにアクセスするためのファイルです。事前に、MySQLでuserというユーザ(パスワード:password)、およびそのユーザを所有者としたdata1というデータベースを作成し、そのデータベース内のtable1というテーブルの中身に先に挙げたtest.csvを登録したと仮定しています。phpMyAdminを使うと、少し楽です。【index.php】
ドキュメントルートの直下に配置する。PHPのコードを含むため、拡張子は.phpとする。
<html>
<head>
<title>PHP + MYSQL sample</title>
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="stylesheet" href="css/style.php" type="text/css"">
</head>
<body>
<h2>PHPとMYSQLのサンプル</h2>
<?php
$db_host = 'localhost';
$db_user = 'user';
$db_pwd = 'password';
$database = 'data1';
$table = 'table1';
if (!mysql_connect($db_host, $db_user, $db_pwd))
die("データベースに接続できません");
if (!mysql_select_db($database))
die("データベースを選択できません");
// sending query
$result = mysql_query("SELECT * FROM {$table} WHERE 順位 <= '20'");
if (!$result) {
die("テーブルからのフィールドの表示に失敗しました");
}
$fields_num = mysql_num_fields($result);
echo "<table><tr align='center'>";
// printing table headers
for($i=0; $i<$fields_num; $i++)
{
$field = mysql_fetch_field($result);
echo "<th>{$field->name}</th>";
}
echo "</tr>\n";
// printing table rows
while($row = mysql_fetch_row($result))
{
echo "<tr align='center'>";
foreach($row as $cell)
echo "<td>$cell</td>";
echo "</tr>\n";
}
echo "</table>\n";
mysql_free_result($result);
?>
</body>
</html>
青字の部分(データベースの情報)
$db_host = 'localhost'; ⇒サーバ側で処理するので、ホスト名はlocalhostでよい。
$db_user = 'user'; ⇒使用するデータベースを所有するユーザ名
$db_pwd = 'password'; ⇒上記ユーザのパスワード
$database = 'data1'; ⇒使用するデータベース名
$table = 'table1'; ⇒使用するテーブル名
赤字の部分(MySQL関数)
mysql_query("SELECT文")
MySQL クエリを送信します。
ここに表示させるセルの条件を指定。上のコードでは、$result という変数に代入しています。
mysql_num_fields($result)
mysql_queryの結果におけるフィールドの数を得ます。
mysql_fetch_fields($result))
mysql_queryの結果からカラム情報を取得し、オブジェクトとして返します。
mysql_fetch_row($result))
mysql_queryの結果を添字配列として取得します。
mysql_free_result($result)
結果保持用のメモリを開放します。
※ PHPのMySQL関数の詳細はこちらのサイトを参照してください。
PHPで利用するCSSのサンプル
【style.php】cssファイルのPHP版。PHPのコードを含むため、拡張子は.phpとします。このCSSファイルは、ドキュメントルートの直下にcssというフォルダを作り、その中に配置します。テキストや背景の色の指定は、PHPの変数として定義しないと反映してくれませんので、注意が必要です。
<?php
header("Content-type: text/css");
$para_color = '#FF6666';
$field_back_color = '#669966';
$field_color = '#FFFFFF';
$cell_back_color = '#EEFFEE';
$cell_text_color = '#226622';
$heading_size = '2em';
$heading_color = '#c0c0c0';
$border_color = '#337733';
?>
p {
color: <?php echo $para_color; ?>;
font-weight: bold;
font-size: 1.2em;
text-align: left;
}
th {
border: 1px <?php echo $border_color; ?> solid;
background-color: <?php echo $field_back_color; ?>;
color: <?php echo $field_color; ?>
}
td {
border: 1px <?php echo $border_color; ?> solid;
background-color: <?php echo $cell_back_color; ?>;
color: <?php echo $cell_text_color; ?>
}
MySQLでユーザーを追加したり、データベースとテーブルを用意する方法は、以前の記事MySQLで試すデータベース入門《その1》、MySQLで試すデータベース入門《その2》を参照。
ツイート
突然のメールで失礼致します。ブログを拝見させて頂いてメールさせて頂いております。
私どもは外資系ヘッドハンティングファームでございます。外資系IT企業、コンサルティングファーム、国内IT企業のエンジニアポジションをご紹介しております。
現在、クライアント(自社サービスを持った企業)の強いご希望でスマートフォン向けアプリエンジニア、アプリケーションエンジニア、サーバー、DB周りのエンジニアを急務で探しておりまします。
管理人様が上記PHPでプログラミングが出来るエンジニアかと思い非常に興味を持っております。
もし、転職したい、作るプロダクトを変えたい、新しい技術を職場で学びたいという希望があれば、是非ご連絡ください。
何卒、よろしくお願いします。
E-mail nakahara@icpa.com