PHP 画像あっぷろーど



#**サーバにファイルをアップロードする**
主な流れ★ミ
1. formタグを method="post" enctype="multipart/form-data" で作成（HTMLフォーム側）
2. inputタグを type="file" にしたフィールドを作成（HTMLフォーム側）
3. $_FILESでアップロードされた一時ファイルのデータを受け取る（PHPでの処理側）
4. is_uploaded_file()でファイルがHTTPアップロードされたかどうかを確認（PHPでの処理側）
5. move_uploaded_file()で一時ディレクトリから保存ディレクトリに移動（PHPでの処理側）
:star:<font size="3" color="pink">アップロードされた画像はサーバ内のテンポラリという場所に自動的に入れられる。このテンポラリという場所は一時的なフォルダ。
ファイルがアップロードされると、アップロードされた画像はサーバ内のテンポラリというフォルダに入れられ、そのプログラムが終わるとテンポラリから画像が破棄される。
このため、テンポラリフォルダの中にある画像を新しい画像フォルダを作り、(消えない)画像フォルダに移す必要がある。


[参考元](http://worthliv.com/wlh_post_30.html)
![611801.png](https://qiita-image-store.s3.amazonaws.com/0/95187/7bd4dae8-a4f9-6adf-992a-d97714098257.png)
[参考元](https://thinkit.co.jp/story/2015/06/11/6118)

###**enctype**

|||
|:--|:--|
|<font color="#00BFFF">**enctype**|送信時MIMEタイプを指定。送信時のデータ形式を指定する。|
|<font color="#00BFFF">**MIMEタイプ**|メールやホームページのファイルにくっつけて送られる。「このファイルはこんな種類のファイルだよ」な情報。|
|<font color="#00BFFF">**MIMEタイプの形式**|ファイルの分類/ファイルの種類|
|<font color="#00BFFF">**multipart**|複数のファイルをまとめるための形式。HTTPではフォームへの入力内容とアップロードするファイルをまとめるために使う。|


![d005786-3.png](https://qiita-image-store.s3.amazonaws.com/0/95187/a31ecafc-851e-cdb3-bacd-10843501d573.png)


[参考サイト](http://wa3.i-3-i.info/word15786.html)


##**アップロード用のフォーム【P166】**
ファイルをアップロードするには、以下のような```<form>```タグを記述する。
enctype属性にmultipart/form-dataを指定することがポイント。

```php:
<form action="upload-output.php" method="post" enctype="multipart/form-data">
```

さらに```<input>```タグを記述して、
type属性をfileにする。
これでファイル選択欄が表示される。

```php:
<input type="file" name="file">
```

###**enctype="multipart/form-data"**
<font color="red">■POINT</font>
↓フォームにファイルを送信する機能がある場合に指定する
**enctype="multipart/form-data"**
データをマルチパートデータとして送信する。
フォーム内にファイルの送信欄を配置する場合は、この形式を使う。

|　　　　　　||
|:--|:--|
|<font color="#00BFFF">**マルチパート**|リクエストで複数のフォームデータ(マルチパート)を送るための形式。複数の異なる種類のデータを格納する方式。普通、1ファイルしかアップロードできないが、複数のファイルを同時にアップロードできるようになる。2つ以上のファイルを同時に送れるようになる。|
||具体的には格納データがファイルデータごとにバウンダリ文字というもので区切られ、それぞれのデータを個別に判断できるようになるというもの|
|<font color="#00BFFF">**バウンダリ文字列**|送信する複数のデータの区切りになる文字列|


[参考サイト](http://www.tagindex.com/html_tag/form/form_enctype.html)

###**バウンダリ文字列をみたい**
|　　　　　||
|:--|:--|
|<font color="#00BFFF">**バウンダリ文字列**|送信する複数のデータの区切りになる文字列|

```php:バウンダリ文字列をみてみたい
<form method="post" enctype="multipart/form-data">
<input type="text" name="a" value="123"><br>
<input type="text" name="b" value="456"><br>
<input type="submit" value="go">
</form>

<?PHP
$h=apache_request_headers();
print $h["Content-Type"];
?>
```

|　|　　　　　　　　|
|:--|:--|
|<font color="#00BFFF">**apache_request_headers()**|すべてのHTTPリクエストヘッダを取得する|
|<font color="#00BFFF">**HTTPリクエストヘッダ**|「お願い事やお願い元に関するあれこれ」が書かれている|

HTTPリクエストヘッダにはクライアントからサーバに渡される情報あれこれが設定されている。主にお願いごとにやお願い元に関するあれこれについて。

■まとめ
<font color="red">**HTTPリクエストヘッダ**
HTTPリクエストの部品で『お願い事やお願い元に関するあれこれ』が書かれている

```php:upload-top.php
<?php
if(isset($_FILES)&& isset($_FILES['upfile']) && is_uploaded_file($_FILES['upfile']['tmp_name'])){
	if(!file_exists('upload')){
		mkdir('upload');
	}
	$a = 'upload/' . basename($_FILES['upfile']['name']);
	if(move_uploaded_file($_FILES['upfile']['tmp_name'], $a)){
		$msg = $a. 'のアップロードに成功しました';
	}else {
		$msg = 'アップロードに失敗しました';
	}
}
?>

<?php require 'header.php'; ?>
<h1>アルバム作成：画像アップロード</h1>
<p><form action="upload_top.php" method="post" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" value="読み込み">
</form></p>
<?php
if(isset($msg) && $msg == true){
	echo '<p>'. $msg . '</p>';
}
?>
<a href="upload_top.php">戻る</a>
<?php
$h = apache_request_headers();
var_dump($h["Content-Type"]);
?>
<?php require 'footer.php';?>
```

■実行結果
![screencapture-localhost-picture_upload-upload_top-php-1496122161022.png](https://qiita-image-store.s3.amazonaws.com/0/95187/dfa6d8f4-e8f0-31ae-0ff7-ae9b521a8953.png)

これがバウンダリ文字列
string 'multipart/form-data; boundary=----WebKitFormBoundary1QAhOe7eNI2CDGJm' (length=68)

###**firefoxでバウンダリ文字列をみたい**
三→開発ツール→開発ツールを表示→ウェブコンソール→ネットワーク→POST URL→バウンダリ文字列が見れる

コンソールからネットワークをひらいて
サブミットしてやるとpostしたurlが表示されるので詳細を開いて
「POST」を選択すると「生データ」が表示される。


##**サーバにファイルを送信する**

```html:例
<input type="file" name="gazou">
```
##**ファイルをサーバ上に保存する【P167】**
###**アップロードされたファイルの確認【P168】**
###**テンポラリ**
アップロードされたファイルは、サーバ内の<font color="red">テンポラリ</font>という場所に自動的に格納される。例えば、ファイルをアップロードすると、そのプログラムが始まるときにテンポラリに画像がアップロードされ、<font color="red">プログラムが終わったときにテンポラリから画像が破棄される。</font>
このため、一時的な(消えてしまう)場所にあるテンポラリの画像を画像フォルダに移動する必要がある。
アップロードされたファイルは、一時的なファイルに保存される。
この一時的なファイルのファイル名は、以下の記述で取得可能。

```php:
$_FILES['file']['tmp_name']
```

ここで取得した一時的なファイルが、
入力画面からアップロードされたファイルかどうかを
is_uploaded_fileで調べる。




###**tmp_name**
tmp_nameの中身を知りたくてvar_dumpで調べてみた。
var_dump($_FILES['file']['tmp_name']);
これを追加してみた。
![20170523.png](https://qiita-image-store.s3.amazonaws.com/0/95187/f35c9a95-91f8-23f7-315b-38f8dc2138f0.png)
![201705231.png](https://qiita-image-store.s3.amazonaws.com/0/95187/69499004-68f0-92d7-910f-873d41882ad7.png)



```php:upload-input.php
<p>アップロードするファイルを指定してください。</p>
<form action="upload-output.php" method="post" enctype="multipart/form-data">
<p><input type="file" name="file"></p>
<p><input type="submit" value="アップロード"></p>
</form>
<p>
	<a href="main.php">一覧へ戻る</a>
</p>
```

```php:upload-output.php
<?php
if (is_uploaded_file ( $_FILES ['file'] ['tmp_name'] )) {
	if (! file_exists ( 'upload' )) {
		mkdir ( 'upload' );
	}
	$file = 'upload/' . basename ( $_FILES ['file'] ['name'] );
	if (move_uploaded_file ( $_FILES ['file'] ['tmp_name'], $file )) {
		echo $file, 'のアップロードに成功しました。';
		echo '<p><img src="', $file, '"></p>';
	} else {
		echo 'アップロードに失敗しました。';
	}
} else {
	echo 'ファイルを選択してください。';
}
?>
<p>
	<a href="main.php">一覧へ戻る</a>
</p>
<?php
var_dump($_FILES['file']['tmp_name']);
?>
```

```php:test56-input.php
<form action="test56-output.php" method="post" enctype="multipart/form-data">
<p><input type="file" name="apple"></p>
<p><input type="submit" value="アップロード"></p>
</form>
```

■これでも一応機能する...↓

```php:test56-output.php
<?php
$file = 'upload/'. basename($_FILES['apple']['name']);
move_uploaded_file($_FILES['apple']['tmp_name'], $file);
echo '<p><img src="',$file,'"></p>';
?>
```


###**フォルダの作成**
アップロードされたフォルダを保存するために、
<font color="red">サーバ上にフォルダを作成</font>する。


###**$_FILES**
|||
|:--|:--|
|<font color="#00BFFF">**$_FILES**|POSTメソッドでアップロードしたファイルの情報を格納した多次元配列となる|

``$_FILES``の中身を
var_dump($_FILES)で表示してみた。![201705232.png](https://qiita-image-store.s3.amazonaws.com/0/95187/ebc57f1b-f9ce-021b-f7cb-eba78570aa72.png)




###**is_uploaded_file**
|||
|:--|:--|
|<font color="#00BFFF">**is_uploaded_file(ファイル名)**|HTTP　POSTでアップロードされたファイルかどうかを調べる|
|<font color="#00BFFF">**$_FILES['名前']['tmp_name']**|一時保存ファイル名|

**is_uploaded_file**関数は、
<font color="red">**セキュリティ**</font>のために、
指定したファイルがアップロードされたファイルかどうかを確認する。

###**basename(パス)**
|||
|:--|:--|
|<font color="#00BFFF">**basename(パス)**|パスの最後にある名前の部分を返す|
ファイルorディレクトリへのパスを含む文字列を受け取って、最後にある名前の部分を返す

```php:
echo basename('C:\Users\takahashi');
```


```php:実行結果
takahashi
```

###**move_uploaded_file(一時的なファイル,保存先のファイル)**
|||
|:--|:--|
|<font color="#00BFFF">**move_uploaded_file(一時的なファイル,保存先のファイル)**|アップロードされたファイルを新しい位置に移動する|
|<font color="#00BFFF">**move_uploaded_file(アップロードしたファイル,ファイルの移動先)**||

```php:テンポラリからアルバムフォルダに移動
$file = 'upload/' . basename ( $_FILES ['upfile'] ['name'] );
	if (move_uploaded_file ( $_FILES ['upfile'] ['tmp_name'], $file )) {
```

##**より安全なファイル名に**
先程のプログラムだと、テンポラリからalbumフォルダ内に画像を移動したとき、すでに同じファイル名の画像があると上書きされてしまう。
新しいファイル名をアップロード前のファイル名から付けるのではなく、プログラム側で決めるようにする。
プログラム側で決めるファイル名は
「年月日時分秒」とランダムな数字から成るファイル名にしたい。

###**mt_rand**

||||
|:------------------:|:------------------:|:------------------:|
|<font color="#00BFFF">**mt_rand()**|ランダムな数字を取得する関数。||
|<font color="#00BFFF">**mt_rand(最小値,最大値)**|最小値から最大値までのランダムな数字を返す。|mt_rand(3,10)とすると</br>3から10の間の数字が返ってくる|
ランダムな数字のことを**擬似乱数**という。


###**exif_imagetype(ファイル名)**

||        |
|:------------------:|:------------------:|
|<font color="#00BFFF">**exif_imagetype(ファイル名)**|画像の型を定義する。画像の種類を調べる||

```php:upload-input.php
<?php require 'header.php'; ?>
<p>アップロードするファイルを指定してください。</p>
<form action="upload-output.php" method="post" enctype="multipart/form-data">
<p><input type="file" name="upfile"></p>
<p><input type="submit" value="アップロード"></p>
</form>
<p>
	<a href="main.php">一覧へ戻る</a>
</p>
<?php require 'footer.php';?>
<?php
var_dump(exif_imagetype())
?>
```

```php:■実行結果
string 'image/gif' (length=9)
```

```php:例②
if(exif_imagetype($_FILES['upfile']['tmp_name']) == IMAGETYPE_PNG){
	echo 'PNG';
}
```

こうするとPNGファイルがアップロードされたら、
PNGという文字が出る。

###**exif_imagetypeをvar_dumpしてみた**
```var_dump(exif_imagetype($_FILES['image']['tmp_name']));```

JPGがアップロードされたら
2
PNGだったら
3
GIFがアップロードされたら
1
の数字が
exif_imagetype関数の返り値として返る。

![20170605.png](https://qiita-image-store.s3.amazonaws.com/0/95187/1aff5fef-b6d0-6714-39f6-3c378bc1ebc1.png)


```php:upload2.php
$msg = null;

if(isset($_FILES['image']) && is_uploaded_file($_FILES['image']['tmp_name'])){
$new_name = date('YmdHis');
$new_name .= mt_rand();
switch (exif_imagetype($_FILES['image']['tmp_name'])){

	case IMAGETYPE_JPEG:
		$new_name .= '.jpg';
		break;
	case IMAGETYPE_GIF:
		$new_name .= '.gif';
		break;
	case IMAGETYPE_PNG:
		$new_name .= '.png';
		break;
	default:
		header('Location:upload2.php');
		exit();
}
var_dump(exif_imagetype($_FILES['image']['tmp_name']));
	if(move_uploaded_file($_FILES['image']['tmp_name'], 'album/'.$new_name)){
		$msg = 'アップロードしました。';
	}else {
		$msg = 'アップロードできませんでした。';
	}
}
```

###**ソースコード**
1つのファイルのみで処理を書くやり方

```php:upload-top.php
<?php
$msg = null;
// もし$_FILES['upfile']があって、一時的なファイル名の$_FILES['upfile']が
// POSTでアップロードされたファイルだったら
if(isset($_FILES['upfile']) && is_uploaded_file($_FILES['upfile']['tmp_name'])){
	$old_name = $_FILES['upfile']['tmp_name'];
// 	もしuploadというフォルダーがなければ
	if(!file_exists('upload')){
		mkdir('upload');
	}
	$new_name = date("YmdHis"); //ベースとなるファイル名は日付
	$new_name .= mt_rand(); //ランダムな数字も追加
	switch (exif_imagetype($_FILES['upfile']['tmp_name'])){
		case IMAGETYPE_JPEG:
			$new_name .= '.jpg';
			break;
		case IMAGETYPE_GIF:
			$new_name .= '.gif';
			break;
		case IMAGETYPE_PNG:
			$new_name .= '.png';
			break;
		default:
			header('Location: upload.php');
			exit();
	}
// 	もし一時的なファイル名の$_FILES['upfile']ファイルを
// 	upload/basename($_FILES['upfile']['name'])ファイルに移動したら
	$gazou = basename($_FILES['upfile']['name']);
	if(move_uploaded_file($old_name, 'upload/'.$new_name)){
		$msg = $gazou. 'のアップロードに成功しました';
	}else {
		$msg = 'アップロードに失敗しました';
	}
}
?>

<?php require 'header.php'; ?>
<h1>アルバム作成：画像アップロード</h1>
<p><form action="upload_top.php" method="post" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" value="読み込み" name="yomikomi">
</form>
</p>
<?php
if(isset($msg) && $msg == true){
	echo '<p>'. $msg . '</p>';
}
?>
<a href="upload_top.php">戻る</a>
<?php require 'footer.php';?>
```


##**アップロードの際にエラー**
###**Warning: mkdir(): Permission denied in**

会社のサーバから実行しようとしてアップロードをクリックしたらこんなエラーが出た。

Warning: mkdir(): Permission denied in /home/takahashi/public_html/upload-output.php on line 6 Warning: move_uploaded_file(upload/img_12.jpg): failed to open stream: No such file or directory in /home/takahashi/public_html/upload-output.php on line 9 Warning: move_uploaded_file(): Unable to move '/tmp/phpjNvAQj' to 'upload/img_12.jpg' in /home/takahashi/public_html/upload-output.php on line 9 アップロードに失敗しました。


httpd(Apache等)に実行権限が無ければディレクトリを作る事は出来ないらしい。。
作成したいディレクトリの親ディレクトリの実行権限を確認しないといけないみたいです。

#**まとめ(ソースコード)**
##**1つのファイルのみで書くソースコード**

```php:upload_top.php
<?php
$msg = null;
// もし$_FILES['upfile']があって、一時的なファイル名の$_FILES['upfile']が
// POSTでアップロードされたファイルだったら
if(isset($_FILES['upfile']) && is_uploaded_file($_FILES['upfile']['tmp_name'])){
// 	もしuploadというフォルダーがなければ
	if(!file_exists('upload')){
		mkdir('upload');
	}
	$new_name = date("YmdHis");
	$a = 'upload/' . basename($_FILES['upfile']['name']);
// 	もし一時的なファイル名の$_FILES['upfile']ファイルを
// 	upload/basename($_FILES['upfile']['name'])ファイルに移動したら
	if(move_uploaded_file($_FILES['upfile']['tmp_name'], $a)){
		$msg = $a. 'のアップロードに成功しました';
	}else {
		$msg = 'アップロードに失敗しました';
	}
}
?>

<?php require 'header.php'; ?>
<h1>アルバム作成：画像アップロード</h1>
<p><form action="upload_top.php" method="post" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" value="読み込み" name="yomikomi">
</form>
</p>
<?php
if(isset($msg) && $msg == true){
	echo '<p>'. $msg . '</p>';
}
?>
<a href="upload_top.php">戻る</a>
<?php require 'footer.php';?>
```

##**ソースコード**
先程のソースのコメントアウトなしバージョン

```php:upload.php
<?php
$msg = null;

if (isset ( $_FILES ['upfile'] ) && is_uploaded_file ( $_FILES ['upfile'] ['tmp_name'] )) {
	$old_name = $_FILES ['upfile'] ['tmp_name'];
	if (! file_exists ( 'upload' )) {
		mkdir ( 'upload' );
	}
	$new_name = date ( "YmdHis" );
	$new_name .= mt_rand ();
	switch (exif_imagetype ( $_FILES ['upfile'] ['tmp_name'] )) {
		case IMAGETYPE_JPEG :
			$new_name .= '.jpg';
			break;
		case IMAGETYPE_GIF :
			$new_name .= '.gif';
			break;
		case IMAGETYPE_PNG :
			$new_name .= '.png';
			break;
		default :
			header ( 'Location: upload.php' );
			exit ();
	}
	$gazou = basename ( $_FILES ['upfile'] ['name'] );
	if (move_uploaded_file ( $old_name, 'upload/' . $new_name )) {
		$msg = $gazou . 'のアップロードに成功しました';
	} else {
		$msg = 'アップロードに失敗しました';
	}
}
?>
<?php require 'header.php';?>
<h1>アルバム作成：画像アップロード</h1>
<p>
<form action="upload_top.php" method="post"
	enctype="multipart/form-data">
	<input type="file" name="upfile"> <input type="submit" value="読み込み"
		name="yomikomi">
</form>
</p>
<?php
if (isset ( $msg ) && $msg == true) {
	echo '<p>' . $msg . '</p>';
}
?>
<a href="upload.php">戻る</a>
<?php require 'footer.php';?>
```

![20170601.png](https://qiita-image-store.s3.amazonaws.com/0/95187/6401e8f5-a51f-75ba-091e-74bb747904e2.png)

#**画像フォルダ内の画像を一覧表示**
#**アルバム**
主な流れ★ミ
1. opendir()でディレクトリを開く
　 ディレクトリハンドルを作成。
2. readdir()でファイル名を取得する
.  ディレクトリハンドルをループで回してファイルを取得。
3. readdir()ではファイル名を一つしか取得しないのでループさせる
4. ファイル名が「0」とかの可能性を考慮しておく
5. ファイル名以外にも「.」と「..」が帰ってくるので必要に応じて対応
6. closedir()でディレクトリハンドルを閉じる


:star:<font size="3" color="pink">
###**opendir**
opendir(ディレクトリへのパス)
ディレクトリハンドルをオープンする
opendir(ディレクトリへのパス)は引数に指定したフォルダを開き、<font color="red">ディレクトリハンドル</font>を返す。
opendirはフォルダを開くのに成功すると
戻り値としてディレクトリハンドル(フォルダハンドル)を返す。
<font color="blue">**戻り値⇒ディレクトリハンドル(フォルダハンドル)**</font>


|　　　　　　||
|:--|:--|
|<font color="#00BFFF">**opendir(フォルダ名)**|指定したディレクトリをオープンにする/ディレクトリハンドルをオープンにする|
|<font color="#00BFFF">**ディレクトリハンドル**|ディレクトリを操作するためのもの|


###**ディレクトリとファイルの違い**
|　　　　　　||
|:--|:--|
|<font color="#00BFFF">**ディレクトリ**|中に何かを入れられる|
|<font color="#00BFFF">**ファイル**|中に何も入れられない|

###**readdir**
readdir(ディレクトリハンドル名)
開かれたフォルダ直下のファイルを取り出すのは、
readdir関数の役割。

readdir関数はファイル名を全て取得したらfalseを返す。
false以外にも0や空文字を返す可能性がある。
ディレクトリから次のファイルのファイル名を返す。
ファイル名はファイルシステムで格納されている順番で返される。

|　　　　　　||
|:--|:--|
|<font color="#00BFFF">**readdir**|ディレクトリハンドルからエントリを読み込む|
|<font color="#00BFFF">**エントリ**|記入(事項)、見出し、登録(者)、参加(者)、出品(物)、入場、入会、入り口、などの意味を持つ英単語|

###**closedir**
closedir(ディレクトリハンドル名)
引数で指定したディレクトリハンドルを閉じる
ディレクトリを閉じる

###**readdirで取得されたファイル名一覧が入った変数をvar_dumpしてみた**
![screencapture-localhost-picture_upload-album2-php-1496912362499.png](https://qiita-image-store.s3.amazonaws.com/0/95187/21bc6820-d642-680f-4e8c-b1e53bfadcb6.png)



###**ファイルハンドル**
今どのファイルを処理しているかを管理するための名前のこと。
ファイルの読み込みや書き込みをするには、まずファイルを開いてファイルハンドルに関連付けし、そのファイルハンドルを操作するのが基本手順になる。

###**ディレクトリハンドル**
何処のフォルダを開いているかを示すためのもの。
該当ディレクトリ内のファイルアクセス位置を示すもの。
当該ディレクトリ内のファイルアクセス位置を示すもの。
前回アクセスしたファイルの位置が削除しない限り残っている。
あるディレクトリにアクセスしたときに取得(初回は先頭位置のファイル)される。

###**わからなかったこと**

###**ソースコード**

```php:album2.php
<?php
$images = array ();

// albumフォルダをオープンにする
// $handleにディレクトリハンドルが入っている
// opendir(フォルダ名)⇒戻り値ディレクトリハンドル
if ($handle = opendir ( './album' )) {
// readdir(ディレクトリハンドル)⇒指定したディレクトリのファイル一覧を取得する
// ファイル名をどんどん取得する
	while ( $entry = readdir ( $handle ) ) {
		// 現在のディレクトリの.or..を除いた全てのファイル名リストを
		// $imagesに格納している
		if ($entry != "." && $entry != "..") {
// $entry⇒readdirで取得したファイル名が沢山格納されている。
// それを$images配列に格納。
			$images [] = $entry;
		}
	}
	// ディレクトリハンドルをクローズする
	closedir ( $handle );
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xm1ns="http://www.w3.org/1999/xhtml">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript">


<title>アルバム</title>
<style type="text/css">
<!--
html,body {
	background-color: transparent;
	scrollbar-arrow-color: #ffccff;
	scrollbar-face-color: #ffcccc;
	scrollbar-3dlight-color: #ffffff;
	scrollbar-darkshadow-color: #ffcccc;
	scrollbar-highlight-color: #ff9999;
	scrollbar-shadow-color: #ff9999;
	scrollbar-track-color: #ffffff;
}

-->

p#submit_btn {
	text-align: center;
	font-family: "あずきフォント";
}

.content {
	/* 	margin-left: 137px; */
	margin-top: 0px;
	font-size: 95%;
	font-weight: bold;
	font-family: "あずきフォント";
/* 	color: #6c2735; */
	color: #f3b3e6;
}

.form {
	color: white;
	background-color: #9FD6D2;
	text-align: center;
	/* 	padding-left: 370px; */
	padding-top: 5px;
	padding-bottom: 5px;
	font-weight: bold;
	font-size: 95%;
	width: 825px;
	font-family: "あずきフォント";
}

.textform {
	margin-left: 68px;
}

.textform_postalCode {
	margin-left: 30px;
}

.textstyle {
	font-size: 95%;
/* 	color: #6c2735; */
	color: #f7c2c2;
	font-weight: bold;
	font-family: "あずきフォント";
}

.required {
	font-size: 87%;
	font-weight: normal;
	color: red;
	font-family: "あずきフォント";
}

#heading {
/* 	border-left: 10px solid #6c2735; */
/* 	border-bottom: medium solid #6c2735; */
 	border-left: 10px solid #6c2735;
 	border-bottom: medium solid #f7c2c2;
 	color: #f7c2c2;
/* 	color: #cc528b; */
	font-family: "あずきフォント";
    -ms-font-feature-settings: "normal";
}
/* 送信ボタン */
input[type="submit"] {
	padding: 10px 20px;
	border: none;
	/*  background: #9FD6D2; */
	background: #f7c2c2;
	color: #fff;
	font-family: "あずきフォント";
}

/* 送信ボタン - マウスオーバー時 */
input[type="submit"]:hover {
	/*  background: #54A9BD; */
	background: #ff9b9f;
	font-family: "あずきフォント";
}

/* 送信ボタン - 押せないとき */
input[type="submit"][disabled] {
	background-color: #ccc;
	cursor: default;
	font-family: "あずきフォント";
}

input.example,select {
	width: 250px;
	font-family: "あずきフォント";
}
.title_a{
	color: #f7c2c2;
	font-weight: bold;
	font-family: "あずきフォント";
}
textarea {
	width: 480px;
	font-family: "あずきフォント";
}
.styled-select select {
   background: transparent;
   width: 268px;
   padding: 5px;
   font-size: 16px;
   line-height: 1;
   border: 0;
   border-radius: 0;
   height: 34px;
   -webkit-appearance: none;
   }
/* select{ */
/* 	color: white; */
/* 	background-color: #f3b3e6; */
/* } */
/* カーソルをあてた時に変わる色 */
input:focus,select:focus,textarea:focus {
  	background-color: #f7c2c2;
/* 	background-color: #f2dae8; */
	font-family: "あずきフォント";
	border:solid 1px #cc528b;
}
/*検索ボタン*/
input[type="button"] {
	background: #f7c2c2;
	color: white;
	/*   width: 55px; */
	height: 30px;
	border: 0;
	line-height: 30px;
	font-family: "あずきフォント";
}

input[type="button"]:hover {
	background: #ff9b9f;
	height: 30px;
	color: #fff;
	border: 0;
	cursor: pointer;
	font-family: "あずきフォント";
}

input[type="button"].disabled {
	background: #f7c2c2;
	cursor: default;
}

input[type="button"].disabled:hover {
	background: #f7c2c2;
	font-family: "あずきフォント";
}
/* @font-face { */
/* font-family: あずきフォント; */
/* src: url(azuki.ttf) format("truetype"); */
/* 	 url(azuki.woff) format("woff"); /* Modern Browsers */ */
/* } */
@font-face{
    font-family: 'あずきフォント'; /* お好きな名前に */
    src: url('azuki.eot'); /* IE9以上用 */
    src: url('azuki.eot?#iefix') format('embedded-opentype'), /* IE8以前用 */
        url('azuki.woff') format('woff'), /* モダンブラウザ用 */
        url('azuki.ttf') format('truetype'); /* iOS, Android用 */
}
.stepBar {
  position: relative;
  list-style: none;
  margin: 0 0 1em;
  padding: 0;
  text-align: center;
  width: 100%;
  overflow: hidden;
  *zoom: 1;
  font-family: "あずきフォント";
}
.stepBar .step {
  position: relative;
  float: left;
  display: inline-block;
  line-height: 40px;
  padding: 0 40px 0 20px;
  background-color: #eee;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}
.stepBar .step:before, .stepBar .step:after {
  position: absolute;
  left: -15px;
  display: block;
  content: '';
  background-color: #eee;
  border-left: 4px solid #FFF;
  width: 20px;
  height: 20px;
}
.stepBar .step:after {
  top: 0;
  -moz-transform: skew(30deg);
  -ms-transform: skew(30deg);
  -webkit-transform: skew(30deg);
  transform: skew(30deg);
}
.stepBar .step:before {
  bottom: 0;
  -moz-transform: skew(-30deg);
  -ms-transform: skew(-30deg);
  -webkit-transform: skew(-30deg);
  transform: skew(-30deg);
}
.stepBar .step:first-child {
  -moz-border-radius-topleft: 4px;
  -webkit-border-top-left-radius: 4px;
  border-top-left-radius: 4px;
  -moz-border-radius-bottomleft: 4px;
  -webkit-border-bottom-left-radius: 4px;
  border-bottom-left-radius: 4px;
}
.stepBar .step:first-child:before, .stepBar .step:first-child:after {
  content: none;
}
.stepBar .step:last-child {
  -moz-border-radius-topright: 4px;
  -webkit-border-top-right-radius: 4px;
  border-top-right-radius: 4px;
  -moz-border-radius-bottomright: 4px;
  -webkit-border-bottom-right-radius: 4px;
  border-bottom-right-radius: 4px;
}
.stepBar .step.current {
  color: #FFF;
  background-color: #6c2735;

  font-family: "あずきフォント";
}
.stepBar:hover{
  background-color:#DEC8B1';
}
.stepBar .step.current:before, .stepBar .step.current:after {
  background-color: #6c2735;
    onmouseover="style.background='#DEC8B1'";
  onmouseout="style.background='#6c2735'";
  	font-family: "あずきフォント";
}
.stepBar.step2 .step {
  width: 50%;
}
.stepBar.step3 .step {
  width: 33.333%;
}
.stepBar.step4 .step {
  width: 25%;
}
.stepBar.step5 .step {
  width: 20%;
}
div.img-move a:hover {
 position: relative;
 top: -1px;
 left: -1px;
}
div.img-move a:active {
 position: relative;
 top: 5px;
 left: 5px;
}
</style>
</head>
<body>
<h1 class="title_a">アルバム</h1>
<p class="textstyle">
<a href="upload2.php">写真をアップロードする</a>
</p>
<?php
// もしファイル名一覧リストが格納された$imagesが0以上だったら
// もしファイル名が$imagesに入っていたら
if (count ( $images ) > 0) {
	// $valueという変数に入れる
	foreach ( $images as $value ) {
		echo '<img src="./album/' . $value . '">';
	}
// もしファイル名が$imagesに入ってなかったら
} else {
	echo '<p class="textstyle">画像はまだありません。</p>';
}
?>
</body>
</html>
```

#**ページング処理**
###**array_chunk**
|　　　　　　||
|:--|:--|
|<font color="#00BFFF">**array_chunk(分割したい配列,分割数)**|配列を分割する|
|<font color="#00BFFF">****||

```php:array_chunkの例
$input_array = array('a', 'b', 'c', 'd', 'e','f','g','h','i','j');
var_dump($input_array);
$num = 3;
var_dump(array_chunk($input_array, $num));
```

```php:var_dumpで表示
array (size=10)
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  2 => string 'c' (length=1)
  3 => string 'd' (length=1)
  4 => string 'e' (length=1)
  5 => string 'f' (length=1)
  6 => string 'g' (length=1)
  7 => string 'h' (length=1)
  8 => string 'i' (length=1)
  9 => string 'j' (length=1)

array (size=4)
  0 => 
    array (size=3)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string 'c' (length=1)
  1 => 
    array (size=3)
      0 => string 'd' (length=1)
      1 => string 'e' (length=1)
      2 => string 'f' (length=1)
  2 => 
    array (size=3)
      0 => string 'g' (length=1)
      1 => string 'h' (length=1)
      2 => string 'i' (length=1)
  3 => 
    array (size=1)
      0 => string 'j' (length=1)
```

###**intval**
intval() 引数に指定した値を整数値(integer)に変換する関数
[intval](http://qiita.com/icelandnono/items/d46b051eea4af2f75b57#intval%E9%96%A2%E6%95%B0)

###**count**
配列の要素数を取得する

- [x] **多次元配列はカウントされない**_________________________________                           
・デフォルトだと、多次元配列の場合、
一次元の要素のみがカウントされます。              
_________________________________________________________


```php:$imagesをvar_dump
array (size=3)
  0 => 
    array (size=3)
      0 => string '20170209.png' (length=12)
      1 => string 'aikon171.gif' (length=12)
      2 => string 'haneg3.gif' (length=10)
  1 => 
    array (size=3)
      0 => string 'hanem4.gif' (length=10)
      1 => string 'hanep3.gif' (length=10)
      2 => string 'i-_-_dora13.gif' (length=15)
  2 => 
    array (size=1)
      0 => string 'searchlogo.png' (length=14)

```

```php:var_dump(count($images));したら
int 3
```
とでた

```php:album-2.php
<?php
  $images = array();  // 画像ファイル名のリストを格納する配列
  $num = 3; // 1ページに表示する画像の枚数

  // 画像フォルダから画像ファイル名を読み込む
  if ($handle = opendir('./upload2')){
    while ($entry = readdir($handle)){
      // 「.」および「..」でないとき、ファイル名を配列に追加
      if ($entry != "." && $entry != ".."){
        $images[] = $entry;
      }
    }
    closedir($handle);
  }
?>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>交流サイト：アルバム</title>
</head>
<body>
  <h1>交流サイト：アルバム</h1>
  <p>
    <a href="index.php">トップページに戻る</a>
    <a href="upload-2.php">写真をアップロードする</a>
  </p>
  <?php
    if (count($images) > 0){
      // 指定枚数ごとに画像ファイル名を分割
      $images = array_chunk($images, $num);
      // ページ数指定、基本は0ページ目を指す
      $page = 0;
      // GETでページ数が指定されていた場合
      // URLを書き換えて、文字列が送られてくることもあるから、
      // 対策として送られてきた値が$_GET['page']で数字であるかチェックしている
      if (isset($_GET['page']) && is_numeric($_GET['page'])){
        $page = intval($_GET['page']) - 1;
        if (!isset($images[$page])){
          $page = 0;
        }
      }

      // 画像の表示
      foreach ($images[$page] as $img){
        echo '<img src="./upload2/' . $img . '">';
      }

      // ページ数リンク
      echo '<p>';
      for ($i = 1; $i <= count($images); $i++){
        echo '<a href="album-2.php?page=' . $i . '">' . $i . '</a>&nbsp;';
      }
      echo '</p>';
    } else {
      echo '<p>画像はまだありません。</p>';
    }
  ?>
</body>
</html>
<?php
var_dump(count($images));
var_dump($images)
?>
```

![screencapture-localhost-test-album-2-php-1497317639800.png](https://qiita-image-store.s3.amazonaws.com/0/95187/14e7e43c-80dd-011f-5f8e-e952a4e09463.png)

[count](https://syncer.jp/Web/PHP/Reference/Function/count/#section-3)