PHP 【保存版!!】PHPからMySQLに接続する方法etc【データベース】

#データベース


</head>
<body>
![PDO説明.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c6766d9b-6be4-7e0f-0b29-a3184d7d6f74.png)

##ユーザー
データベースを作ったら、このデータベースに
アクセスして操作できるユーザーを作る。
MySQLをインストールしてまもないときは、
rootという管理者権限を持つユーザーが既にいる。
rootユーザーは全てのデータベースを操れるので危険。
なので、<font color=ff0000>**データベースを作ったら、
このデータベースだけを操作できるユーザーを作り、
PHPでプログラムを書くときでもそのユーザーで
データベースにアクセスする方が、
他のデータベースを不正利用されず安全**</font>

#SQLから
##**コマンドプロンプトからMySQLへ接続**

```sql:方法①
mysql -u root -p  Enter
Password:password
```

```sql:方法②　192.168.1.30にはホスト名を入れる
mysql -h 192.168.1.30 -u ユーザー名 -p
```



##**データベースでユーザー一覧を表示する**

```
# mysql -u root -p
Enter password: ********
Welcome to the MySQL monitor.  
mysql> select Host, User FROM mysql.user;
+-----------+------+
| Host      | User |
+-----------+------+
| linux     |      |
| linux     | root |
| localhost |      |
| localhost | pma  |
| localhost | root |
+-----------+------+
5 rows in set (0.02 sec)
```

##**ユーザーの作成**

```
mysql> grant all on test.* to 'testuser'@'localhost' identified by 'root';
Query OK, 0 rows affected (0.02 sec)
```
確認すると...

```
mysql> SELECT user,host FROM mysql.user;
+----------+-----------+
| user     | host      |
+----------+-----------+
|          | linux     |
| root     | linux     |
|          | localhost |
| pma      | localhost |
| root     | localhost |
| testuser | localhost |
+----------+-----------+
```
testuserというユーザーがちゃんとありました

##**作成したユーザーでMySQLにログイン**
```
# mysql -u testuser -p
Enter password: ****
Welcome to the MySQL monitor.
```

##**テーブル作成**
使用例

<pre>
mysql> use takahashi1
Database changed
mysql> create table words(id int auto_increment primary key,word varchar(100),se
nse varchar(250),memo varchar(250));
Query OK, 0 rows affected (0.09 sec)

mysql> show fields from words;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| word  | varchar(100) | YES  |     | NULL    |                |
| sense | varchar(250) | YES  |     | NULL    |                |
| memo  | varchar(250) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
</pre>

