Linux(CentOS7)でWebサーバーを構築する。 -導入編Final-

# 概要
過去3回に渡り「Linux(CentOS7)でWebサーバーを構築する」シリーズを綴って参りましたが、今回が導入編の最終回となります。(多分)

-導入編Final-では、

- php-mysqliの導入
- 実働テスト
 - テスト用データベース及びユーザーの作成
 - テスト用テーブルの作成
 - テストデータの登録
 - サンプルページ作成
 - 動作確認
- 注意点

について綴ります。


今までの「Linux(CentOS7)でWebサーバーを構築する」シリーズ

- [-Apache導入編-](http://qiita.com/sango/items/b045a1da17606eda6f82)
- [-php導入編-](http://qiita.com/sango/items/a08c5b04df7125aaaad3)
- [-MySQL導入編-](http://qiita.com/sango/items/e6eaa5694cd4043f3c4e)


# 手順

## php-mysqliの導入
phpからMySQLへのアクセスが簡単にできるように、php-mysqliを導入するよ！
### 1. 導入
`# yum -y install php-mysqli`

とっても簡単ね！

### 2. httpdの再起動
php-mysqliのインストールが終わったら有効化するためにhttpdを再起動してね。

`# systemctl restart httpd.service`

## 実働テスト

### 1. テスト用データベース及びユーザーの作成
サンプルコードを実行するためのデータベースとそれを使用するためのユーザーを作成するよ。

MySQLにログイン
`# mysql -u root -p`

テスト用のデータベースを作成
`MariaDB [(none)]> create database testdb;`
※[testdb]は任意のデータベース名を入力

testdbを操作するためのユーザーを作成
`MariaDB [(none)]> grant all on testdb.* to testuser@localhost identified by 'password';`
※[testuser]は任意のユーザー名を入力
※[password]は任意のパスワードを入力

ここまでできたら一旦MySQLを終了。
`MariaDB [(none)]> \q`

さっき作ったユーザーでログインし直してみよう！
`# mysql -u testuser -p`
ログインできたかな？

useでさっき作ったデータベースを選択してね！
`MariaDB [(none)]> use testdb`

(none)の表示が(testdb)に切り替わったらOK！
`MariaDB [(testdb)]>`

### 2. テスト用テーブルの作成
さっき作ったデータベースに新しいテーブルを作成するよ！

テーブルっていうのは、表のこと。
名簿とか帳簿をイメージしてもらえば。

```
+-------------+-----------------------------+--------------+
| number      | name                        | constellatio |
+-------------+-----------------------------+--------------+
| 1           | Hoshimiya                   | Pisces       |
+-------------+-----------------------------+--------------+
| 2           | Kiriya                      | Aquarius     |
+-------------+-----------------------------+--------------+
| 3           | Shibuki                     | Leo          |
```
こんなん。

早速作ってみるよ！
`MariaDB [(testdb)]> create table testtable (number int(4), name varchar(32), constellatio varchar(32));`

`create table`はテーブルを作るための命令、
[testtable]には任意のテーブル名を。

後ろに続くのが、テーブルにどんなデータを格納するかを定義する文だよ。
`number int(4)` は4桁の数値を入れるnumberという箱を用意、
`name varchar(32)` は最大32文字の文字列を入れるnameという箱を用意、
`constellatio varchar(32)`は最大32文字の文字列を入れるconstellatioという箱を用意する文。

<br>
きちんと作られたか確認してみてね。
`MariaDB [(testdb)]> show columns from testtable;`

こんな結果が出たら成功！

```
+-----------------------------------------------------------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| number       | int(4)      | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
| name         | varchar(32) | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
| constellatio | varchar(32) | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
```

### 3. テストデータの登録
せっかくテーブルを作ったので、早速データを登録してみよう！
`MariaDB [(testdb)]> insert into testtable (number, name, constellatio) values (1, "Hoshimiya", "Pisces");`

`insert into` はテーブルにデータを挿入する命令、
[testtable]には任意のテーブル名を指定してね。

続く `(number, name, constellatio)` と `(1, "Hoshimiya", "Pisces")` は対の関係になっているよ！
`number` は `1`、
`name` は `Hoshimiya`、
`constellatio` は `Pisces`
でデータを登録する、という文になるよ！

他のレコードも追加しちゃいます。
`MariaDB [(testdb)]> insert into testtable (number, name, constellatio) values (2, "Kiriya", "Aquarius");`
`MariaDB [(testdb)]> insert into testtable (number, name, constellatio) values (3, "Shibuki", "Len");`

<br>
テーブルの中身を確認してみよう！
`MariaDB [(testdb)]> select * from testdb;`

ちゃんと登録されていたかな？

```
+-------------+-----------------------------+--------------+
| number      | name                        | constellatio |
+-------------+-----------------------------+--------------+
| 1           | Hoshimiya                   | Pisces       |
+-------------+-----------------------------+--------------+
| 2           | Kiriya                      | Aquarius     |
+-------------+-----------------------------+--------------+
| 3           | Shibuki                     | Leo          |
+-------------+-----------------------------+--------------+
```

### 4. サンプルページ作成

`/var/www/html` に下記のサンプルコードを作成してね！

```php:sample.php
<html>
	<head>
		<title>Sample</title>
	</head>
	<body>
		TEST PHP.<br>
		<hr>
<?php
	if( !isset( $_GET['number'] ) )
	{
		echo '[Error]require param.<br>';
		exit;
	}

	$mysqli = new mysqli( '127.0.0.1', 'testuser', 'password', 'testdb' );
	if( $mysqli->connect_errno )
	{
		echo '[Error]' . $mysqli->connect_error . '<br>';
		exit;
	}

	$res = $mysqli->query( 'select name,constellatio from testtable where number=' . $_GET['number'] . ';' );
	if( $res )
	{
		echo '[Success!]<br>';

		while( $row = $res->fetch_assoc() )
		{
			echo $row['name'] . ' (' . $row['constellatio'] . ')<br>';
		}
	}
	else
	{
		echo '[Error]failure...<br>';
	}

	$mysqli->close();
?>
	</body>
</html>
```

[testuser] には任意のMySQLユーザー名を、
[password] には↑のユーザーのパスワードを、
[testdb] には任意のデータベース名を、
[testtable] には任意のテーブル名を指定してね！
<br>

#### 解説
`$mysqli = new mysqli( '127.0.0.1', 'testuser', 'password', 'testdb' );`
`new mysqli` でMySQLへの接続を試みているよ！
`testuser` は上で作ったMySQLユーザー名を、
`password` は上で指定したパスワードを、
`testdb` には上で作ったデータベース名を指定してね！

`$res = $mysqli->query( 'select name,constellatio from testtable where number=' . $_GET['number'] . ';' );`
`$mysqli->query` でMySQLにクエリを送るよ！
引数にはSQL文を入力してね！
`select name,constellatio` はnameとconstellatioを要求、
`from testtable` testtableから、
`where number=1` numberが1のレコードを、の意。
全部繋げると「testtableからnumberが1になっているレコードのnameとconstellatioを取得」という意味になるよ。

`while( $row = $res->fetch_assoc() )`
`$res->fetch_assoc()` は$mysqli->queryの結果から一つのレコードを取得する文だよ！

`echo $row['name'] . ' (' . $row['constellatio'] . ')<br>';`
`$row['パラメタ名']`で`fetch_assoc`の結果にアクセスできるよ！

### 5. 動作確認
いよいよ実働テスト！
Apache, php, MySQLはちゃんと動いてくれるかな？？

<br>
`http://???.???.???.???/sample.php?number=1`
ブラウザにアドレスとパラメタを与えて、サンプルページにアクセスしてみてね！


```
[Success!]
Hoshimiya (Pisces)
```
こんな感じに表示されたかな？

<br>
`http://???.???.???.???/sample.php?number=2`
今度はnumberを2にしてみると…？

```
[Success!]
Kiriya (Aquarius)
```

<br>
`http://???.???.???.???/sample.php`
パラメタがないと…？

```
[Error]require param.
```

<br>
`http://???.???.???.???/sample.php?number=100`
登録されていないnumberを指定すると…？

```
[Success!]
```
成功はするけど何も表示されないよ。

<br>
動いたかな？

## 注意点
今回のサンプルはエラーチェックとか色々省いた簡易コードです。
実運用では、エラーチェックや例外処理、あと[SQLインジェクション](https://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)等には十分気をつけてね！