PHP/phpbook/network

Last-modified: 2010-10-20 (水) 18:44:53

BASIC認証


<?php
$user = 'admin';
$password = 'pass';

//isset(Is Set?)関数は変数がセットされているかをチェックする関数
//$_SERVERはヘッダ、パスなどを保持する定義済みの配列変数
//この中のPHP_AUTH_USERがセットされていれば、初めてのアクセスとなる

if (!isset($_SERVER['PHP_AUTH_USER'])){

  //headerは生のヘッダをクライアントへ返す関数で、
  //下記のようなヘッダをクライアントへ送信すると
  //クライアント側のブラウザで認証画面が表示される
  header('WWW-Authenticate: Basic realm="Private Page"');
  header('HTTP/1.0 401 Unauthorized');

  die('このページを見るにはログインが必要です');

}else{
  if ($_SERVER['PHP_AUTH_USER'] != $user || $_SERVER['PHP_AUTH_PW'] != $password){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');
    die('このページを見るにはログインが必要です');
  }
}

?>

 余談だが、実体はクライアント側のリクエストの
 「Authorization」ヘッダが入っているか否かをチェックしていて、
 クライアントからの接続が初めてのときは通常は入っていない
  ※これはPHPに限った話ではなく、BASIC認証一般の話

クッキー

クッキーの保存

 <?php
    $flag = setcookie("visited", 1);
 ?>

 $flagがTUREなら正常に実行された

クッキーの読み込み

 $val = $_COOKIE["クッキーの名前"]

 クッキーが書き込まれていない可能性もあるので、isset関数と併せて使う

 例)


if (isset($_COOKIE["visited"])){
   $count = $_COOKIE["visited"] + 1;
}else{
   $count = 1;
}

setcookieの第3引数は有効期限

 $flag = setcookie("visited", $count, time() + 180);

  
 time()で現在時刻を取得し、そこからの有効な時間を + する
 単位は秒

クッキーの削除

 クッキーを削除するためには、有効期限を昔の時間に設定することで削除可能

 setcookie("visited", $count, time() - 1800);

多くのクッキーを利用する場合

 setcookieを複数回使用することで、複数個のクッキーを送ることができる。

 しかし、クライアントが1つのサーバから受け取ることが出来る
 クッキーは最大20個、全体でも合計300個までのクッキーしか保持できないことになっている。

 その為、多くのクッキーを利用したい場合には以下のように配列を使う

  setcookie("buy[1]", "Televison");
  setcookie("buy[2]", "Video");
  setcookie("buy[3]", "Audio");

 取り出すときは、以下のようにすればOK

  $val = $_COOKIE['cookie'];

  print($val[1]);
  print($val[2]);
  print($val[3]);

 ※キーは負でもOKであることを確認した

セッション

セッションの開始

 <?php
    session_start();
 ?>

 これだけで、以下のことをしてくれる

 1)セッションIDの発行を行ってくれる(クッキー名はPHPSESSID)
 2)発行済みであれば(クッキーにPHPSESSEDがあれば)、セッションの準備をするだけ
   ⇒再び、1)の処理を行わないということ
 3)セッションIDはちゃんとランダムな文字列

 セッションが開始されているかを知りたければ、
 以下のようにしてチェックすればOK

 if (!isset($_COOKIE["PHPSESSID"]))

セッション変数

 クッキーと似ているが、サーバー側に保存されるのが違う。
 $_SESSION["visited"] = 1;

セッション変数の削除

 unset($_SESSION("visited"));

 空の配列を「$_SESSION」変数に格納すると、セッション変数を全削除可能

 $_SESSION = array();

 セッション変数の全削除は、ログアウト時などに有効
 ちなみに、ログアウト時は、

 1)ユーザーのクッキーも削除しておく
  if (isset($_COOKIE["PHPSESSID"])) {
     setcookie("PHPSESSID", '', time() - 1800, '/');
  }

 2)セッションに登録されたデータをすべて破棄する
   session_destroy();

セッション名

  1. クッキー名として利用される名前(デフォルトではPHPSESSID)は、php.iniで設定されている。
     
  2. プログラム中で取得する場合には、 session_name 関数を使う
    session_name( [string name] );
    引数なし:セッション名取得、引数あり:セッション名の変更

セッションIDの取得

 session_id();で取得可能
 引数を設定するとセッションIDを変更できるが非推奨。

 内容は、$_COOKIE[session_name()]と一致する。

