PHP For Beginnersチュートリアル　その4　PDOとデータベースの基本

##このシリーズの目的

体系的なwebコーディングの訓練ができるようになるために、PHPの初学のきっかけかつ、PHPでログインフォームやフォームを実装することができるようになるために

[PHP For Beginners](https://www.youtube.com/playlist?list=PLgt-G5tEOlKX4LKrBCYfjcyrp7wmnRdAL)

上記のチュートリアルを進めているのでその備忘録。

[前回](https://qiita.com/shitikakei/items/7b297a01178a97a16f99)

##内容

**今回のチュートリアル**

[PHP Tutorial For Beginners: Use PDO To Connect To MySQL Database](https://www.youtube.com/watch?v=f7MOz6_j16Q&list=PLgt-G5tEOlKX4LKrBCYfjcyrp7wmnRdAL&index=5)

**やったこと**

・PDOを使い、MySQLに接続する。
・MySQLでテーブルを作り、そこにデータを登録する。
・登録したデータを変更したり、削除したりする。


**成果物**

```php:pdo.php
<?php

	try {

		$PDO = new PDO("mysql:host=localhost;dbname=pdotutorial", "root", "");  //サーバーのIPアドレスやURL、ユーザー名、パスワード

		// 登録するデータを宣言する
		
		$name = "test1";
		$email = "test@example.com";

		// how to insert data using PDO ?
		// $stmt = $PDO->prepare("INSERT INTO test(name,email) VALUES(?,?)");
		// $stmt->execute([$name,$email]);
		// ここまでデータをデータベースに登録する基本的な書き方。

		//　登録したデータの内容を変更する。下記はデータのname部分を任意に置き換える例
		// $stmt = $PDO->prepare("UPDATE test SET name=? WHERE id=1");
		// $stmt->execute(["test1 5"]);

		//　登録したデータを削除する
		// $stmt = $PDO->prepare("DELETE FROM test WHERE id=1");
		// $stmt -> execute();

		// データベースに登録さているデータを羅列して表示させる
		$stmt = $PDO->prepare("SELECT name,email FROM test");
		$stmt->execute();
		while($data = $stmt->fetch())
			echo $data["name"] . "->" . $data["email"] . "<br>";

	} catch(PDOException $e) {

		echo $e->getMessage();

	}


?>
```




## MySQLでのテーブルの作り方

1.Newをクリックする
<img width="960" alt="2019-07-23_01h35_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/7a4c2d94-6cba-1231-731c-6fc54921c40b.png">


2.作成するデータベースの名前と文字コードを決める
→今回はutf-8 Unicode
<img width="380" alt="2019-07-23_01h37_23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/22b4526e-b801-e3e9-2005-937298b83bca.png">

3.テーブルの名前とカラム数を決める
→カラム数はデータの中身によって決める。
例えば中身がid=1,名前,メールアドレスといったデータの場合、カラム数は3となる。
<img width="775" alt="2019-07-23_01h38_16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/01c66597-ebcf-9a3d-2daa-ab9a45b9d45e.png">

4.カラム別に設定を行う
名前の部分はPHPでも使用するので、それに適したものを。
nameとemailはVARCHARという可変長形式の文字列を指定し、任意の限界文字列を決める。
idはAuto Incrementにチェックを入れ、インデックスはPRIMARYにする。
今回はこのような設定だが、この部分は今後実際に扱っていく上でデータによって細かく設定を行うことになるので、その都度しっかり覚えていくことが大切である。
<img width="891" alt="2019-07-23_01h43_56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/efb9914b-dc95-5601-56b5-50da64b5b0bb.png">



## 今回のコードの注釈


```php:アロー演算子、prepare、execute
<?php

 $stmt = $PDO->prepare("INSERT INTO test(name,email) VALUES(?,?)");
 $stmt->execute([$name,$email]);

アロー演算子はクラスのメソッドやプロパティにアクセスするための演算子である。
prepareはexecuteメソッドを実行するために必要なSQL文のことであり、書くまでもないが、executeメソッドはそれを実行するためのものである。
つまり、この場合1行目はpdo.phpの冒頭で作成したインスタンスである$PDOにアクセスし、その後testという名前のテーブルにあるnameとemailというデータに値を設定する準備が行われており、2行目で同じくアロー演算子を使い、executeメソッドの引数に任意の変数を指定するとその変数に代入された値がそれぞれ設定され、それが一行目の変数$stmtに代入されるので、それがtestテーブルに記録されるということになる。

?>
```
```php:while文と$stml->fetch();

while($data = $stmt->fetch())
            echo $data["name"] . "->" . $data["email"] . "<br>";

while文はphpにおける繰り返し処理の一つである。
while();で引数に設定した値がTRUEである限り、endowhile;が書かれるまで繰り返し処理が行われる。
$data = $stmt->fetch();はデータベースからデータを取得するための処理。
つまり、この一連の処理はまず、データベースに登録されているデータを総て取得し。それをnameの値ー＞emailの値といった形式で改行しながら書き出すということになる。
endwhileが無くても処理が止まるのは、データベースに登録されているデータの数が例えば5つだった場合、6つ目は存在しないので$data = $stmt->fetch();はfalseになるので繰り返しは5回で止まるから。

```

## 参考

[PHPのアロー演算子（->）をできるだけ分かりやすく](https://www.flatflag.nir87.com/arrow-249)
[【PHP】queryとprepareの違い]
(https://se-tomo.com/2018/07/12/php%E3%81%AEquery%E3%81%A8prepare%E3%81%AE%E9%81%95%E3%81%84/)