もっと簡単なアプリを作りたい方はお釣りを計算するプログラムを作ろう
データーベースとは
管理・活用できるように集めて大量のデータ、あるいはそれを処理するソフトウェアのことをいいます。PHPだけで巨大なデータを処理するのは大変です。でもデータベースの力を借りれば効率よく確実に処理できます。データベースにはいろいろな種類のものがあります。無料公開されているデータベースとして世界ナンバーワンのシェアを持つMySQLを使います。
住所名前等のように同じ種類のデータが入る項目をカラム(列)います。そして1つ分のデータをレコード(行)といいます。
早くMySQLを体験したいところですが、windowsではその前にMySQLで使う文字エンコーディングの設定が必要です。この手のソフトウェアでの設定変更は、設定ファイルに書かれた文字列を修正します。ここで変更する設定はMySQLサーバーの内部で使用する文字エンコーディングです。ウェブ標準のUTF-8で統一します。windows版のMySQLはデフォルト値が異なりますので、変更する必要があります。Mac版はデフォルトがUTFエイトなので以下の設定は不要です。
1、MAMPフォルダ内のconfフォルダがあります。さらにその中にmysqldフォルダ内にmy.iniというファイルがあるので、それをVS CODEで開いてください。⇨VS CODEについてはこちら
2、mysqldの一番下、40行目あたりにある
character-set-server=utf8
を追加します。そして必ず上書き保存してください。
修正が完了したらMySQLを再起動します。MAMPウインドウでstopをクリックして、再スタートします。
データベースとテーブルを作ろう
それではデータベースを作成して使ってみましょう。データベースの操作にはいろいろな方法がありますが、ここでは WebページからGUIで操作できる phpMyAdmin というツールを使ってみます。このツールは MAMPとともにインストール済みなので、すぐに使い始めることができます。
phpMyAdmin は MySQL をブラウザで管理するためのツールで、phpMyAdmin 自体が PHP で作られています。ちなみにみなさんがレンタルサーバーを借りると、MySQL は多くの場合 phpMyAdmin で管理することになります。慣れておくと、あとあと便利です。
では phpMyAdmin を起動してみることにしましょう。MAMP ウィンドウであらかじめApache と MySQL が動作しているのを確認しておいてください。
動画でも解説しているので、参考にしてください
phpMyAdmin を起動しよう
1、MAMPを起動
2、ToolsからphpMyAdminを選択
データベースを作る
今回はdbと言うデータベースを作ります。
1、データベースをクリック
2、dbと入力
3、作成をクリック
テーブルを作る
さてデータベース「db」ができました。でもデータベースだけ作っても、データの置き場所であるテーブルがありません。そうです。次にテーブルを作らなければ、データの保存はできないのです。
今回は「ban」「nam」「mes」「dat」という4つのカラム、「tb」という名前のテーブルを作ることにします。
「ban」という名前のカラムには番号を保存しますが、ここには連続番号機能を設定します。これで、レコードを挿入すれば自動的に 1、2、3・・・の連番が入力されるようになります。私たちがカラム「ban」に、わざわざ数字を入れる必要はありません。便利ですよね。
今回作成するテーブル
投稿番号(連番機能を設定) ban
投稿者の名前 nam
メッセージ mes
投稿日時 dat
データベースでは、同じカラムには同じ種類のデータしか入れられません。データの種類をデータ型といいます。整数型は「int」、文字列型は「varchar」、日付時刻型は「datetime」を指定しますが、クリックだけで済むので、難しいことを覚える必要はありません。
1、テーブル名にtabと入力
2、カラム数に4と入力
名前 ban データ型 INT (右にスクロールして)A_I(連続番号機能の意味でbanのみ)にチェック
同じように
nam データ型 VARCHAR 長さ(文字数) 20
mes データ型 VARCHAR 長さ(文字数)100
dat データ型 DATETIME
と入力してください。
SQLとは一体何者?
データーベースを操作するときに、私たちはデーターベースに命令を伝えなくてはいけないわけですが、PHPにはデーターベースに直接命令を出す機能がありません。そこで登場するのがSQLというデータベース操作用の言語です。MySQLだけではなくOracleなどの他のデータベースでも使用することができます。そしてPHPではSQLでデータベースを操作します。ただしPHPのような複雑な言語ではなく簡単な命令です。
データを送る側のプログラム
さて、いよいよ掲示板を作っていきます。
わかりにいくいところは、動画でもご確認いただけます。
送信フォームをつくります。名前とメッセージを入力して、送信ボタンをクリックするやつです。
sns1.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SNS1</title>
</head>
<body>
<form action="sns2.php" method="post">
名前
<div>
<input type="text" name="n"></div>
メッセージ
<div><textarea name="m"></textarea></div>
<input type="submit" value="送信するよ!">
</form>
<hr>
<form action="sns3.php" method="post">
検索キーワード
<div><input type="text" name="s"></div>
<input type="submit" value="検索するよ">
</form>
<hr>
<?php
$db = new PDO("mysql:host=localhost;dbname=db","root","root");
$ps = $db->query("SELECT * FROM tb ORDER BY ban DESC");
while ($r = $ps->fetch()){
print "{$r['ban']} {$r['nam']} {$r['dat']}<br>" .nl2br($r['mes'])."<hr>";
}
?>
</body>
</html>
フォームをつくろう
POST 送信を行いますので、method 属性には「post」を指定します。メッセージ本体の入力には <textarea>タグを使っています。これは、2行以上入力できるテキストボックスを設定します。このタグには name 属性で「m」という名前をつけていますので、このテキストボックスに入力されたメッセージは、$_POST[“m”] で取得できるようになります。また
「<textarea name=”m”></textarea>」のように開始タグと閉じタグを続けて記述しています。もし間に何か文字列を記述して「<textarea name=”m”>メッセージを入力してください </textarea>」などとすると、このテキストボックスに初めから「メッセージを入力してください」が入力された状態で表示されます。
保存したデータを1行表示させる
$db=new PDO(“mysql:host=localhost;dbname=db”,”root”,”root”);
この部分はデータベース(db)に接続している部分です。データベースを操作するPDOオブジェクトを$dbに代入しています。
$ps = $db->query(“SELECT * FROM tb ORDER BY ban DESC”);
ここでは、queryメソッド(関数)によって、SQLを実行しています。
SELECT * FROM tb は表の内容を表示させています。そしてORDER BY ban DESCは新しいメッセージ順にするために、降順(番号の大きい順)に並べています。
$psの中身はPDOStatementというオブジェクトになっています。ここでは、SQLを実行した中身が入っていると思っておいてください。$psの中身は文字列ではなくオブジェクトなので、そのままprint=$psでは書き出すことはできません。そこで実行しているのが$r=$ps->fetch();です。ここでは、fetchというメソッドを実行しています。
fetchはPDOStatementオブジェクトのメソッドです。fetchはSQLの実行結果からデータを配列として返すメソッドです。データが配列に変換されて、変数$rに代入されています。fetchメソッドが返す配列は、項目名がそのままデータの名前になっています。それぞれの値を取り出すには、
$r[‘ban’]} {$r[‘nam’]} {$r[‘dat’]}
と指定します。
上記の配列の内容を表示しているのが print 文です。
print “{ $r[‘ban’]} {$r[‘nam’]} {$r[‘dat’]} {$r[‘mes’]}”;
ここでは各カラムの内容を半角のスペースで区切って表示しています。このように変数と文字列が混じったものを”で囲んで print に渡すと、変数の部分はその内容に置き換えて表示されます。たとえば
$a=” 猫 “;
print “かわいい $a だよ “
のように、$aの後に半角スペースを入れて実行すると、「かわいい猫 だよ」と表示されます。PHP は、「これは変数だ!」と判断できるものならば、” ” 中の文字列に含まれる変数を「展開」してくれる、そんな賢いプログラム言語なのです。しかし、それなら次のように書けるはずですが、実際は変数を{}で囲っています。
print “$r[‘ban’] $r[‘nam’] $r[‘dat’] $r[‘mes’]
理由は、今回使用している変数の内容が’を使った配列だからです。” の中の”は特別な意味を持つので、そのまま使うとエラーになってしまいます。そこで、それぞれの変数を{}で囲んで {$r[“ban”]} {$r[‘nam”]} {$r[‘dat”]} {$r[‘mes”]} のようにして、「これが展開してほしい変数だよ」とわかりやすく PHP に教えて、エラーにならないようにしているのです。
繰り返しで全データを表示させる
while文は( )内に指定した条件が正しい間は、{ }内の処理を繰り返します。1つ分のデータを読み取り、書き込みを「データがなくなるまで」という条件で繰り返します。
while(繰り返しの条件){
条件がTrueの場合に繰り返す処理
)
while ($r = $ps->fetch()){
print “{$r[‘ban’]} {$r[‘nam’]} {$r[‘dat’]}<br>” .nl2br($r[‘mes’]).”<hr>”;
}
条件に指定している「$r=$ps->fetch)」はわかりにくいですよね。これまで条件には比較演算子や isset 関数など明確に True、もしくは False を返すものを指定してきましたが、「$r=$ps->fetch()」はテーブルから1行取り出して変数 $r に代入するというプログラムです。
この場合は、fetch メソッドの実行結果によって True / False を判断することになります。前述のとおり、fetch メソッドはテーブルから1行分を配列で返しますが、レコードがなくなると Falseを返します。つまり、取り出すレコードがなくなった場合は、while による繰り返しが終了することになります。fetch メソッドが1行分の配列を返したときに Trueになるのは、PHPでは Falseではないたいていの値は True と見なすという決まりがあるせいなので、これはそういうものなんだという理解をしてください。
ところで、fetch メソッドは取り出すレコードをどうやって決めているのでしょうか?
実は読み込みを実行するとき「このレコードを読むぞ!」という「読み込み位置」が設定されます。最初はテーブルの先頭にあるのですが、while で fetch メソッドの実行を繰り返すと、この読み込み位置が1レコードずつ進行するのです。そして、レコードがなくなってこれ以上読み込み位置が進められなくなったら、fetch メソッドが False を返すというわけです。
検索用のフォームを追加しよう
sns1.phpに検索用のフォームsns3.phpに繋げます。検索キーワードをsns3.phpへ送信します。sns3.phpでは検索キーワードを$__POST[“s”]で受け取ります。
メッセージを受け取る側のプログラム
sns2.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SNS2</title>
</head>
<body>
<?php
$my_nam=htmlspecialchars($_POST["n"], ENT_QUOTES);
$my_mes=htmlspecialchars($_POST["m"], ENT_QUOTES);
$db = new PDO("mysql:host=localhost;dbname=db","root","root");
$db->query("INSERT INTO tb (ban,nam,mes,dat) VALUES(NULL,'$my_nam','$my_mes',NOW())");
print "書き込みに成功!";
"<p><a href='sns1.php'>一覧表示へ</a></p>";?></body>
</html>
POST送信では$_POSTで送信データを受け取ります。今回はsns1.phpでは名前「n」、そしてメッセージを「m」の「送信データの名前」で送信しています。このデータをhtmlspecialchars関数で、危険な送信タグを無効にしています。
データベースへアクセスする構文
PDO(“mysql : host=ホスト名 ; dbname = データベース名” , “ユーザー名” , “パスワード”);
$db=new PDO(“mysql:host;dbname=db,”root,”root”);はPHPからデータベースを操作するために必要なPDOオブジェクトというものを作成して、変数$dbに代入しています。PHPプログラム上では、PDOオブジェクトをデータベースそのもののように扱うことが可能です。MAMPの場合、ユーザー名とパスワードは変更しない限りrootになります。
PHPでSQLを実行する
PHPプログラムからデータベースを操作するには、PDOオブジェクトを使って、SQLを実行します。
データを挿入するSQL構文
INSERT INTO テーブル名(項目名) VALUES(入れるデータ)
$db->query(“INSERT INTO tb (ban,nam,mes,dat) VALUES(NULL,’$my_nam’,’$my_mes’,NOW())”);
この部分はテーブルへの書き込みです。
$db->queryはSQL構文を実行するという意味になります。
print “書き込みに成功!”;
“<p><a href=’sns1.php’>一覧表示へ</a></p>”;?></body>
</html>
「一覧表示へ」のリンクをクリックすると、sns1.phpへ戻るようにしています。リンクの作成は<a>タグを使い、リンク先は hrefで指定します。
検索機能を追加する
sns3.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SNS3</title>
</head>
<body>
<?php
$my_sea=htmlspecialchars($_POST["s"], ENT_QUOTES);
$db = new PDO("mysql:host=localhost;dbname=db","root","root");
print "<p style='font-size:20pt'>「{$my_sea}」の検索結果</p>";
$ps=$db->query("SELECT * FROM tb WHERE mes like '%$my_sea%'");
while ($r = $ps->fetch()){
print "{$r['ban']} {$r['nam']} {$r['dat']}<br>" .nl2br($r['mes'])."<hr>";
}
print "<p><a href='sns1.php'>一覧表示へ</a></p>";?>
</body>
</html>
LIKEと%を使って検索するSQL
SELECT*FROM テーブル名 WHERE 項目名 LIKE '%検索文字%'
"SELECT * FROM tb WHERE mes like '%$my_sea%'"
検索キーワードは$_POST[“s”}で受け取れますので、それを$my_seaという変数に代入して使用しています。