【備忘録です】【PHP】DB操作

##備忘録です
DB操作のイメージを掴むために残します。



phpMyAdminを使ってWebブラウザ上からDB操作を行ってきましたが、コードを書いてDB操作を行うこともできます。

```php:sample.php



<pre>
<?php
$host = 'localhost'; // データベースのホスト名又はIPアドレス ※CodeCampでは「localhost」で接続できます
$username = 'username';  // MySQLのユーザ名
$passwd   = 'passwd';    // MySQLのパスワード
$dbname   = 'dbname';    // データベース名
$link = mysqli_connect($host, $username, $passwd, $dbname);
// 接続成功した場合
if ($link) {
   // 文字化け防止
   mysqli_set_charset($link, 'utf8');
   $query = 'SELECT goods_id, goods_name, price FROM goods_table';
   // クエリを実行します
   $result = mysqli_query($link, $query);
   // 1行ずつ結果を配列で取得します
   while ($row = mysqli_fetch_array($result)) {
       print $row['goods_id'];
       print $row['goods_name'];
       print $row['price'];
       print "\n";
   }
   // 結果セットを開放します
   mysqli_free_result($result);
   // 接続を閉じます
   mysqli_close($link);
// 接続失敗した場合
} else {
   print 'DB接続失敗';
}
?>
</pre>
```

クエリ・・・DBに対する命令文のことです。
mysqli_set_charset・・・クライアントのデフォルト文字セットを設定しています。
mysqli_query・・・データベース上でクエリを実行します。
mysqli_fetch_array・・・結果の行を連想配列・数値添字配列あるいはその両方で取得します。
mysqli_free_result・・・結果に関連付けられたメモリを解放します。


上記のコードでは
**1.DB接続**
**2.文字コード設定**
**3.クエリ実行**
**4.結果を取得**
**5.メモリ解放**
**6.DB切断**

という処理を行っており、
**DBに接続してSELECT文を実行し全レコードを表示**ということをしています。phpMyAdminでは裏で自動でやってくれていましたが、今回の場合は書く必要があります。



##DB接続
```php:sample.php

mysqli_connect($host, $username, $passwd, $dbname)
 
$host
   データベースのホスト名又はIPアドレス
$username
   MySQLのユーザ名
$passwd
   MySQLのパスワード
$dbname
   データベース名
 
//機能
   //データベースへ接続
//返り値
   //リンクID(サーバへの接続を表すオブジェクト)
   //失敗するとFALSEを返す

```

mysqli_connect()にデータべースの情報を渡すことで、接続ができます。
返り値はリンクIDで、「接続したデータベースを特定するためのID」のようなものです。
DB接続は、phpMyAdminにおけるログインと同じ動作になります。

```php:sample.php
$link = mysqli_connect($host, $username, $passwd, $dbname);
// 接続成功した場合
if ($link) {
   // 文字化け防止
   mysqli_set_charset($link, 'utf8');
   $query = 'SELECT goods_id, goods_name, price FROM goods_table';
   // クエリを実行します
   $result = mysqli_query($link, $query);
```

上記のif文で接続に成功したか失敗したかの判定を行っています。
もしDB接続に失敗しても処理が止まるわけではなく、ソースコード従って以降も順に実行されていきます。

DB接続に失敗した後に、クエリー実行(mysqli_query)やDB切断(mysqli_cliose)などを行っても必ず失敗するため、無駄な処理となってしまいます。

そのため、if文を用いて以降の処理を行うかどうかを決定しています。


##クエリ実行

クエリ実行は以下のように行れます。

```php:sample.php
mysqli_query($link, $query)
 
$link
   リンクID
$query
   実行するクエリ
 
//機能
   //クエリを実行する
//返り値
   //成功すると結果セット、もしくはTRUEを返す
   //失敗するとFALSEを返す
```

mysqli_query()は、実行する命令によって成功時の返り値が変わります。

SELECT文を発行した場合は、結果セットが返りますが、INSERET文やUPDATE文、 DELETE文の場合はTRUEが返ります。

結果セットとは、「SELECTにより選択されたデータのかたまり」のようなものです。

phpMyAdminではSELECT文を入力し実行すれば結果を表示まで自動でやってくれましたが、プログラムの場合は実行結果の何の情報をどのように取得するか、別途指定する必要があります。


##結果を取得

実行したクエリの結果取得は、以下のように行います。

```php:sample.php

mysqli_fetch_array($result)
 
$result 
   結果セット
 
//機能
   //結果セットを配列として返す
 
//返り値
   //成功すると行の配列を返す
   //読み込むデータがなくなるとNULLを返す
   //失敗するとFALSEを返す
```


fetchとは「取ってくる」という意味で、SELECTした結果を1行だけ配列として取得します。
取得は1行だけなので、全てのファイルを読み込むにはwhile文と組み合わせて使います。
phpMyAdminでは裏で自動的にやってくれていた処理ですが、プログラムを書く場合、SELECT文は**mysqli_query()**と**mysqli_fetch_array()**がセットになります。


##メモリ開放

```php:sample.php
mysqli_free_result($result)
 
$result
   結果セット
 
//機能
   //結果に関連付けられたメモリを開放する
 
//返り値
   //値を返さない
```

メモリとは、コンピュータ内でデータやプログラムを記憶する装置です。
メモリはデータの保存や取り出しが高速で行え、一時的なデータの保存場所として利用します。
またメモリには容量があり、容量を越えると急激に処理が遅くなります。
結果セットはこのメモリに保存されており、メモリ開放をしなくても現時点では問題はないですが、
後々のためmysqli_query()で結果セットを取得した場合、利用し終わったらすぐにmysqli_free_result()で開放しましょう。


##DB切断

DB切断は以下のように行います。

```php:sample.php


mysqli_close($link)
 
   $link: リンクID

//機能
    //データベースから切断する
 
//返り値
   //成功するとTRUEを返す
   //失敗するとFALSEを返す
```


ファイル操作と同様、データベースに接続している時間は可能な限り短いほうがいいためSELECTや INSERTなどの必要な処理が終わったらすぐに切断します。

DB切断は、phpMyAdminにおけるログアウトと同じ動作となります。