snippet: php

## HTML文字列をタグごとに配列に格納

```php
<?php
$htmlString = '<div>要素1</div><p>要素2</p><a href="#">要素3</a>';

// HTML文字列をタグごとに分割
$tags = preg_split('/<\/?[^>]+>/', $htmlString, -1, PREG_SPLIT_NO_EMPTY);

// 結果の表示
print_r($tags);
```

## バックトレースログを表示

```php
<?php
$trace = debug_backtrace();
foreach($trace as $line) {
    echo sprintf("%s: line %d<br>", $line["file"], $line["line"]);
}
```

もしくは

```php
<?php
debug_print_backtrace();
```

## var_exportをファイルに保存

* /tmp/1671500221 に出力

```php
$fp = fopen('/tmp/'.time(), 'a+');
fputs($fp, var_export($_POST, true));
fclose($fp);
```


## httpsからのアクセスかを判別する

```php
<?php
if ($_SERVER["HTTP_X_SSL_CIPHER"]) {
    return "https";
}
return "http";
```

## 数字を含む配列のソート

```php
natsort($array);
```

## IEか判定

```php:IE6〜IE11まで対応。
if (!preg_match('/(Trident|MSIE)/', $_SERVER['HTTP_USER_AGENT'])) {
    // edge, chrome, safari, firefoxなど
} else {
    // ieです
}
```

## CSVダウンロード

* CPU,メモリをあまり消費しない方法。

```php
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=output.csv");
$fp = fopen("php://output","w");
$data = array();

//見出し
$line = array();
$line[] = "title";
$line[] = "memo";
$line[] = "updated_at";
$data[] = $line;

foreach($dbdata as $key=>$val) {
	$line = array();
	$line[] = $val["title"];
	$line[] = $val["memo"];
	$line[] = $val["updated_at"];
	$data[] = $line;
}
foreach($data as $datum){
	fputcsv($fp, $datum, ',' ,'"');
}
fclose($fp);
die();
```

## make testが大量のFAILの場合、selinuxが無効を確認

* /etc/selinux/config

`SELINUX=disabled`
reboot

## ファイル一覧取得

```php:
function get_file_list($path = './files/') {
        $files = array();
        foreach (scandir($path) as $key=>$val) {
                if (substr($val,-3) != "png") continue;
                $files[] = $val;
        }
        return $files;
}
```

# UserAgent判定

* [ガラケーとIE6〜10を除外したい場合、UserAgentに Gecko が無いことで判定すればよさそう - Qiita](http://qiita.com/tukiyo3/items/a1b3dea2cd19f93a07e1)

```php
function is_office() {
	$office = array("192.168.10.2","22.22.22.22");
	if (! in_array($_SERVER['REMOTE_ADDR'], $office)) {
		return false;
	}
	return true;
}
```

# ファイルのupload

## 素のphp

* [PHP: POST method uploads - Manual](http://php.net/manual/en/features.file-upload.post-method.php#example-354)

tmpフォルダを777で作っておく。

```html:index.html
<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
  <input type=submit />
</form>
```

```php:upload.php
<?php
if ($file = $_FILES['file']) {
    $target = __DIR__ . "/tmp/" . $file['name'];
    move_uploaded_file($file['tmp_name'], $target);
    echo "upload success.";
} else {
    echo "upload failure.";
}
```


## dropzone.js

* [Dropzone.js](http://www.dropzonejs.com/#installation)

![Selection_011.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a5f5e617-a107-bebf-5a14-c151f8306ea9.png)


```bash:
git clone https://github.com/enyo/dropzone.git
```

```html:indexdropzone.php
<link rel="stylesheet" type="text/css" href="dropzone/dist/basic.css">
<link rel="stylesheet" type="text/css" href="dropzone/dist/dropzone.css">
<script src="dropzone/dist/dropzone.js"></script>

<ul>
<?php
echo sprintf("<li>upload limit: %s", ini_get("upload_max_filesize"));
echo sprintf("<li>post limit: %s", ini_get("post_max_size"));
?>
</ul>

<form action="upload.php" class="dropzone">
    <div id="dropzone"></div>
</form>
```

upload.php は上で準備したものでよい。
ドラグアンドドロップでuploadが完了する。

----

# 日付を曜日に変換

* [PHP: date - Manual](http://php.net/manual/ja/function.date.php)

```php:
$yymmdd = "2015-12-23";

$weekno = date("N", strtotime($yymmdd))-1;
$weeks = array("mon", "tue", "wed", "thu", "fri", "sat", "sun");
echo $weeks[$weekno];
```

## 一週間後の日付取得

```php:
$dtime = strtotime("+1 week");
echo date("Y-m-d" ,$dtime);
```

----

# セッションについて

* [PHP: session_save_path - Manual](http://php.net/manual/ja/function.session-save-path.php)
* [Cookieとセッションをちゃんと理解する(PHP) - Qiita](http://qiita.com/hiroshi_takezawa/items/07136ad74127999df271)

```bash:sessionは以下に保存される
$ grep session.save_path /etc/php5/cli/php.ini
;session.save_path = "/var/lib/php5/sessions"
```

* /var/lib/php5/sessions/
  * sess_FIXED
 
* [PHP - 参考にならないほどシンプルな掲示板 - Qiita](http://qiita.com/fernet/items/dbe469195647ff591a27)の一部を抜粋すると

```php:FIXEDというIDを指定
session_id('FIXED');
```

こうすると `/var/lib/php5/sessions/sess_FIXED`にデータが保存される。
以下のような形式で保存される。

```bash:/var/lib/php5/sessions/sess_FIXED
log|a:5:{i:0;s:3:"お";i:1;s:3:"え";i:2;s:3:"う";i:3;s:3:"い";i:4;s:6:"ああ";}#
```

```php:
session_start();
if (($msg = (string)filter_input(INPUT_POST, 'msg')) !== '') {
  $_SESSION['log'][] = $msg;
  $_SESSION['log'] = array_slice($_SESSION['log'], -100);
```

* [memcachedを利用して、複数サーバのセッションを共有化 | ナビさんの日記とか。](http://navi-local.com/article/memcached%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E8%A4%87%E6%95%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%85%B1%E6%9C%89%E5%8C%96/)
* [PHPセッションをmemcachedで管理する件 - Qiita](http://qiita.com/supertaihei02/items/53e36252afa3ea157d38)
* [#9 phpのsession storeをredisにする - rrreeeyyy.com](http://rrreeeyyy.com/blog/2012/06/12/9-php-session-store-redis/)

* その他メモ
    * 別サイトであるならCookieが使えない。
    * サブドメイン同士なら、有効範囲を同一ドメインまで許せばよい...
    * 独自のドメインなら可能性がありますが、レンタルサーバなどでは有り得ない
    * セッション情報をクッキーに持たせるなりNFSやデータベースに持たせる