PHPでデータを取得する方法

## PHPでデータを取得する6つの方法
1.「スーパーグローバル変数」から受け取る
2.「ファイル」から受け取る
3.「データベース」から受け取る
4.インターネット上の「外部URL」から受け取る
5.「メモリ」から受け取る
6.「標準関数」から受け取る

### 「スーパーグローバル変数」から受け取る　

PHPの主なスーパーグローバル変数
$_GET

$_POST

$_SERVER

$_COOKIE

$_FILES

$_SESSION

<h4>$_GET
<br>
$_POST</h4>

```php.sample
<?php
/* GET送信の受取 */
//$value には「名前」が入っている
$value = isset($_GET['name']) ? $_GET['name']: '';//三項演算子
?>

<form method="get">
<input type="text" name="name" value="名前">
<input type="submit" value="送信">
</form>
```
```php.sample
<?php
/* POST送信の受取 */
//$value には「名前」が入っている
$value = isset($_POST['name']) ? $_POST['name']: '';//三項演算子
?>

<form method="post">
<input type="text" name="name" value="名前">
<input type="submit" value="送信">
</form>
```
スーパーグローバル変数は連想配列なので、キーとなる文字列で値を取り出せます。 連想配列からキーで取得する時、キーが存在しないとエラーが出るためisset()、empty()などでチェックする必要があります。

*「スーパーグローバル変数」- すべてのスコープで使用できる組み込みの変数

<h4>$_SERVER</h4>
$_SERVERにはサーバ情報やページアクセス時の環境情報が入っています。

```
/* ユーザのIPアドレス */
$ip = $_SERVER['REMOTE_ADDR'];

/* メソッド名 GET POST など */
$method = $_SERVER['REQUEST_METHOD'];

/* URLの?以降 */
$query = $_SERVER['QUERY_STRING'];

/* ブラウザ情報 */
$ua = $_SERVER['HTTP_USER_AGENT'];

/* スクリプトのパスと名前 */
$script_path = $_SERVER['SCRIPT_NAME'];

/* 動作サーバのIPアドレス */
$sip = $_SERVER['SERVER_ADDR'];
```

<h4>$_SESSION</h4>
session_start()でセッションを開始した場合にのみ、入力されています。

```
<?php
/* セッション開始 */
session_start();

/* POST送信の時 */
if ($_SERVER['REQUEST_METHOD']=='POST') {

	/* POSTデータをセッションデータに */
	$_SESSION['post'] = $_POST;

} else {

	/* セッションにあるPOSTデータを受け取り */
	$post = $_SESSION['post'];
}
```

### 「ファイル」から受け取る

```
<?php
/* 入力元となるデータファイル */
define('FILE_DATA','bbs.dat');

/* 代入する変数 */
$lines = array();

/* ファイルからデータを一行ずつ受け取る */
$fp = fopen(FILE_DATA,'r');
while($line = fgets($fp)){

	$lines[] = $line;
}
fclose($fp);

/* ファイルからデータを一括で受け取る */
$data = file_get_content(FILE_DATA);

/* ファイルからデータを配列で受け取る */
$lines = file(FILE_DATA);
```

### 「データベース」から受け取る
PHPで開発されたWebアプリケーションでは、主にMySQL、PostgreSQL、SQLiteなどのデータベースが 利用されています。

```
<?php
/* MySQLに接続 */

/* ホスト名設定 */
define('DB_HOST', 'localhost');
/* データベース名 */
define('DB_NAME', '');
/* 接続ユーザー名 */
define('DB_USER', '');
/* 接続パスワード */
define('DB_PASS', '');

/* エラーを代入する変数 */
$ERROR = array();

/* 接続エラーを取得するための記述 */
try {

	/* データベース操作用のオブジェクトを作成 */
	$db = new PDO('mysql:dbname='.DB_NAME.';host='.DB_HOST.';charset=utf8', DB_USER, DB_PASS);

	/* データベースを操作するSQL文 */
	$sql = 'SELECT * FROM posts WHERE category_id=?';
	/* SQL文として渡す入力データ */
	$q = array('100');

	/* SQL文を実行するための準備 */
	$sth = $db->prepare($sql);
	/* SQL文を実行 */
	$sth->execute($q);

	/* データベースからの結果を連想配列の配列で受け取る */
	$r = $sth->fetchAll(PDO::FETCH_ASSOC);

/* 接続エラーの例外を処理 */
} catch(PDOException $e) {

	$ERROR[] = $e->getMessage();
}
```


 <h5>やっている事</h5>
