PHPでcomposerを使わずにQRコードを作成する

## 内容
**`PHP`のライブラリを使用して簡単なサンプルに作成したQRコードを表示できるようにする**

## 環境

- PHP7

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/a66ad2df-5914-40d0-e994-115a29dc65d4.png)

## QRコードの作成

### 開発環境作成
まずはターミナルなどで作業用のフォルダを作成 & 移動

```
 $ mkdir php_sample
 $ cd php_sample
```

その後、**[phpqrcode/qrlib](http://phpqrcode.sourceforge.net/)** をダウンロードして、解凍。
解凍した中身を作成した作業用フォルダにコピーなどで移す。

そして、3つの`PHP`ファイルを作成する。

- トップページ
- QRコード表示用ページ
- QRコード作成ファイル

実際のフォルダの中身がこんな感じになっているはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/63df06c1-797a-04fd-d2fb-2b50c5a027ae.png)

- トップページ(index.php)
- QRコード表示用ページ(result.php)
- QRコード作成ファイル(create_qr.php)

最後に、`PHP`の内蔵サーバーをターミナルから起動して準備完了。

```
$ php -S 127.0.0.1:8080
```

### phpファイル作成
ここからは3つのphpファイルを作成していく。
#### トップページ
簡単なサンプルで試すだけなので、基本的な`HTML`のコードと`form`くらいで十分。
(本当は`index.php`だけど見た目優先で`html`ファイルとして記入してます。)

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>QR</title>
</head>
<body>
	<p>QRテスト</p>
	<form method="GET" action="result.php">
		<input type="text" name="data">
		<input type="submit" value="QRコードを表示する">
	</form>
</body>
</html>
```

http://127.0.0.1:8080/index にアクセスしてみると、こんなページができてるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/c54139b4-be21-9f28-bea7-e4b31a415c28.png)

#### QRコード表示用ページ

ここもそんなに手をかけずに、`index.php`からの遷移先程度の役割で十分かと。
(`index.php`同様、見た目優先で`html`ファイルとして記入してます。)

```result.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>QR</title>
</head>
<body>
	<h2>QRコード</h2>
	<?php echo '<img src="create_qr.php" />'; ?>
	<br>
	<a href="index">戻る</a>
</body>
</html>
```
http://127.0.0.1:8080/index からフォーム経由で移動しているとこんなページが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/60b983e6-5e46-7061-33b7-75f8e11e4394.png)

**`<?php echo '<img src="create_qr.php" />'; ?>`** でQRコード作成ファイルを指定しているため、記入を忘れたり名前を間違えたりしないように。

#### QRコード作成ファイル

今回の本題。
といっても、`require`でダウンロードしてきた`phpqrcode/qrlib`を呼び出して、そこの関数などを使うくらい。

```create_qr.php
<?php
// ライブラリ読み込み
require_once "phpqrcode/qrlib.php";
 
// 画像の保存場所
$filepath = 'qr.png';
 
// QRコードの内容
$contents = "result.php?data=hogehoge";
 
// QRコード画像を出力
QRcode::png($contents, $filepath, QR_ECLEVEL_M, 6);

//このファイルを画像ファイルとして扱う宣言
header('Content-Type: image/png');
readfile('qr.png');
?>
```

内容はコメントアウトの通り。

この状態で http://127.0.0.1:8080/index からフォーム経由で移動すると、`result?date=`にQRコードが表示されるようになる。
スマートフォンなどで、表示されたQRコードを読み取ってみると、`$contents`の内容であることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/f9e5202c-6d8b-4d72-f38b-1731aa2eddeb.png)

### GETの値をQRコードに反映させる
トップページ(`index.php`)のフォームで入力した値をQRコードで出力できるようにしてみる。

QRコード表示用ページ(`result.php`)で`GET`で受け取った値を含めたURLをQRコード作成ファイル(`create_qr.php`)に渡してあげればOK。

```result.php
<?php
// ライブラリ読み込み
require_once "phpqrcode/qrlib.php";

// URLを定数に設定
$url = 'create_qr.php?data='.$_GET['data'];
?>

<!-- 中略 -->

<body>
	<h2>QRコード</h2>
	<img src="<?php echo $url ?>" />
	<br>
	<a href="index">戻る</a>
</body>
</html>
```

```create_qr.php
// 前略

// QRコードに入れるテキスト
$contents = "result.php?data=".$_GET['data'];
 
// QRコード画像を出力　※詳しくは公式サイトのマニュアルを確認ください。
QRcode::png($contents, $filepath, QR_ECLEVEL_M, 6);

//　後略
```

## 参考資料

- [PHP QR Code - QR code generator, an LGPL PHP library](http://phpqrcode.sourceforge.net/)
- [PHPでロゴ入りのQRコードを作成する方法 │ ジプログ](https://jipulog.com/how-to-qrcode-logo-php/)
- [PHPまとめ - ヘッダー](http://doremi.s206.xrea.com/php/tips/header.html)