セッションIDの自動変更

 session_regenerate_id();

 で、現在のセッションを終了することなくセッションIDだけを新しい値に
 置き換えてくれる。

 引数の中身は、TRUEなら古いセッション情報を削除する。
 デフォルトはFALSEだが、TRUEにしたほうがよい
 (資源とセキュリティの観点から)

MySQL

MySQLへの接続と切断

 mysql_connect関数をもちいる。
 成功した場合は、MySQLのリンクIDを返し、失敗した場合はFALSEを返す

 $link = mysql_connect('127.0.0.1:3306', 'user', 'pass');
 if (!$link) {
   die('接続失敗です。'.mysql_error());
 }

 ※exitやdieはphpスクリプトを終了させるコマンド
 ※これに関しても、phpMyAdmin同様、'localhost'では、アクセスできなかった。

 切断は以下の通り

 mysql_close($link);

 

データベースの選択

 $db_selected = mysql_select_db('uriage', $link);
 if (!$db_selected){
  die('データベース選択失敗です。'.mysql_error());
 }

データの取得

 SELECT自体はmysql_query関数を使うだけでいいのだが、
 返り値のresource型の変数(UPDATEやDELETEの場合は、戻り値はTRUE,FALSEの成否フラグ)
 からデータを抽出する関数が必要 
 #print_r($result);ではダメ ←リソースのIDが表示されるだけ

 $result = mysql_query('SELECT * FROM xxxx');
 if (!$result) {
     die('クエリーが失敗しました。'.mysql_error());
 }

 データの抽出には、mysql_fetch_assoc関数をもちいる。
 カラム名を連想配列のキーにした形で値が取得できる。

 while ($row = mysql_fetch_assoc($result)) {
  print($row['id']);
  print($row['name']);
 }

 ※文字化けが起こった場合は、mysql_set_charsetをもちいて、
  MySQL側と文字セットを合わせる。
  mysql_set_charset('cp932');

データの挿入

 INSERTは、通常にmysql_queryでOK
 ただし、文字セットが違うと、インサートが失敗するようだ。
 (失敗するか、文字化けするかは、MySQLやPHPのバージョンによって違う?)

 $sql = "INSERT INTO shouhin (id, name) VALUES (4, 'プリンター')";
 $result_flag = mysql_query($sql);

 if (!$result_flag) {
  die('INSERTクエリーが失敗しました。'.mysql_error());
 }

パラメータのエスケープ

 SQLインジェクション攻撃などを防ぐ為に、パラメータをエスケープする必要がある。

 ※デフォルトで、マジッククォートという設定項目がONになっていて、
  「"」 → 「\"」 のようなエスケープを自動で行ってくれる設定になっている。
  しかし、マジッククォートはOFFにして、mysql_real_escape_string( '文字列' )関数を使うことが推奨されている

使用例)

function quote_smart($value)
{
    // 数値以外をクオートする
    if (!is_numeric($value)) {
        $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
}

$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
quote_smart($_POST['username']),
quote_smart($_POST['password']));

mysql_query($query);

UPDATE, DELETE

 mysql_queryに渡せばOK.戻り値はTRUE(成功)かFALSE(失敗)

PDO( PHP Data Objects )

 MySQL, PostgreSQL,...などどのデータベースを使っているかを
 隠ぺいしてくれるシステムで、PHP5.1以降で標準で利用可能

 php.iniの設定が必要
 クラスなので、オブジェクトをnewして使う
 

メール

 php.iniの設定が必要
 mail関数でメールを送ることができる。

 $to = 'you@example.jp';
 $subject = 'test mail'; ←メールタイトル
 $message = "This is Test mail\nMulti Line";
 $message = wordwrap($message, 70, "\n");
 $headers = 'From: my@example.jp';

 mail($to, $subject, $message, $headers);
  1. ※各行の長さは 70 文字を超えてはいけないことになっている為、
     「wordwrap」関数を用いて70文字以上含まれる行は改行する
  2. ※「additional_headers」は省略可能だが「php.ini」ファイルで
     「sendmail_from」を設定していない場合には「From」ヘッダの記述が必要

フォーム

●フォームのデータ

 PHPの定義済み変数から取得する

 $_GET
 $_POST
 $_SESSION
 $_COOKIE

 $_GET['name']のようにして使う。

 余談だが、
 フォームから値を入力すると、数字でも文字列として扱われている