・define() で接続に必要なデータベース設定を定義
<br>
・try{}catch(){} で例外を処理
<br>
・new PDO() でMySQL接続の設定、操作オブジェクトを作成
<br>
・->prepare() でプリペアドステートメントを準備
<br>
・->execute() で入力用の配列でSQL文を実行
<br>
・->fetchAll(PDO::FETCH_ASSOC) SQL文の実行結果を受け取り
<br>
・$e->getMessage() で例外メッセージを取得

### インターネット上の「外部URL」から受け取る

```
<?php
/* URL情報 */
$url = '';

/* URLにGETアクセス */
$data = file_get_contents($url);

/* アクセス時の設定を行ってアクセス */
$opts = array(
	'http'=>array(
		'method'=>'POST',
		'header'=>"Cookie: key=val\r\n",
	)
);
$data = file_get_contents($url, false, stream_context_create($opts));

/* レスポンスのヘッダー確認 */
print_r($http_response_header);
```

### 「メモリ」から受け取る

```
<?php
/* 識別ID　URLなどの一意の文字列 */
$id = '';

/* データの存在確認 */
if (apc_exists($id)) {

	/* キャッシュから取得 */
	$data = unserialize( apc_fetch($id) );

} else {

	/* ここで重い処理を行う */

	/* 重い処理の結果、$dataの連想配列にデータが入っている想定 */
	$data = array();

	/* 変数を有効期限までキャッシュ */
	apc_store($id, serialize($data), 3600);
}

/* ここで $data の表示処理 */

/* 共有メモリの状態を確認する場合 */
print_r(apc_sma_info());

/* キャッシュをすべてクリアする場合 */
apc_clear_cache();

/* 特定のキャッシュを削除する場合 */
apc_delete($id);

/* ファイルを作成せず、メモリ上で処理したい場合 */
$fp = fopen('php://memory','r+');

/* ファイルデータとして処理 */

/* メモリが解放される */
fclose($fp);
```

### 「標準関数」から受け取る

```
<?php
/* タイムゾーンを設定 */
date_default_timezone_set('Asia/Tokyo');

/* 日時の受け取り */
$date = date('Y/m/d H:i:s');//年/月/日 時:分:秒

/* Unixタイムスタンプを取得 */
$time = time();

/* Unixタイムスタンプをマイクロ秒まで取得 */
list($msec, $sec) = explode(' ', microtime());//$msec にマイクロ秒

/* ファイルの更新日時 */
$mtime = filemtime($f);

/* ファイルサイズ */
$size = filesize($f);

/* ファイルタイプ */
$ftype = mime_content_type($f);

/* ファイルのmd5ハッシュ値を取得 */
$md5 = md5_file($f);

/* 一意の英数字を取得 */
$id = uniqid();

/* 文字列の長さ バイト数 */
$len = strlen($txt);
/* 文字列の長さ 文字数 */
$len = mb_strlen($txt);

/* 文字列のmd5ハッシュ値を取得 */
$md5 = md5($str);

/* ランダムな数値 1-100 */
$r = mt_rand(1, 100);

/* コマンドの実行結果 例として df は空き容量確認 */
exec('df -h', $o);
/* 実行結果の確認 */
print_r($o);

/* 指定ディレクトリ内のファイル一覧 */
$files = scandir($dir);
```

参考文献：

https://code-notes.com/lesson/9#i2