PHPでDBに接続、CRUDを利用して掲示板を作る①　

こんにちは。PHP初心者です。
Progateでさらっと学び、Udemyで掲示板アプリを動画をながめながら作り、今度はイチから自分でアプリを作ってみようと思いました。
その学習結果をまとめたものになります。
初学者のお役に立ちますように。

#CRUDとは？
CRUDとは、掲示板に必須な機能の
Create
Read
Update
Delete
の頭文字を取ったものになります。

#CRUDって何に使うの？
意味は分かったけどそれって掲示板のどの機能に当たるの？　となるのでさらに分解していきます。
Create…掲示板への書き込み
Read…掲示板に書き込まれた内容の表示
Update…書き込まれた内容の変更、更新（上書き保存）
Delete…書き込まれた内容の削除

となっています。

#CRUDを行うための共通項
PHPはサーバーサイドの言語と言われています。DBに接続しなくても一言掲示板は作れます。あえてDBに接続するというのは、勉強になるから…。

つまり、「PHPのファイルからDBに接続する」という工程がめんどくさくて複雑だからですね。

接続するには2つの手順を踏む必要があります
①phpMyadminなどでデータベースとテーブルを先に作っておく
（PHPにコードを書いて作成する方法はややこしくなるので割愛）

##phpMyadminでデータベースなどを作る方法
僕はXAMMPを使っています。XAMMPのコントロールパネルのMySQLの並びにあるAdminをクリック。
新規作成をクリックし、データベース名をつけて作成。
ここのデータベース名は重要です。

次に、テーブルを作成します。
テーブル名を入力、カラム数をとりあえず3個ぐらいにして作成します。
名前は一番上をid、二番目をsubmit_name、三番目をsubmit_contentにします。
idはデータ型をintにしてAUTO_INCREMENTを設定（重要）。こうすることで、書き込まれた順に1から数字が自動で割り当てられます。
「何番目の投稿か？」が探すことができます。UpdateやDeleteの時に使います。


submit_nameとsubmit_contentはvarcharにします。varcharの中は適当な数字でいいです。今回はそれぞれ20と255で設定してます。


今回はデータベース名をtest_bbs2、テーブル名をcontactsで進めていきます。


#②DBに接続するためのコードを書く
今回はCreate、つまり書き込みを行う操作をもとにコードを説明します。
Createの動作を実装するには、

①index.phpにフォームを作る　→　②confirm.phpで書き込む動作を行う

の手順で行います。
まず①からです。


```index.php
<form action="confirm.php" method="post">
<label for="comment">投稿者</label>
<input type="text" name="your_name">
<br>
<label for="comment">内容</label>
<textarea id="comment" name="content"></textarea>
<input type="submit">
</form>
```
…ここの内容はPHPじゃなく、HTMLがメインですね。

ここで大事なのは

```
<form action="confirm.php" method="post">
```
この一文です。actionの中に、次に動かすPHPファイル名を指定します。
methodにはpostをつっこみましょう。methodにはPOSTとGETの2種類あります。
勉強中です。

それから、この部分も重要です

```
<input type="text" name="your_name">
```

nameで指定された名前が、次のconfirm.phpで探される値になります。
自分でどんな名前をつけたのか忘れないよう、スペルを間違えないようにしましょう。

この時点でPHP上では**your_name**
DB上では**submit_name**となっており、同じデータを扱うのに呼び方が2つになってますので注意してください。


名前の部分に「高橋」と入力すると、
PHPでは高橋はyour_nameで、
DBに保存したあとはsubmit_name
で扱われます。

#confirm.phpでCreateを行う
ここでやっとDBに接続するコードが出てきます。
DBに接続する方法にはPDOとMysqliの2つの方法があります。
今回はPDOを使っています。

自作で作ろうとして「PHP　DB接続」とかで調べるとどっちの接続か分からずごっちゃになってしまうので、**自分が今どっちの方法を使っているのか（使いたいのか）**意識しましょう。

使い分けは勉強中です。

```
//DBへの接続
$dsn = 'mysql:dbname=test_bbs2; host=localhost';
$username= 'root';
$password= 'root';

try{

    $dbh = new PDO($dsn, $username, $password);
    echo "接続成功";
} catch(PDOException $e){
    echo "失敗:" . $e->getMessage() . "\n";
    exit();
}
```

