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();
セッション名
- クッキー名として利用される名前(デフォルトではPHPSESSID)は、php.iniで設定されている。
- プログラム中で取得する場合には、 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);
- ※各行の長さは 70 文字を超えてはいけないことになっている為、
「wordwrap」関数を用いて70文字以上含まれる行は改行する - ※「additional_headers」は省略可能だが「php.ini」ファイルで
「sendmail_from」を設定していない場合には「From」ヘッダの記述が必要
フォーム
●フォームのデータ
PHPの定義済み変数から取得する
$_GET $_POST $_SESSION $_COOKIE
$_GET['name']のようにして使う。
余談だが、
フォームから値を入力すると、数字でも文字列として扱われている