##**テーブルにデータを追加**
![201701108.png](https://qiita-image-store.s3.amazonaws.com/0/95187/fb10783d-0f0f-b2de-176c-f6ef4538483a.png)

![201701107.png](https://qiita-image-store.s3.amazonaws.com/0/95187/84442a5d-7879-4c51-e66c-ff146a03debc.png)

```php:
mysql> insert into product values(null, 'バターピーナッツ',200);
Query OK, 1 row affected (0.12 sec)

mysql> select * from product;
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | 松の実             |   700 |
|  2 | くるみ             |   270 |
|  3 | ひまわりの種       |   210 |
|  4 | アーモンド         |   220 |
|  5 | カシューナッツ     |   250 |
|  6 | ジャイアントコーン |   180 |
|  7 | ピスタチオ         |   310 |
|  8 | マカダミアナッツ   |   600 |
|  9 | かぼちゃの種       |   180 |
| 10 | ピーナッツ         |   150 |
| 11 | クコの実           |   400 |
| 13 | バターピーナッツ   |   200 |
+----+--------------------+-------+
```

```php:敬語ノートに追加
mysql> insert into honorifics values(null,'無視してください','ご放念ください','
謝礼のほうはご放念ください');
Query OK, 1 row affected (0.03 sec)
```

```php:敬語学習ノートに追加(例文はnullで)
mysql> insert into honorifics values(null,'～がこのように申しております','～がこ
のように言っています',null);
Query OK, 1 row affected (0.03 sec)
```

<pre>
mysql> show fields from honorifics;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| wrongHonorific | varchar(100) | YES  |     | NULL    |                |
| rightHonorific | varchar(100) | YES  |     | NULL    |                |
| example        | varchar(250) | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
</pre>

##**テーブル一覧**
<div class="minititle">使用例</div>
<pre class="usage">
SHOW TABLES FROM データベース名;
</pre>
testというデータベース名のテーブル一覧を表示...
<pre>
mysql> show tables from test;
+----------------+
| Tables_in_test |
+----------------+
| week           |
+----------------+
</pre>

##**テーブルに登録されたデータ一覧表示**
<div class="minititle">使用例</div>
<pre class="usage">
select * from テーブル名;</pre>
<pre>
mysql> select * from product;
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | 松の実             |   700 |
|  2 | くるみ             |   270 |
|  3 | ひまわりの種       |   210 |
|  4 | アーモンド         |   220 |
|  5 | カシューナッツ     |   250 |
|  6 | ジャイアントコーン |   180 |
|  7 | ピスタチオ         |   310 |
|  8 | マカダミアナッツ   |   600 |
|  9 | かぼちゃの種       |   180 |
| 10 | ピーナッツ         |   150 |
| 11 | クコの実           |   400 |
+----+--------------------+-------+
</pre>

##**テーブルのフィールド一覧表示**
<div class="minititle">使用例</div>
<pre class="usage">
mysql> SHOW FIELDS FROM テーブル名;
</pre>
productというテーブル名のフィールド一覧を表示
<pre>
mysql> show fields from product;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(200) | NO   |     | NULL    |                |
| price | int(11)      | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
</pre>

<div class="minititle">使用例②</div>
<pre>
mysql> select id from product;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
| 11 |
+----+
</pre>

##**テーブルにカラムを追加**
![201701241.png](https://qiita-image-store.s3.amazonaws.com/0/95187/66f915f1-7dda-2e4e-6d44-80804d28e276.png)


```php:テーブルにカラムを追加
mysql> alter table honorific add example varchar(250);
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show fields from honorific;
+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| id               | int(11)      | NO   | PRI | NULL    | auto_increment |
| wrongHonorific   | varchar(100) | YES  |     | NULL    |                |
| correctHonorific | varchar(100) | NO   |     | NULL    |                |
| example          | varchar(250) | YES  |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+
```

##**SQLで商品名で商品を検索**
<div class="minititle">使用例</div>
<pre class="usage">
mysql> select * from テーブル名 where 列名='検索キーワード;
</pre>

productテーブルのnameという列の中にカシューナッツがあるか検索する
<pre>
mysql> select * from product where name='カシューナッツ';
+----+----------------+-------+
| id | name           | price |
+----+----------------+-------+
|  5 | カシューナッツ |   250 |
+----+----------------+-------+
</pre>

##**SQLで商品を更新するSQL文**
[![カラム.png](https://qiita-image-store.s3.amazonaws.com/0/95187/2c840502-a39d-21fb-affd-14bb288df2a9.png)](http://qiita.com/L_e_k_o/items/3d10f4e4804f0246866c)

[![zu01.jpg](https://qiita-image-store.s3.amazonaws.com/0/95187/1e282af6-4ba3-81e2-5594-1ab51b5e6afd.jpeg)](http://itpro.nikkeibp.co.jp/article/COLUMN/20070209/261546/)
![201701122.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c6d49d5a-f807-3dfa-643d-41fe51f22535.png)

```php:更新前
mysql> select * from product;
+----+--------------------------------------------------------+-------+
| id | name                                                   | price |
+----+--------------------------------------------------------+-------+
|  1 | 松の実                                                 |   700 |
|  2 | くるみ                                                 |   270 |
|  3 | ひまわりの種                                           |   210 |
```

```php:name列の値を「高級松の実」にし、同時にpriceを「900」に
mysql> update product set name='高級松の実', price=900 where id=1;
Query OK, 1 row affected (0.09 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from product;
+----+--------------------------------------------------------+-------+
| id | name                                                   | price |
+----+--------------------------------------------------------+-------+
|  1 | 高級松の実                                             |   900 |
|  2 | くるみ                                                 |   270 |
|  3 | ひまわりの種                                           |   210 |
```

```php:価格だけを「800」に変更する
mysql> update product set price=800 where id=1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from product;
+----+--------------------------------------------------------+-------+
| id | name                                                   | price |
+----+--------------------------------------------------------+-------+
|  1 | 高級松の実                                             |   800 |
|  2 | くるみ                                                 |   270 |
|  3 | ひまわりの種                                           |   210 |
```

##**SQLでテーブルのデータを削除**

```php:「アーモンド」というnameのデータを削除
mysql> select * from product;
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | 松の実             |   700 |
|  2 | くるみ             |   270 |
|  3 | ひまわりの種       |   210 |
|  4 | アーモンド         |   220 |
|  5 | カシューナッツ     |   250 |
|  6 | ジャイアントコーン |   180 |
|  7 | ピスタチオ         |   310 |
|  8 | マカダミアナッツ   |   600 |
|  9 | かぼちゃの種       |   180 |
| 10 | ピーナッツ         |   150 |
| 11 | クコの実           |   400 |
| 13 | バターピーナッツ   |   200 |
| 14 | ローストピーナッツ |   220 |
| 15 | アーモンド         |   320 |
+----+--------------------+-------+
14 rows in set (0.01 sec)

mysql> delete from product where name='アーモンド';
Query OK, 2 rows affected (0.06 sec)

mysql> select * from product;
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | 松の実             |   700 |
|  2 | くるみ             |   270 |
|  3 | ひまわりの種       |   210 |
|  5 | カシューナッツ     |   250 |
|  6 | ジャイアントコーン |   180 |
|  7 | ピスタチオ         |   310 |
|  8 | マカダミアナッツ   |   600 |
|  9 | かぼちゃの種       |   180 |
| 10 | ピーナッツ         |   150 |
| 11 | クコの実           |   400 |
| 13 | バターピーナッツ   |   200 |
| 14 | ローストピーナッツ |   220 |
+----+--------------------+-------+
```
---

```php:delete(全体を削除)
delete from テーブル名
```

```php:(例)productテーブル全体を削除
delete from product
```

##**キーワードを含まない商品名の検索**

```php:名前に「ナッツ」を含まない商品を検索
mysql> select * from product where name not like '%ナッツ%';
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | 松の実             |   700 |
|  2 | くるみ             |   270 |
|  3 | ひまわりの種       |   210 |
|  4 | アーモンド         |   220 |
|  6 | ジャイアントコーン |   180 |
|  7 | ピスタチオ         |   310 |
|  9 | かぼちゃの種       |   180 |
| 11 | クコの実           |   400 |
+----+--------------------+-------+
```

##**like演算子による部分一致検索(ワイルドカード)**

```php:「ピーナッツ」を含まない「ナッツ」の商品検索
mysql> select * from product where name like '%ナッツ%' and name not like 'ピー
ナッツ%';
+----+------------------+-------+
| id | name             | price |
+----+------------------+-------+
|  5 | カシューナッツ   |   250 |
|  8 | マカダミアナッツ |   600 |
+----+------------------+-------+
```

```php:名前の末尾が「ナッツ」の商品を検索
mysql> select * from product where name like '%ナッツ';
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  5 | カシューナッツ     |   250 |
|  8 | マカダミアナッツ   |   600 |
| 10 | ピーナッツ         |   150 |
| 13 | バターピーナッツ   |   200 |
| 14 | ローストピーナッツ |   220 |
+----+--------------------+-------+
```

##**PHPから部分一致で商品を検索する**
[like演算子](http://www.dbonline.jp/mysql/select/index7.html)
![201702061.png](https://qiita-image-store.s3.amazonaws.com/0/95187/e1bdd1df-78aa-57f1-72bb-81f04b679b60.png)


```php:名前に「ナッツ」を含む全ての商品を検索
mysql> select * from product where name like '%ナッツ%';
+----+------------------+-------+
| id | name             | price |
+----+------------------+-------+
|  5 | カシューナッツ   |   250 |
|  8 | マカダミアナッツ |   600 |
| 10 | ピーナッツ       |   150 |
+----+------------------+-------+
```
![201701105.png](https://qiita-image-store.s3.amazonaws.com/0/95187/8c04d138-49a6-8e36-3123-650697c03f2f.png)

```php:search-input2.php
商品名を入力してください。
<form action="search-output2.php" method="post">
<input type="text" name="keyword">
<input type="submit" value="検索">
</form>
```

```php:search-output.php
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>商品価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
$sql = $pdo->prepare ( 'select * from product where name like ?' );
$sql->execute(['%'.$_REQUEST['keyword'].'%'])
;
foreach ( $sql->fetchAll () as $row ) {
	echo '<tr>';
	echo '<td>', $row ['id'], '</td>';
	echo '<td>', $row ['name'], '</td>';
	echo '<td>', $row ['price'], '</td>';
	echo '</tr>';
	echo "\n";
}
?>
</table>
```

##**NOT NULL制約の削除**

![20170131.png](https://qiita-image-store.s3.amazonaws.com/0/95187/064e96e6-2855-3b88-e9db-d7e513356e43.png)


```php:
mysql> alter table honorifics modify column example varchar(200);
```

##**NULL制約を付ける**

![201702222.png](https://qiita-image-store.s3.amazonaws.com/0/95187/13135f6f-0a29-456d-5cd6-614fb43c3fe0.png)

<pre>
mysql> alter table words modify column memo varchar(250) null;
</pre>

##**UNIQUE制約を付ける**
行ごとに全て異なる値になり、他の行と同じ値を格納することができなくなる。
NULLは格納できる。NULLの値だけは複数のカラムで重複して格納することができる。

<pre>
mysql>login varchar(100) not null unique,
</pre>

[参考サイト](http://uxmilk.jp/12725)
##**外部キー制約(foreign key)**

![20170227.png](https://qiita-image-store.s3.amazonaws.com/0/95187/7dd73e07-2a5d-ff87-3824-aeb2521f027f.png)

<pre>
mysql> create table purchase(id int not null primary key,customer_id int not nul
l,foreign key(customer_id) references customer(id));
</pre>

「purchaseテーブルのcustomer_id列には、customerテーブルのid列に存在する値だけが格納できる」

<font color="red">foreign key=外部キー制約</font>

|　|さまざまな制約|
|:--|:--|
|**foreign key**|外部キー制約を指定した列には、外部のテーブルにある指定した列に含まれる値だけが格納できるようになる|
|**unique**|行ごとに全て異なる値になり、他の行と同じ値を格納することができなくなる|
|**primary key**|行ごとに異なる値を割り当てる|
|**複合主キー**|複数の列を組み合わせて主キーにしたもの|

##**複合主キー**
複数項目でワンセットな主キー。
複数の項目で一意に識別できる主キーのこと。

![複合主キー.png](https://qiita-image-store.s3.amazonaws.com/0/95187/61e384f5-25f2-fbd4-25dc-589234ab9b63.png)

[参考サイト](http://web.sevendays-study.com/mysql/ex-day5.html)

##**varchar**

|　|さまざまな型|
|:--|:--|
|**char(4)**|固定長文字列。char(4)4文字ぴったりしか格納できない|
|**varchar(バイト数)**|可変長文字列。varchar(4)最大4バイトの文字列を格納できる|

#PHPから
#**PHPからデータベースに接続**

<FONT color="#ff0000">■PDO()コンストラクタ</font>
**PDO('mysql:host=localhost;dbname=データベース名;charset=utf8','接続するユーザー名','パスワード'**

```php:all.php
<?php
$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8',
	'staff', 'password');
?>
```

```php:connect.phpMySQLのデフォルトポート番号は「3306」です
<?php
try {
	$sql = new PDO ( 'mysql:dbname=takahashi1; host=192.168.1.30;port=3306; charset=utf8', 'takahashi', 'takahashi' );
	print '接続に成功しました。';
} catch ( PDOException $e ) {
	print "接続エラー:{$e->getMessage()}";
}
$sql = null;
?>
```

###**DBへ接続するファイルを外部化**

selfphpフォルダーの中にあるDbManager.php

```php:DbManager.php 
<?php
function getDb() {
	// データベースへの接続を確認
	$pdo = new PDO ( 'mysql:dbname=takahashi1; host=192.168.1.30;port=3306; charset=utf8', 'takahashi', 'takahashi' );
	return $pdo;
}
?>
```

```php:connection_common.php
<?php
require_once 'selfphp/DbManager.php';
$pdo = getDb();
```

###**mysqli()で接続**

```php
$db = new mysqli('192.168.1.30','takahashi','takahashi','takahashi1');
// $db = new mysqli( 'localhost', 'staff', 'password', 'shop' );
if ($db->connect_error) {
	echo $db->connect_error;
	exit ();
} else {
	$db->set_charset ( "utf8" );
	echo 'ok';
}
```

###**クラスに記述した関数(メソッド)と変数(プロパティ)**
|　|クラス内に記述した変数と関数のみ名称が変わる|
|:--|:--|
|プロパティ|クラスに属する変数|
|メソッド|クラスに属する関数|


|　|クラス内に記述したときの名称|
|:--|:--|
|変数|プロパティ|
|関数|メソッド|

```php:クラスを定義する構文
class クラス名 {
	$プロパティ名

	function メソッド名(引数) {
	}
}
```

[参考元サイト](http://qiita.com/7968/items/6f089fec8dde676abb5b)
###**PDOクラスを使用**
PDOクラスを使用するにはPDOのインスタンスを生成する

```php:PDOのインスタンスの生成
$pdo = new PDO(....);
```

$pdo←名前は自由

###**コンストラクタ**
- [x] コンストラクタ、_________________________________              
**コンストラクタ**              
・コンストラクタとはクラスからオブジェクトがnewによって作成される時に自動的に呼び出されるメソッドです。オブジェクト作成時に初期化処理が必要な場合など、コンストラクタ内に記述しておけば自動的に実行してくれます         
_________________________________________________________

■PDO(....)

```php
$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8',
    'staff', 'password');
?>
```

コンストラクタ。
コンストラクタの....の部分には
インスタンスの初期化に用いる引数を書く。
データベースに接続するために必要な引数を記述。
PDO(引数)の引数は<font color="red">DSN</font>と呼ばれている。

<font color=ff0000">▪️DSN</font>
どのサーバーにあるどんなデータベースを使うのかを指定した文字列

###**PHPからSQL文を実行(query)**

```php:PHPからSQLのselect文を実行
$pdo->query('select * from product')
```

###**query**
|　|PHPからSQL文を実行|
|:--|:--|
|<font color="red">SQL文を実行</font>|**PDOの変数->query('SQL文')**|
|<font color="red">メソッドを呼び出す</font>|**変数->メソッド**|
|<font color="red">queryメソッド(関数)</font> |引数に指定したSQL文をデータベースに対して実行する
|<font color="red">->(アロー演算子)</font>|メソッドを呼び出す

- [x] メソッド呼び出し(例)

```php
class CrepeShop {
	public function buy($crepe) {
		$message = '';
		if ($crepe == 'チョコ') {
			$message = $crepe.'は330円です';
		} else if ($crepe == '生クリーム') {
			$message = $crepe.'は270円です';
		} else {
			$message = 'クレープを選択して下さい';
		}
		return $message;
	}
}
$customer = new CrepeShop ();
echo $customer->buy ( '生クリーム' );//生クリームは270円です
echo $customer->buy('チョコ');//チョコは330円です
```

[結果セット](http://takujiro.net/2015/06/24/mysql_002/)

###**PHPで接続したデータベースから情報一覧を表示**

```php:取得したデータを一行ずつ表示する(方法①)
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
foreach ( $pdo->query ( 'select * from product' ) as $row2 ) {
	echo '<p>';
	echo $row2 ['id'], ':';
	echo $row2 ['name'], ':';
	echo $row2 ['price'];
	echo '</p>';
}
?>
```
```php:取得したデータを一行ずつ表示する(方法②)
<?php
$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8',
	'staff', 'password');
foreach ($pdo->query('select * from product') as $row) {
	echo "<p>$row[id]:$row[name]:$row[price]</p>";
}
?>
```

```php:実行結果
1:松の実:700

2:くるみ:270

3:ひまわりの種:210

4:アーモンド:220

5:カシューナッツ:250

6:ジャイアントコーン:180

7:ピスタチオ:310

8:マカダミアナッツ:600

9:かぼちゃの種:180

10:ピーナッツ:150

11:クコの実:400
```

```php:取得したデータを一行ずつ処理する
foreach ( $pdo->query ( 'select * from product' ) as $row2 ) {
}
```

<font color="red">■列のデータを取り出す</font>
**配列['列名']**

[![zu01.jpg](https://qiita-image-store.s3.amazonaws.com/0/95187/1e282af6-4ba3-81e2-5594-1ab51b5e6afd.jpeg)](http://itpro.nikkeibp.co.jp/article/COLUMN/20070209/261546/)

```php:(例)id列のデータを表示
echo $row['id'];//1
```
- [x] <質問>
$pdo->query ( 'select * from product' ) は配列?
foreachは確か、
 配列とオブジェクトをループして使うための制御構文と学びました。_________________________________      
<解答>     
配列では、無いのですが、
 使い易くするために、特別に foreach の反復処理で使える様に作られています。
マニュアルを見ましょう。

http://php.net/manual/ja/pdo.query.php       
_________________________________________________________

```php:方法①
foreach ( $pdo->query ( 'select * from product' ) as $row2 ) {
	echo '<p>';
	echo $row2 ['id'], ':';
	echo $row2 ['name'], ':';
	echo $row2 ['price'];
	echo '</p>';
}
```

[何故$row2['id']ではなく$row2[id]?](http://qiita.com/icelandnono/items/eb150f8b254e4daebed0#%E9%85%8D%E5%88%97%E3%81%A7%E3%81%AE%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84)

```php:方法②
foreach ($pdo->query('select * from product') as $row) {
	echo "<p>$row[id]:$row[name]:$row[price]</p>";
}
```

```php:HTMLの表を使って見やすく表示する
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
foreach ( $pdo->query ( 'select * from product' ) as $row ) {
	echo '<tr>';
	echo '<td>', $row ['id'], '</td>';
	echo '<td>', $row ['name'], '</td>';
	echo '<td>', $row ['price'], '</td>';
	echo '</tr>';
	echo "\n";
}
?>
</table>
```

■実行結果
![20170104.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c92cb557-7088-ae85-a9d5-44c214acdce3.png)

###**htmlspecialcharsでより安全に**
htmlspecialchars関数でJavascriptのタグを無効化

<pre>
htmlspecialchars(&#39;文字列&#39;,エスケープの種類,&#39;文字コード&#39;)
</pre>

|エスケープの種類（方法）|概要|
|:--|:--|
|ENT_COMPAT|ダブルクォートは置き換えるが、シングルクォートは置き換えない|
|ENT_QUOTES|シングルクォートとダブルクォートの両方を置き換える|
|ENT_NOQUOTES|シングルクォートとダブルクォートの両方を置き換えない|

```php:all5.php
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
function h($str) {
	return htmlspecialchars ( $str );
}
foreach ( $pdo->query ( 'select * from product' ) as $row ) {
	echo '<tr>';
	echo '<td>' . h ( $row ['id'] ), '</td>';
	echo '<td>', h ( $row ['name'] ), '</td>';
	echo '<td>', h ( $row ['price'] ), '</td>';
	echo '</tr>';
	echo "\n";
}
?>
</table>
```

```php:例②
<?php
		function h($str) {
			return nl2br ( htmlspecialchars ( $str, ENT_QUOTES, 'UTF-8' ), false );
		}
		?>
		<p class="textstyle">
			■お問い合わせ項目：</br><?php if (isset($_SESSION['object'])){ echo '<font color="black">'.implode("</br>", $_SESSION['object']).'</font>';}?></p>
		<p class="textstyle">
			■お問い合わせ内容：</br><?php if(isset($_SESSION['contactContent'])){echo h($_SESSION['contactContent']).'</font>';}?>
?>
```

```php:方法①
function h($str) {
    return htmlspecialchars ( $str, ENT_QUOTES | ENT_HTML5, 'UTF-8' );
}
```

```php:方法②
function e($str, $charset = 'UTF-8') {
    return htmlspecialchars ( $str, ENT_QUOTES | ENT_HTML5, $charset );
}
```

###**htmlspecialcharsで対策していないと。。。**

例
MySQLに商品のデータを追加
<pre>
mysql> insert into product values(null, '<script>alert("A")</script>',100);
</pre>

```php:all5.php
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
foreach ( $pdo->query ( 'select * from product' ) as $row ) {
	echo '<tr>';
	echo '<td>' . $row ['id'], '</td>';
	echo '<td>' . $row ['name'], '</td>';
	echo '<td>' . $row ['price'], '</td>';
	echo '</tr>';
	echo "\n";
}
?>
</table>
```

all5.phpを実行
![20170110.png](https://qiita-image-store.s3.amazonaws.com/0/95187/41121141-7e36-862d-b615-ceb19a875438.png)

OKボタン押下後↓
![201701102.png](https://qiita-image-store.s3.amazonaws.com/0/95187/1b22bd9e-e228-aaed-093a-e088e543be2c.png)

###**htmlspecialchars対策＆PHPで入力値を確認してから商品を追加する**

```php:insert-input2.php
<p>商品を追加します。</p>
<form action="insert-output2.php" method="post">
商品名<input type="text" name="name">
価格<input type="text" name="price">
<input type="submit" value="追加">
</form>
```
![201701116.png](https://qiita-image-store.s3.amazonaws.com/0/95187/101795a4-79d5-e6b8-097b-1e8d92d1c3da.png)
![201701121.png](https://qiita-image-store.s3.amazonaws.com/0/95187/79491ffd-b32d-b521-4abd-6c6c00284c7b.png)

```php:insert-output2.php方法①
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
$sql = $pdo->prepare ( 'insert into product values(null, ?, ?)' );
$err = array ();
if (empty ( $_REQUEST ['name'] )) {
	$err ['name'] = '商品名を入力してください。';
}
if ((preg_match ( '/^[a-zA-Z]+$/', $_REQUEST ['name'] ) || preg_match ( "/^[一-龠]+$/u", $_REQUEST ['name'] )) && ! strlen ( $_REQUEST ['name'] ) == 0) {
	$err ['name'] = '商品名はひらがな又はカタカナで入力してください。';
}
if (empty ( $_REQUEST ['price'] )) {
	$err ['price'] = '価格を入力してください。';
} else if (! preg_match ( '/[0-9]+/', $_REQUEST ['price'] ) && ! strlen ( $_REQUEST ['price'] ) == 0) {
	$err ['price'] = '商品価格は整数で入力してください。';
}
if (count ( $err ) >= 1) {
	if (isset ( $err ['name'] )) {
		echo $err ['name'].'</br>';
	}
	if (isset ( $err ['price'] )) {
		echo $err ['price'];
	}
}else
if ($sql->execute(
	[htmlspecialchars($_REQUEST['name']), $_REQUEST['price']]
))
{
	echo '追加に成功しました。';
} else {
	echo '追加に失敗しました。';
}
?>
<p>
	<button onclick="history.back()">戻る</button>
</p>
```

```php:insert-output2.php方法②
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
$sql = $pdo->prepare ( 'insert into product values(null, ?, ?)' );
$err = array ();
function h($str) {
	return htmlspecialchars ( $str );
}
if (empty ( $_REQUEST ['name'] )) {
	$err ['name'] = '商品名を入力してください。';
}
if ((preg_match ( '/^[a-zA-Z]+$/', $_REQUEST ['name'] ) || preg_match ( "/^[一-龠]+$/u", $_REQUEST ['name'] )) && ! strlen ( $_REQUEST ['name'] ) == 0) {
	$err ['name'] = '商品名はひらがな又はカタカナで入力してください。';
}
if (empty ( $_REQUEST ['price'] )) {
	$err ['price'] = '価格を入力してください。';
} else if (! preg_match ( '/[0-9]+/', $_REQUEST ['price'] ) && ! strlen ( $_REQUEST ['price'] ) == 0) {
	$err ['price'] = '商品価格は整数で入力してください。';
}
if (count ( $err ) >= 1) {
	if (isset ( $err ['name'] )) {
		echo $err ['name'] . '</br>';
	}
	if (isset ( $err ['price'] )) {
		echo $err ['price'];
	}
}else
if ($sql->execute(
	[h($_REQUEST['name']), $_REQUEST['price']]
))

{
	echo '追加に成功しました。';
} else {
	echo '追加に失敗しました。';
}
?>
<p>
	<button onclick="history.back()">戻る</button>
</p>
```

![201701112.png](https://qiita-image-store.s3.amazonaws.com/0/95187/919f3143-1a40-7133-1bef-ed54b4dff9d8.png)
![201701113.png](https://qiita-image-store.s3.amazonaws.com/0/95187/1c0b5e65-e629-ea38-3e6d-5f0feb3beb4b.png)
![201701115.png](https://qiita-image-store.s3.amazonaws.com/0/95187/252b2f4d-cdfb-7e6b-0571-fcecab916039.png)

###**htmlentities()**
この関数はhtmlspecialchars()と同じですが、 HTML エンティティと等価な意味を有する文字をHTMLエンティティに変換します。 

###**商品データを検索するP206**
![2017011003.png](https://qiita-image-store.s3.amazonaws.com/0/95187/66d0bc2c-f137-6503-75ae-9f930a90364c.png)
![201702061.png](https://qiita-image-store.s3.amazonaws.com/0/95187/88ab561e-eb08-254c-6f26-5aaab6e87427.png)


```php:search-input.php
商品名を入力してください。
<form action="search-output.php" method="post">
<input type="text" name="keyword">
<input type="submit" value="検索">
</form>
```

```php:search-output.php
<?php require 'header.php'; ?>
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>商品価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
// ?の部分には後から好きな値を設定することが出来る
$sql = $pdo->prepare ( 'select * from product where name=?' );
$sql->execute([$_REQUEST['keyword']])
;
foreach ( $sql->fetchAll () as $row ) {
	echo '<tr>';
	echo '<td>', $row ['id'], '</td>';
	echo '<td>', $row ['name'], '</td>';
	echo '<td>', $row ['price'], '</td>';
	echo '</tr>';
	echo "\n";
}
?>
</table>
<?php require 'footer.php'; ?>
```
![20170105.png](https://qiita-image-store.s3.amazonaws.com/0/95187/82b807dd-af72-cfb8-7c3c-3f338537872c.png)

|||
|:--|:--|
|**PDOの変数->query('SQL文')**|<font color="red">引数に指定したSQL文をデータベースに対して実行する</font>|
|**PDOの変数->prepare('SQL文')**|<font color="red">SQL文を実行する準備をする</font>|
|**変数->execute([値])**|<font color="red">SQL文の実行|
|**foreach(PDOの変数->fetchAll() as 結果を代入する変数)**|<font color="red">結果を1行ずつ取得して、変数$rowに代入する</font>

###**prepareメソッド**
|||
|:--|:--|
|**PDOの変数->prepare('SQL文')**|<font color="red">SQL文を実行する準備をする</font>|
![20170106.png](https://qiita-image-store.s3.amazonaws.com/0/95187/460ff792-c5db-1dea-4831-405633dc69e0.png)
[prepareメソッド](http://www.phpbook.jp/tutorial/pdo/index8.html)
PDOStatement::execute() メソッドによって実行される SQL文を準備する。
SQL文は、文が実行されるときに実際の値に置き換えられる疑問符(?)やパラメーターマーク等を含むことができる。
![201701062.png](https://qiita-image-store.s3.amazonaws.com/0/95187/833b32c1-d319-bc55-5921-7aa068ac5f6f.png)
![201601063.png](https://qiita-image-store.s3.amazonaws.com/0/95187/594bc5b4-9022-c970-a4c3-d4a0cacc293c.png)
![201701064.png](https://qiita-image-store.s3.amazonaws.com/0/95187/24112331-ffda-02c7-9259-491b14eba725.png)

prepareメソッドの引数には、SQL文を文字列で指定する。
SQL文のなかに「<font color="red">**?**</font>」を含めることができ、
<font color="red">**「?」の部分には後から好きな値を設定することが出来る。**</font>

```php:select文で取得したテーブルのなかからwhere句で指定した条件に一致する行を取得する
select * from product where name=?
```

```php
$pdo->prepare('select * from product where name=?')
```

###**executeメソッド**
|||
|:--|:--|
|**変数->execute([値])**|<font color="red">prepareメソッドに引数として渡したSQL文を実行する|
![201701065.png](https://qiita-image-store.s3.amazonaws.com/0/95187/11e182aa-adfa-3bda-3f05-b763dea0135f.png)

```php
$sql->execute([$_REQUEST['keyword']]);
```

executeメソッドの引数には、
SQL文のなかの「?」部分に設定する値を配列にして渡す。
配列にするのは、1つのSQL文内に複数箇所の?を配置することができるから。
![201701201.png](https://qiita-image-store.s3.amazonaws.com/0/95187/39738154-da06-83e6-150e-6f046ffc452b.png)
![201701202.png](https://qiita-image-store.s3.amazonaws.com/0/95187/1b949b0d-10d5-55be-5173-406f28d40bc6.png)

- [x] <font color="pink">複数の?がある場合_______________________________</font>
![2017011010.png](https://qiita-image-store.s3.amazonaws.com/0/95187/127b7d15-5494-73f1-c180-2d3e4557d495.png)

**変数->execute([値])**

・複数の?がある場合は、外側を[]で囲み、
複数の値を「,」で区切って
[値, 値, ...]のように並べる。
?が1個だけの場合には[値]のように外側を[]で囲むだけ。

```php:ここではkeywordという名前のリクエストパラメータを使う
$_REQUEST['keyword']
```

```php:[]で囲んで配列にする
$sql->execute([$_REQUEST['keyword']]);
```

```php
select * from product where name=?
```

```php:↑のようなSQL文に入力欄に入力した商品名が設定されて、↓のようなSQL文となって実行される。
select * from product where name=`カシューナッツ`
```
     
<font color="pink">_________________________________________________________</font>
![201701066.png](https://qiita-image-store.s3.amazonaws.com/0/95187/dcd914a2-f8fb-7b90-376a-674146ddaca2.png)

![20170223.png](https://qiita-image-store.s3.amazonaws.com/0/95187/a854792a-a8be-70ab-2496-85f885cae624.png)
![201702231.png](https://qiita-image-store.s3.amazonaws.com/0/95187/6e529ef8-11df-9c22-2f21-c439f276a91c.png)

####**executeはqueryで取得可能**

executeメソッドで実行した結果はfetchAllで 
取得しなくてもいい場合がある。
結果セットのPDOStatement型データを返すので、 
それを一行ずつ$rowに格納してforeach()ループで一行ずつ読み出しているので問題ありません。 

一度に結果全行を読み出すのと、 
 結果一行ずつすべて読むのとどう違うかというと、 
 全行読み出すとき結果のレコード数が数千数万だったりすると、 
 結果を溜め込むまで一見処理が止まってしまいます。 
 （メモリ的リソースもきつくなります。） 
 一行ずつ読み出すと、順々にHTML出力ができて止まらず出力し続けられます。 
 （溜め込まないため軽く動かせるはず。）
(executeメソッドで実行した結果はqueryで取得できる)[https://teratail.com/questions/67076]

|||
|:--|:--|
|**query**|結果一行ずつすべて読む
|**fetchAll()**|結果データを全件まとめて配列で取得

--

###**exec()メソッド**

|||
|:--|:--|
|**exec()**|SQLステートメントを実行し、作用した行数を返す。PDOオブジェクトに対して実行可能な、PHPからSQLを実行するためのメソッド。
|**execute()**|PDOStatementのインスタンスに対して実行可能な、prepareメソッドで用意したSQL文を実行するメソッド。

[exec()とexecute()の違い](http://takuo4649design.com/weblog/note/archives/7524)

###**fetchAllメソッド**
![2017011004.png](https://qiita-image-store.s3.amazonaws.com/0/95187/b44bc6e7-3be7-0431-29d6-c36e0c1bbd28.png)

|||
|:--|:--|
|**foreach(PDOの変数->fetchAll() as 結果を代入する変数)**|SQL文をexecuteメソッドで実行した結果を取得する
|**fetch()**|1件データを取得
|**fetchAll()**|結果データを全件まとめて配列で取得

###**PHPから商品データを追加する**
![201701109.png](https://qiita-image-store.s3.amazonaws.com/0/95187/4a8a4a80-ee5e-516b-3730-107069008f1e.png)

```php:テーブルの最後に「ローストピーナッツ」が追加されている
mysql> select * from product;
+----+--------------------+-------+
| id | name               | price |
+----+--------------------+-------+
|  1 | 松の実             |   700 |
|  2 | くるみ             |   270 |
|  3 | ひまわりの種       |   210 |
|  4 | アーモンド         |   220 |
|  5 | カシューナッツ     |   250 |
|  6 | ジャイアントコーン |   180 |
|  7 | ピスタチオ         |   310 |
|  8 | マカダミアナッツ   |   600 |
|  9 | かぼちゃの種       |   180 |
| 10 | ピーナッツ         |   150 |
| 11 | クコの実           |   400 |
| 13 | バターピーナッツ   |   200 |
| 14 | ローストピーナッツ |   220 |
+----+--------------------+-------+
```

|||
|:--|:--|
|**PDOの変数->prepare('SQL文')**|<font color="red">SQL文を実行する準備をする</font>|
|**変数->execute([値])**|<font color="red">SQL文の実行|
|**foreach(PDOの変数->fetchAll() as 結果を代入する変数)**|<font color="red">結果を1行ずつ取得して、変数$rowに代入する</font>

```php:insert-input.php
<p>商品を追加します。</p>
<form action="insert-output.php" method="post">
商品名<input type="text" name="name">
価格<input type="text" name="price">
<input type="submit" value="追加">
</form>
```

```php:insert-output.php方法①
<?php
$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8',
	'staff', 'password');
$sql=$pdo->prepare('insert into product values(null, ?, ?)');
if ($sql->execute([$_REQUEST['name'], $_REQUEST['price']])) {
	echo '追加に成功しました。';
} else {
	echo '追加に失敗しました。';
}
?>
```

```php:insert-output.php方法②
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
$sql = $pdo->prepare ( 'insert into product values(null, ?, ?)' );
if ($sql->execute ( array (
		$_REQUEST ['name'],
		$_REQUEST ['price']
) )) {
	echo '追加に成功しました。';
} else {
	echo '追加に失敗しました。';
}
?>
```

###**type属性をhiddenにする**
![201701123.png](https://qiita-image-store.s3.amazonaws.com/0/95187/2e3b975a-df31-1087-5f5f-eaf21b16d040.png)
隠しデータを送信することができる。
ユーザーには見せる必要のない隠し情報をフォーム内に埋め込むことができる。　この情報は、ブラウザ上には表示されない。
[hidden](http://www.newcredge.com/IT/www/html/tag/form/input-type-hidden.html)

```php:type="hidden"なので画面には表示されない
echo '<input type="hidden" name="id" value="', $row['id'], '">';
```

![201701124.png](https://qiita-image-store.s3.amazonaws.com/0/95187/7aeea1e7-883a-37b2-4518-578b9887bf90.png)

###**PHPから商品データを更新する**

```php:update-input.php
<?php require 'header.php';?>
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>商品価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
foreach ( $pdo->query ( 'select * from product' ) as $row ) {
	echo '<tr><form action="update-output.php" method="post">';
	// type="hidden"にすることでフォームに商品番号を含めつつも編集できないようにしている
	echo '<input type="hidden" name="id" value="', $row ['id'], '">';
	echo '<td>', $row ['id'], '</td>';
	echo '<td>';
	echo '<input type="text" name="name" value="', $row ['name'], '">';
	echo '</td>';
	echo '<td>';
	echo '<input type="text" name="price" value="', $row ['price'], '">';
	echo '</td>';
	echo '<td><input type="submit" value="更新"></td>';
	echo '</form></tr>';
	echo "\n";
}
?>
</table>
<?php require 'footer.php';?>
```

```php:update-output.php
<?php require 'header.php';?>
<?php

$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
$sql = $pdo->prepare ( 'update product set name=?, price=? where id=?' );
$err = array ();
function h($str) {
	return htmlspecialchars ( $str );
}
if (empty ( $_REQUEST ['name'] )) {
	$err ['name'] = '商品名を入力してください。';
}
if ((preg_match ( '/^[a-zA-Z]+$/', $_REQUEST ['name'] ) || preg_match ( "/^[一-龠]+$/u", $_REQUEST ['name'] ) || preg_match ( '/[0-9]+/', $_REQUEST ['name'] )) && ! strlen ( $_REQUEST ['name'] ) == 0) {
	$err ['name'] = '商品名はひらがな又はカタカナで入力してください。';
}
if (empty ( $_REQUEST ['price'] )) {
	$err ['price'] = '価格を入力してください。';
} else if (! preg_match ( '/[0-9]+/', $_REQUEST ['price'] ) && ! strlen ( $_REQUEST ['price'] ) == 0) {
	$err ['price'] = '商品価格は整数で入力してください。';
}
if (count ( $err ) >= 1) {
	if (isset ( $err ['name'] )) {
		echo $err ['name'] . '</br>';
	}
	if (isset ( $err ['price'] )) {
		echo $err ['price'];
	}
}else
	if($sql -> execute(
		[h($_REQUEST['name']),
		$_REQUEST['price'], $_REQUEST['id']]
))


{
	echo '更新に成功しました。';
}else {
		echo '更新に失敗しました。';
}
?>
<p>
	<button onclick="history.back()">戻る</button>
</p>
<?php require 'footer.php';?>
```

![201701132.png](https://qiita-image-store.s3.amazonaws.com/0/95187/37c19950-a382-6e95-2da3-5679eb823071.png)

###**PHPから商品データを削除する**
![201701161.png](https://qiita-image-store.s3.amazonaws.com/0/95187/776f7b93-50ed-f93e-c244-ec2197ef9c09.png)
![201701163.png](https://qiita-image-store.s3.amazonaws.com/0/95187/eb3d5a29-8f22-23de-04eb-85938120fdbb.png)

```php:test16.php
<p>
	<a href="test16-output.php?id=1&name=値">次に</a>
</p>
```

```php:test16-output.php
<?php
$id = $_GET ['id'];
$name = $_GET ['name'];
echo $id . "<br/>";
echo $name;
?>
```

```php:実行結果
1
値
```

```php:delete-input2.php
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>商品価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
foreach ( $pdo->query ( 'select * from product' ) as $row ) {

	echo '<tr>';
	echo '<td>', $row ['id'], '</td>';
	echo '<td>', $row ['name'], '</td>';
	echo '<td>', $row ['price'], '</td>';
	echo '<td>';
	echo '<a href="delete-output2.php?id=', $row ['id'], '">削除</a>';
	echo '</td>';
	echo '</tr>';
	echo "\n";
}
?>
</table>
```

```delete-output2.php
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
$sql = $pdo->prepare ( 'delete from product where id=?' );

if ($sql->execute([$_REQUEST['id']]))
{
	echo '削除に成功しました。';
} else {
	echo '削除に失敗しました。';
}
?>
<p>
	<button onclick="history.back()">戻る</button>
</p>
```

![201701172.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c9d1a31b-149a-d46f-455f-88f7bd45e079.png)

###**PHPから商品データを削除する②**

```php:delete-input.php
<table>
	<tr>
		<th>商品番号</th>
		<th>商品名</th>
		<th>商品価格</th>
	</tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
foreach ( $pdo->query ( 'select * from product' ) as $row ) {

	echo '<tr>';
	echo '<td>', $row ['id'], '</td>';
	echo '<td>', $row ['name'], '</td>';
	echo '<td>', $row ['price'], '</td>';
	echo '<td>';
	echo '<form action="delete-output.php" method="post"><input type="hidden" name="id" value="'.$row['id'].'"><input type="submit" value="削除"  name="submit"></form>';
	echo '</td>';
	echo '</tr>';
	echo "\n";
}

?>
</table>
```

```php:delete-output.php
<?php

// var_dump ( $_POST );
// var_dump($_POST['id']);
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
$sql = $pdo->prepare ( 'delete from product where id=?' );
// is_numeric→変数が数値または数値文字列かどうか調べる
// is_string→文字列型かどうか調べる関数
// 条件?TRUEの場合の返却値:FALSEの場合の返却値;
$id = isset ( $_POST ['id'] ) ? $_POST ['id'] : '';
// $id = isset($_POST['id']) && is_string($_POST['id'])?$_POST['id']:'';
// array→配列を生成する。
if($sql->execute([$id])){
// if ($sql->execute ( array ($id) )) {
	echo '削除に成功しました。';
} else {
	echo '削除に失敗しました。';
}
// var_dump(array ($id));
?>
<p>
	<button onclick="history.back()">戻る</button>
</p>
```

![20170123.png](https://qiita-image-store.s3.amazonaws.com/0/95187/2470f4fb-fa96-01f0-9279-93adddfb6841.png)

###**PHP5.4以前**
![201701201.png](https://qiita-image-store.s3.amazonaws.com/0/95187/39738154-da06-83e6-150e-6f046ffc452b.png)
![201701202.png](https://qiita-image-store.s3.amazonaws.com/0/95187/1b949b0d-10d5-55be-5173-406f28d40bc6.png)

```php:PHP5.4以降の書き方login-output.php
<?php
session_start();
unset($_SESSION['customer']);
$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8', 
	'staff', 'password');
$sql=$pdo->prepare('select * from customer where login=? and password=?');
$sql->execute([$_REQUEST['login'], $_REQUEST['password']]);
foreach ($sql->fetchAll() as $row) {
	$_SESSION['customer']=[
		'id'=>$row['id'], 'name'=>$row['name'], 
		'address'=>$row['address'], 'login'=>$row['login'], 
		'password'=>$row['password']];
}
if (isset($_SESSION['customer'])) {
	echo 'いらっしゃいませ、', $_SESSION['customer']['name'], 'さん。';
} else {
	echo 'ログイン名またはパスワードが違います。';
}
?>
```

```php:PHP5.4以前の書き方login-output.php
<?php
session_start ();
unset ( $_SESSION ['customer'] );
$pdo = new PDO ( 'mysql:host=localhost;dbname=takahashi1;charset=utf8', 'takahashi', 'takahashi' );
$sql = $pdo->prepare ( 'select * from customer where login=? and password=?' );
$sql->execute ( array (
		$_REQUEST ['login'],
		$_REQUEST ['password']
) );
foreach ( $sql->fetchAll () as $row ) {
	$_SESSION ['customer'] = array (
			'id' => $row ['id'],
			'name' => $row ['name'],
			'address' => $row ['address'],
			'login' => $row ['login'],
			'password' => $row ['password']
	);
}
if (isset ( $_SESSION ['customer'] )) {
	echo 'いらっしゃいませ、', $_SESSION ['customer'] ['name'], 'さん。';
} else {
	echo 'ログイン名またはパスワードが違います。';
}
?>
```

##PDO(PHP Data Objects)
PDOはクラスの一種。
様々なデータベース(DBMS)を簡単に利用できるようにする、PHPの拡張機能。※拡張→新しい部品などを取り付けて機能を追加する
PDOを使うことで、DBMSの違いを吸収し、
異なるDBMSに対して同じプログラムで
同じ処理をさせることが出来る。
MySQL以外に、Oracle、SQLiteなど様々なデータベース(DBMS)があり、DBMS、それぞれデータベースを使うときのプログラムの書き方が違うから
使うデータベースを変えるとPHPのプログラムを修正する手間がかかる。
これを回避するためにPHPとDBMSの間に抽象化レイヤを挟んでそれぞれさまざまなデータベースの違いを
このレイヤで吸収し、さまざま違うデータベースに同じプログラムで同じ処理をできるようにする
それがPDOの機能。
MySQLへの接続をする関数→mysql_connect関数
PostgreSQLへの接続をする関数→pg_connect関数
システムをMySQLからPostgreSQLに移行するときにプログラムを書き換えないといけない。この手間を防ぐのに<font color=red>抽象化レイヤ(PDO)</font>が使われる。
抽象化レイヤ(PDO)を使えば、どんなデータベースでも
mysql_connect関数で接続できる

[PDOクラス](http://php.net/manual/ja/book.pdo.php)
[PDO説明](http://www.technotype.net/tutorial/tutorial.php?fileId=%7BPHP%7D&sectionId=%7Bdatabase-access-with-php%7D)



##パラメーター
媒介変数、補助変数、母数、引数、設定値などの意味を持つ英単語。
プログラミングでは、関数やメソッドなどが呼び出し元から渡された値を受け取るための変数のことをパラメータという。この意味では仮引数と訳されることもある。

##エミュレーション
特定のコンピューターやOS向けに開発されたプログラムを、異なる環境のコンピューターで使うこと。一般的には、OSなどが異なる環境では、プログラムを共用できない。プログラムを異なる環境で動かしたいときは、プログラムの一部やすべてを書き換えてつくり直す必要があり、これを移植という。エミュレーションでは、基本的にはプログラムを書き換えずに、エミュレーターというソフトウェアを介して、疑似的に別のコンピューターの環境を作り出すことで、プログラムを動作させる

##エミュレーター
機械を真似る機械。
ある機械部品やソフトウェアを動作させるのに、オリジナルのシステムを用意するのが難しい場合に、オリジナルと全く同じ動作をするより簡便なシステムを用意することがある。この装置をエミュレータと言う。

##bindParam
指定された変数名にパラメーターをバインド(関連付ける)する

</body>
</html>
[参考になるページ](http://www.technotype.net/tutorial/tutorial.php?fileId=%7BPHP%7D&sectionId=%7Bdatabase-access-with-php%7D)

[パラメーター](http://e-words.jp/w/パラメータ.html)
[エミュレーション](http://yougo.ascii.jp/caltar/エミュレーション)