mysql:dbname=test_bbs2;
この部分で、データベース名を使います。間違えないよう。
usernameはroot、$passwordは初心者であれば設定してないか、もしくはrootになっていると思います。
（設定したパスワードを確認する方法は勉強中）

#やっとCreateを実装する

ここまできて、やっとCreate、書き込み機能の実装です。
CreateはSQL構文で書きます。

整理すると、
書き込む見た目を作る→HTML/CSS
データを受け取るなどの処理→PHP
データベースに書き込み→SQL

となっています。

実際のコードはこんな感じです。

```confirm.php
//INSERT文を変数に格納
$sql = "INSERT INTO contacts (submit_name, submit_content) VALUES (:name, :content)";

//挿入する値は空のまま、SQL実行の準備をする
$stmt = $dbh->prepare($sql);

// 挿入する値を配列に格納する

$params = array(':name' => $_REQUEST['your_name'], ':content' => $_REQUEST['content']);

//挿入する値が入った変数をexecuteにセットしてSQLを実行
$stmt->execute($params);

//登録完了のメッセージ
echo "登録完了しました";
```

DBに書き込むのも、いくつかの段階が必要です。
ここでは
①SQLでDBの動きを指定する
②SQLの準備をする
③SQLの中に値を格納する
④実行する

この「準備をする」というコードがよく分からなくて困ったので、注意しましょう。
とにかくDBへの書き込みは「準備する　→　実行」

準備する必要は勉強中です。

##SQLの書き方
$sqlに挿入されてる
"INSERT INTO contacts (submit_name, submit_content) VALUES (:name, :content)"
この分がSQLの書き方となっています。

contactsがテーブル名となっています。
ここではDBのカラム名であるsubmit_nameとsubmit_contentそれぞれに関して、いったん:nameと:contentという値を与えます。

ちなみに:nameと:contentは「？」マークで代用できます。2種類の書き方があるということです。自分で実装しようとして探していろんなページを見ると、書き方が混在してわけわからなくなりますので注意。

##プリペアードステートメントを使う
準備するコードはプリペアードステートメント使います。
プリペアードステートメントとは？
プリペアードステートメントとは、「先に準備されていたテンプレート」のことです。

[詳しくはこちらを参照](https://www.php.net/manual/ja/pdo.prepared-statements.php)

変数を置かず->の意味も分からず使っていました。自分は「とにかくこういう書き方なんだ」と理解しました。

##挿入する値を配列に格納する

```
$params = array(':name' => $_REQUEST['your_name'], ':content' => $_REQUEST['content']);
```

ここで仮置きした:nameと:contentに入力したフォームから取得した値をいれます。
具体的には

```
$_REQUEST['your_name']
```

と書けばよいです。

ここも

```
$_POST
$_GET
$_REQUEST
```
の3つの書き方があります。
どの値を使うかは、フォームで設定した
form action="confirm.php" method="post"
ここのmethodの値とそろえる必要があります。

ちなみにREQUESTはPOSTもGETのどちらも受け取ることができます。

そして最後にexecuteで実行して完了です。

#その他トラブルシューティングなど
「書き込めねー」
みたいなトラブルがあると思います。
自分が試したこと2つほど。

##①SQL書き込みの文章を変数ではなく、数字で実行してみる。
```
"INSERT INTO contacts (submit_name, submit_content) VALUES (:name, :content)"
```

この文章がありますが、変数ではなく定数にしてみましょう。
具体的にはこんな感じ

```
"INSERT INTO contacts (submit_name, submit_content) VALUES (1, 5)"
```
これで実行して、DBに書き込みが行われるでしょうか？
行われたら次のステップへ。
行われない場合、ここまでのどこかがまちがってます。おそらく。

##②本当に変数を受け取れてる？
①の段階で、「変数を定数に置き換えたら書き込めた」場合、次は

```
$_REQUEST['your_name'], ':content' => $_REQUEST['content']
```

この辺の変数が受け取れてるか確認しましょう。
具体的には

```
var_dump($_REQUEST['your_name']);
```

で確認しましょう。受け取れてればOK。受け取れてない場合はスペルミスがないかなどチェックしましょう。



以上でした！
引き続きCRUDの記事を書いていこうと思います。