PHPで掲示板を作ろう!(データベース編) その6 まとめ編

今回はMySQLの第6回目の講義です。今回で終わりですので、ソースの説明と今までの解説の概略を書いておきます。
Contents
前回までの記事
PHPで掲示板を作ろう!(データベース編) その1 データベースとは
PHPで掲示板を作ろう!(データベース編) その2 MySQLログイン編
PHPで掲示板を作ろう!(データベース編) その3 データベース作成編
PHPで掲示板を作ろう!(データベース編) その4 SQL編
PHPで掲示板を作ろう!(データベース編) その5 PHP-MySQL連結編
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
<?php $db_host = 'localhost'; $db_name = 'board_db'; $db_user = 'board_user'; $db_pass = 'board_pass'; // データベースへ接続する $link = mysqli_connect( $db_host, $db_user, $db_pass, $db_name ); if ( $link !== false ) { $msg = ''; $err_msg = ''; if ( isset( $_POST['send'] ) === true ) { $name = $_POST['name'] ; $comment = $_POST['comment']; if ( $name !== '' && $comment !== '' ) { $query = " INSERT INTO board ( " . " name , " . " comment " . " ) VALUES ( " . "'" . mysqli_real_escape_string( $link, $name ) ."', " . "'" . mysqli_real_escape_string( $link, $comment ) . "'" ." ) "; $res = mysqli_query( $link, $query ); if ( $res !== false ) { $msg = '書き込みに成功しました'; }else{ $err_msg = '書き込みに失敗しました'; } }else{ $err_msg = '名前とコメントを記入してください'; } } $query = "SELECT id, name, comment FROM board"; $res = mysqli_query( $link,$query ); $data = array(); while( $row = mysqli_fetch_assoc( $res ) ) { array_push( $data, $row); } arsort( $data ); } else { echo "データベースの接続に失敗しました"; } // データベースへの接続を閉じる mysqli_close( $link ); ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <form method="post" action=""> 名前<input type="text" name="name" value="" /> コメント<textarea name="comment" rows="4" cols="20"></textarea> <input type="submit" name="send" value="書き込む" /> </form> <!-- ここに、書き込まれたデータを表示する --> <?php if ( $msg !== '' ) echo '<p>' . $msg . '</p>'; if ( $err_msg !== '' ) echo '<p style="color:#f00;">' . $err_msg . '</p>'; foreach( $data as $key => $val ){ echo $val['name'] . ' ' . $val['comment'] . '<br>'; } ?> </body> </html> |
今回はちょっと詳細な説明をしたいと思います。
解説
PHPとデータベースの接続
ソース
1 2 3 4 5 6 7 8 9 10 11 12 |
$db_host = 'localhost'; $db_name = 'board_db'; $db_user = 'board_user'; $db_pass = 'board_pass'; // データベースへ接続する $link = mysqli_connect( $db_host, $db_user, $db_pass, $db_name ); if ( $link !== false ) { //MySQLがつながった時の処理 } else { echo "データベースの接続に失敗しました。" } |
解説
今回、データが入っているのがテキストファイルではなく、データベースになりますので、まずデータベースとつながなくてはいけません。
それがこの処理になります。
コマンドプロンプトからMySQLにつなぐときはまずユーザー名とパスワードを入力し、データベースを選択しました。
これは何をしているかというとコマンドプロンプトでやってきたことと同じことをPHPにやらせることになります。
MySQLにちゃんと接続できた場合、$linkの中にはMySQLの接続情報みたいなものが入っています。(知りたい方はvar_dumpで中身を見てみましょう。現段階では完全に理解しようとすると頭がフリーズすると思いますので、とりあえず接続情報全般と覚えておくとよいかと思います。)
そして接続できなかった場合falseが帰ってきます。
だから下記のようにfalseでなかったら、というような書き方になります。
1 |
if ( $link !== false ) { |
この処理はfalse以外の時は正常に接続できている、とみなしてOKなのです。(trueでないことに注意しましょう。)
ちなみに接続できない場合は「データベースの接続に失敗しました。」といったメッセージを表示することになります。
エラーチェック
ソース
1 2 3 4 5 6 7 8 9 10 11 |
if ( isset( $_POST['send'] ) === true ) { $name = $_POST['name'] ; $comment = $_POST['comment']; if ( $name !== '' && $comment !== '' ) { //入力があった時の処理 }else{ $err_msg = '名前とコメントを記入してください'; } } |
解説
投稿データがあるかどうかと未入力がないかをチェックしています。この部分はお問い合わせフォームや既存の掲示板などで何回か扱ったテーマですので復習になります。
わからない方は下記のエントリーがわかりやすいかと思います。
SQLをPHPにどう渡すか
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$query = " INSERT INTO board ( " . " name , " . " comment " . " ) VALUES ( " . "'" . mysqli_real_escape_string( $link, $name ) ."', " . "'" . mysqli_real_escape_string( $link, $comment ) . "'" ." ) "; $res = mysqli_query( $link, $query ); if ( $res !== false ) { $msg = '書き込みに成功しました'; }else{ $err_msg = '書き込みに失敗しました'; } |
解説
この部分と次のSELECT文の受け取りが今回の山場かと思われます。投稿があったときはINSERT文を発行します。
PHPからMySQLに接続を行う場合は、
- まずSQLを作る
- Mysql_queryでMySQLにSQL文を渡す。
といった手順を踏むことになります。
SQLを作る部分ですが、普通にSQLを書くと
INSERT INTO ( name, comment ) VALUES ( ‘$name’ , ‘$comment’ )になります。
横1行で書いてももちろんプログラム自体は動きますが、このように行ごとにわけてかいたほうが
- 単純に構造が見やすい
- あとで修正があったときにラク
などのメリットがあります。
SQLインジェクション対策
また下記のソースですが、これはSQLインジェクション対策といわれるものです。
1 |
mysqli_real_escape_string( $link, $comment ) |
セキュリティ対策の一環です。
Webの場合、不特定多数が訪れますので、悪意のある入力を考慮する必要があります。悪意のあるデータを加工もせずにそのままMySQLにつなぐとデータを破壊されたり、見てはいけないデータを見られる可能性があります。そういった悪意のある入力を無効化する処理がこの部分になります。
ここで作ったSQLをmysqli_queryという関数の中につなぐと、書かれたSQLが実行されます。成功不成功によってメッセージを変更します。
SELECT文の受け取り方
ソース
1 2 3 4 5 6 7 |
$query = "SELECT id, name, comment FROM board"; $res = mysqli_query( $link,$query ); $data = array(); while( $row = mysqli_fetch_assoc( $res ) ) { array_push( $data, $row); } arsort( $data ); |
解説
INSERT文の後はSELECT文です。基本的にはINSERTと一緒でSELECT文を作成し、mysqli_queryでMySQLに問いかけます。
INSERTとの違いですが、$resからデータを取り出す作業です。INSERTの場合、「データの更新」になりますので、その結果はデータ入力成功か不成功しかありません。
SELECTの場合は「データの取得」になりますので、結果としてデータが帰ってきます。
とはいっても$resに直接データが入っているわけではなく、データの場所を示した情報が含まれています。これを手掛かりに、実際にデータを取り出す作業が下記の部分になります。
1 2 3 |
while( $row = mysqli_fetch_assoc( $res ) ) { array_push( $data, $row); } |
この処理は下記のリンクのテキストファイルから実際にデータを取り出す作業と構造が全く同じです。
PHPで掲示板を作ろう! 掲示板の作成方法 その4(ファイル読み込みとHTML表示)
しおりの位置」を変えていき、データを取得していくわけです。
最後は取得したデータをHTMLに表示しますが、この部分も以前学習した部分なのでわからない方は下記リンクで勉強してみてください。
まとめ
6回にわけてMySQLで作る掲示板をやってきました。授業だと演習もかねて1日~2日ぐらいかけてこれをやりますね。
ちょっと学習したことを簡単にまとめてみます。
MySQLへの接続
データベースの作成・テーブル作成
データベースの作成
1 |
CREATE DATABASE board_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; |
データベースの選択
1 |
use board_db; |
ユーザーの作成
1 |
GRANT ALL PRIVILEGES ON board_db.* TO board_user@localhost IDENTIFIED BY 'board_pass' WITH GRANT OPTION; |
テーブルの作成
1 2 3 4 5 |
create table board( id int not null auto_increment primary key, name varchar(20), comment text ) |
基本的なSQLの構文
データを検索する
1 |
select カラム名 from テーブル名 where 条件文; |
データを入力する
1 |
insert into テーブル名 (カラム名1, カラム名2, ...) values ( '値1', '値2', ...); |
データを更新する
1 |
update テーブル名 set カラム名 = '変更したい値' where 条件文; |
データを削除する
1 |
delete from テーブル名 where 条件文; |
PHPとMySQLの接続
PHPとデータベースの接続
1 2 3 4 |
$link = mysqli_connect( $db_host, $db_user, $db_pass, $db_name ); if ( $link !== false ) { ・・・・・ } |
SQLの投げ方
1 2 |
$query = 具体的なSQL $res = mysqli_query( $link, $query ); |
基本的にはこのような内容ですね。
見た目のアプリは非常にしょぼいのですが、これに現代のWebアプリの基本が詰まっていますので、初学者の方は何も見ずにこれが作れるまで何度も練習してみましょう。
何も見ずにできるようになったら次にいろいろとカスタマイズしてみるとよいと思います。
関連記事
-
-
繰り返しを学ぼう (for,foreach)
こんばんわ。松本です。 ゴールデンウィークもそろそろおわりですね。といいつつ、私はどこにも言っ
-
-
PHPで掲示板を作ろう!(データベース編) その1 データベースとは
以前、掲示板を作成するブログ記事を書きました。 その1 PHPで掲示板を作ろう! 掲示板の作成
-
-
開発を便利にする道具たち
PHPだけではありませんが、プログラミングには開発スピードをアップさせるための便利な道具があります。
-
-
初心者が読みやすいコードを書くときに気をつけたい4つのポイント
本日のお題は、「読みやすいコードの書き方」についてです。 プログラミングをやりたての頃は機能を
-
-
あなたのPHPレベルを判定してみよう!未経験者限定スキル判定表
プログラムを勉強していると自分のレベルみたいなものが気になる方は多いでしょう。 私の場合も独学
-
-
もうエラーメッセージで挫折しない! 4つのエラーメッセージ対処法
このブログで何回か書いたのですが、PHPに限らずプログラミングの独学はかなり難しいです。 その
-
-
お問い合わせフォームを作ろう! その3(PHP)
それでは前回のコードを例に少しずつ内容について説明をしていきます。 値を取得するには まず一番最
-
-
プログラミングの基本ルール
ガチンコ松本です。 さて、準備が整ったところでさっそくPHPのコードを書いていきましょう!
-
-
理論と実践のバランス
ネタ不足&開発のほうが忙しく、一か月以上書いておりませんでした。 今回は漠然とスキルアップする
Comment
こんにちは塾長様。テルテルです。
先日はコメント返信いただき有難うございました。
この関連記事のその1~その6までなんとか来ることが出来ました。
Xamppでテストしながら、このページの上段に記載されているソースを使い、$db_host等を書き換え、稼働サーバーに載せてみました。
表示はされたのですが、いざ入力すると”書き込みに失敗しました”エラーとなります(泣)
お暇な時にでも何かアドバイスいただけたら助かります。
テルテル坊主様
引き続きコメントありがとうございます。
メールにてご連絡させていただきました。
ご連絡お待ちしております。
こんにちは。
私もテルテル坊主様と同じ箇所で止まっており、
”書き込みに失敗しました”と表示されます。
よろしければお答えください。
toasaさま
書き込みありがとうございます。
と言いますか、返信が遅くなりすいません。
もしよろしければソースを送っていただければ添削していただいてもよいですよ。
回答はおそらく週末になるかと思いますが・・・
もしよろしければmatsumoto@dt30.netにソースを添付して送っていただければと思います。
[…] […]