PHP のスニペット集

このページは、PHP のスニペットをまとめたページです。

ダウンロード

<?php
$file = 'モンキー.gif'; // ファイルパス (フォルダパスを含めても可)
$name = mb_substr(mb_strrchr('/' . str_replace('\\', '/', $file), '/'), 1); // (ダウンロードファイル名。basename()だとロケール等によって正常に取得できない場合がある)

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $file = mb_convert_encoding($file, 'SJIS-win', 'UTF-8'); // サーバがWindowsの場合SJISに変換

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($name)); // エンコード
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));

    while (ob_get_level() > 0) ob_end_clean(); // バッファクリア
    readfile($file);
    exit;
}
?>
  • php.netのサンプル に以下を追加しています。
    • サーバーが Windows の場合ファイルパスを SJIS に変換 (file_exists() が false になるのを防ぐ。プログラムと他のサーバーの文字エンコーディングは UTF-8 想定です)
    • ファイル名が日本語でも対応できるようにする (filename* 形式。IE9以降のブラウザでは基本的に対応されています)
    • 出力バッファ (output_buffering の設定や ob_start()) が有効な場合でもダウンロードができるようにするようにバッファクリアする
      (出力バッファ有効時に容量の大きなファイルを readfile するとダウンロード時に出力バッファが詰まってダウンロードファイルのサイズが0バイトになる)

簡易的なBasic認証

.htaccess で Basic 認証ができない場合(サーバーで制限されている場合等)でBasic認証したいときに使用します。

<?php
// IDとパスワード(平文)を「:」で区切ってセットして下さい。複数IDで認証したい場合は「,」で区切って下さい。
// 例: define('BASIC_AUTH_PASSWORD', 'test:testpw,test2:test2pw');
define('BASIC_AUTH_PASSWORD', 'test:test,test2:test2');
 
function basic_auth() {
    // http://stackoverflow.com/questions/3663520/php-auth-user-not-set
    // CGIモードの場合、.htaccessに下記を記述して下さい (CGIだとPHP_AUTH_**がセットされない)
    //     RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    if (substr(php_sapi_name(), 0, 3) == 'cgi' && isset($_SERVER['HTTP_AUTHORIZATION'])) {
        list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
            explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
    }
 
    $user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : '';
    $pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
 
    $auth = false;
    $pairs = preg_split('/\s*,\s*/', BASIC_AUTH_PASSWORD);
    foreach ($pairs as $pair) {
        list($u, $p) = preg_split('/\s*:\s*/', $pair);
        if ($user == $u && $pass == $p) {
            $auth = true;
            break;
        }
    }
 
    if (!$auth) {
        header('WWW-Authenticate: Basic realm=\'INPUT USER/PW\'');
        header('HTTP/1.0 401 Unauthorized');
        echo '認証に失敗しました。';
        exit;
    }
}
basic_auth();
?>
以下にBASIC認証後のHTMLなどを記載します。非公開領域に置いたファイルを readfile() してきてもよいです。

その他

(主にフレームワークなどを使う必要が無い小さなプログラム用の関数です)

htmlspecialchars の簡易版

htmlspecialchars(), echo htmlspecialchars() と打つのが長いため、h(), eh() で呼び出せるようにします。

/**
 * 値をHTMLエスケープします。
 * @param mixed $value 対象文字列
 * @return mixed 変換された文字列
 */
function h($value, $encoding = 'UTF-8') { return htmlspecialchars($value, ENT_QUOTES, $encoding); }
/**
 * 値をHTMLエスケープして出力します。
 * @param mixed $value 対象文字列
 * @return mixed 変換された文字列
 */
function eh($value, $encoding = 'UTF-8') { echo h($value, $encoding); }

WordPress にある checked() の超簡易版

ラジオボタンやチェックボックスの checked (checked="checked") を書く煩わしさを軽減するためのものです。

/**
 * 真になる値の場合、checkedを出力します(ラジオボタン、チェックボックス用)。
 * @param mixed $v
 */
function checked($v) { if ($v) echo ' checked="checked" '; }

// 例: $x の値によってラジオボタンのチェックを変える
// <input type="radio" name="x" value="1" <?php checked($x == 1) ?>>
// <input type="radio" name="x" value="2" <?php checked($x == 2) ?>>
// <input type="radio" name="x" value="3" <?php checked($x == 3) ?>>
  • WordPressの場合、例と同じ形で出力するには checked($x, 1, true)checked($x == 1, true, true) とする必要があります。

WordPress にある selected() の超簡易版

プルダウンの selected (selected="selected") を書く煩わしさを軽減するためのものです。

/**
 * 真になる値の場合、selectedを出力します(select用)。
 * @param mixed $v
 */
function selected($v) { if ($v) echo ' selected="selected" '; }

// 例: $x の値によって<select>のチェックを変える
// <select name="x">
//     <option value="1" <?php selected($x === '1') ?>>1</option>
//     <option value="2" <?php selected($x === '2') ?>>2</option>
//     <option value="3" <?php selected($x === '3') ?>>3</option>
// </select>
  • WordPressの場合、例と同じ形で出力するには selected($x, 1, true)selected($x == 1, true, true) とする必要があります。

リダイレクト

header("Location: ..."); を書く煩わしさを軽減するためのものです。

/**
 * 指定されたパスにリダイレクトします。
 * @param string $url URL
 * @param mixed $args 追加引数 
 */
function redirect($url, $args = null) {
	if (!is_null($args)) {
		$query = http_build_query($args, '', '&'); // 追加の引数がある場合、クエリとして追加します。
		$url = $url . '?' . $query;
	}
	header('Location: ' . $url);
	exit;
}

// 例:
// redirect('http://example.com/');
// redirect('http://example.com/', array('param' => 'value'));