Yasuのブログ

北海道の大学生Yasuが、ライティングスキルとIT知識を高めるためにブログを始めました。

PHPのお勉強。7

<html>

<head>

<title>Test for PHP</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

 

<?php

$resizeX = 50;

$thumbnail_name = "thumbnail.jpg"; //縮小後のファイル名

$file_dir = '/Applications/MAMP/htdocs/image/'; //ファイルの移動先を格納

$file_path = $file_dir.$_FILES["uploadfile"]["name"]; //移動先のパスが格納されていて、実際の名前が格納されている

if(move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $file_path)) { //この関数でファイルを移動

 

$img_dir ="./image/"; //画像ファイルの移動先パスが格納されている

$img_path = $img_dir.$_FILES["uploadfile"]["name"]; //$img_dirとファイル名が格納されている

$thumbnail_path = $img_dir.$thumbnail_name;

echo $thumbnail_path;

 

     if( mb_strpos($_FILES['uploadfile']['type'], 'jpeg') ) {

          $gdimg_in = imagecreatefromjpeg($file_path);

          $ix = imagesx($gdimg_in);

          $iy = imagesy($gdimg_in);

 

          $ox = $resizeX;

          $oy = ($ox * $iy)/$ix;

          $gdimg_out = imagecreatetruecolor($ox, $oy);

          imagecopyresized($gdimg_out, $gdimg_in, 0,0,0,0,$ox,$oy,$ix,$iy);

          imagejpeg($gdimg_out, $thumbnail_path);

          imagedestroy($gdimg_in);

          imagedestroy($gdimg_out);

$size = getimagesize($file_path); //アップロードした画像の情報を取得する

$size2 = getimagesize($thumbnail_path);

?>

<p>File upload has completed!</p><!-- 正常に移動したらここが実行される.-->

<img src="<?=$img_path?>"<?=$size[3]?>><br> <!-- $size[3]はwidth="xx" height="xx"形式で返すということ -->

<img src="<?=$thumbnail_path?>"<?=$size2[3]?>><br>

<b><?=$_POST["comment"]?></b>

 

<?php

} else {

     print "Prepare the JPEG style photograph!<br>";

     }

} else {

print "<p>File upload was incorrectly done.</p>";

}

?>

 

</body>

</html>

 

画像を縮小するプログラムが正しく動作した例.

$img_dir ="./image/";

これにドットを付けると成功した.

 

☆外部コマンドの実行

exec関数 exec("外部コマンド");

passthru関数 バイナリデータを受け取る

system関数 実行結果を文字列で受け取る

`` backtick演算子 結果を受け取る

 

バックグラウンドで実行する時 上記の関数の最後に&を付加.

セキュリティの為に、escapeshellcmd($文字列); としてエスケープ(無効化)する方法もアリ.

 

☆クラスとオブジェクト

具体的なモノ、アイデア=オブジェクト

function関数

クラス=集合, 内部はメンバとメソッド

メンバ=内部データ

メソッド=処理

 

☆クラスの作り方

<?php

class クラス名

{

     public $変数 = "文字列";

     public function 関数名()

     {

          //処理を記述.

     }

}

?>

 

メンバ、メソッドはpublic, private, protectedなどの定義をしなければならない.

 

インスタンス

オブジェクトを抽象化したものがクラス.

クラスを実際に利用するには実態かしてインスタンスを生成しなければならない.

例:クラスはテンプレみたいなもの、実際に利用するにはデータを持たせてインスタンスを生成.

 

new演算子

オブジェクト変数 = new クラス();

オブジェクト変数->メソッド();

 

<html>

<head>

<title>test for class</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

 

<body>

<p>test for class</p>

<br>

<br>

<?php

$newuser = new User();

$newuser->print_hello();

 

class User

{

     public $name = 'Yasu';

 

     public function print_hello()

     {

          print $this->name;

          print ", hello!";

      }

}

?>

</body>

</html>

 

☆アクセス制限

public 外部から参照可能

private 変数を宣言したクラス内のみ参照可能

protected 変数を宣言したクラスと継承されたクラスから参照可能

 

☆クラスの継承

class 新しいクラス名 extends 継承するクラス名

 

<html>

<head>

<title>test for class</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

 

<body>

<p>test for class</p>

<br>

<br>

<?php

class User

{

     private $name = 'NULL';

     public function print_hello()

     {

          print $this->name;

          print ", hello!";

      }

}

 

class Guest extends User {

     private $name = "Guest";

     public function print_hello() {

          print $this->name;

          print ", nice to meet you!";

     }

}

 

$newuser = new Guest();

$newuser->print_hello();

?>

</body>

</html>

 

☆オーバーライドや継承を禁止

final public function xxxx() { 

のように最初にfinalをつける

 

☆PHP5のオブジェクト機能

__autoload

 

example)

function__autoload($クラス名){

     //処理

}

 

コンストラクタ

__construct

インスタンスが生成されるときに最初に実行される処理を記述した特別なメソッド

 

デストラクタ

__destruct

インスタンスが消滅する時に実行される特別なメソッド

 

static and ::

クラス内で定義された変数を、インスタンスを作成せずにクラス外から参照する

class クラス {

     public static $変数 = "文字列";

}

 

print クラス::$変数;

 

<?php

class Test {

     public static $string = "How are you?";

     static function print_reply() {

          print "fine.";

     }

}

 

print Test::$string;

print "<br>";

print Test::print_reply();

 

?>

 

※$thisを使ったメソッドを::演算子で実行するとエラーが出る.

 

スーパークラスの変数を参照

parent::$変数

 

<?php

class Test {

     public static $string = "How are you?";

     function print_reply() {

          print "fine.";

     }

}

 

class Test2 extends Test {

     function print_reply() {

          print parent::$string;

          print "<br>";

          print "Very fine.";

     }

}

 

$test2 = new Test2();

$test2->print_reply();

?>

 

例外処理

<?php

try {

     $error = "例外を発生させます.";

     throw new Exception($error);

     print "直前で例外が発生しているため表示されない.";

 

} catch (Exception $e) {

     print "例外発生<hr>";

     print "例外メッセージ:".$e->getMessage();

     print "<br>";

     print "例外コード:".$e->getCode();

     print "<br>";

     print "ファイル名:".$e->getFile();

     print "<br>";

     print "行番号:".$e->getLine();

     print "<pre>";

     print "バックトレース:";

     print "<br>";

     print_r($e->getTrace() );

     print "</pre>";

}

print "<hr>例外処理後、処理を続けます.";

?>

 

 

 

PHPのお勉強。6

☆hiddenタグでデータを持ち回る //html

input type="hidden" …

 

☆送信ボタンのデータ取得

name属性で判断する.

 

<?php

if( isset($_POST["confirm"]) ) {

?>

 

<?php

// [confirm]がクリックされたとき

print $_POST['onamae']." wrote.";

print "<br><br>";

print "本文:<br>";

print nl2br($_POST["honbun"]);

?>

 

<?php

} elseif ( isset($_POST["back"]) ) {

// [back]がクリックされたとき

?>

 

<p>テキスト送信のテスト</p>

<form name="form1" method="post" action="confirm.php">

名前: <br>

<input type="text" name="onamae" value="<?=$_POST["onamae"]?>">

<br>

本文: <br>

<textarea name="honbun" cols="30" rows="5"><?=$_POST["honbun"]?></textarea>

<br>

<input type="submit" value="submit">

<input type="hidden" name="user_id" value="<?=$_POST["user_id"]?>">

</form>

 

<?php

} else {

//上記以外の条件のとき

?>

 

<p>Error!</p>

<p><a href="form.html">form.html</a>からアクセスしてください.</p>

 

<?php

}

?>

 

このようにif文で分岐しながら使う.

 

環境変数を使ったページ振り分け

$_SERVER["HTTP_USER_AGENT"]

 

チェックボックスのデータ取得

1.inputのname属性に配列を指定する

<input type="checkbox" name="キー" value="データ1">データ1

<input type="checkbox" name="キー" value="データ2">データ2

2.チェックボックスを追加する

input type="checkbox"

 

example…

 

form.html

<form name="form1" method="post" action="view.php">

your hobby: <br>

<input type="checkbox" name="hobby" value="sports">sports<br>

<input type="checkbox" name="hobby" value="movie">watching movies<br>

<input type="checkbox" name="hobby[]" value="book">reading books<br>

<br>

<input type="submit" value="submit">

</form>

 

view.php

<?php

if(isset($_POST["hobby"])){

     $hobby = implode(' and ', $_POST["hobby"]);

     print "my hobby is ";

     print $hobby;

     print ".";

} else {

     print "I have no hobby.";

}

?>

 

ラジオボタンのデータ取得

<input type="radio" name="キー" value="データ1">

<input type="radio" name="キー" value="データ2">

 

//上のラジオボタンとは別のグループ

<input type="radio" name="キー2" value="データ2">

<input type="radio" name="キー2" value="データ2">

 

グループ毎に違うname属性を付けることを理解しておく.

 

example…

 

form.html

<form name="form1" method="post" action="view.php">

性別: <br>

<input type="radio" name="gender" value="male">male<br>

<input type="radio" name="gender" value="female">female<br>

<br>

<input type="submit" value="submit">

</form>

 

view.php

<?php

if(isset($_POST["gender"]) && ($_POST["gender"] == "male" || $_POST["gender"] == "female")){

     print "性別:<br>";

     print $_POST["gender"];

} else {

     print "Choose your gender.<br>";

}

?>

 

☆プルダウンメニューのデータ取得

<select>タグを使う.name属性を付けるのは必須!

<option>タグが選択肢

 

データの受け取りは<select>タグのname属性で行う.

if($_POST["name"] <> ""){

     print $_POST["name"];

} else {

     print "choose!";

}

 

※プルダウンメニューでデータを送信しない場合

例えば、「-----都道府県を選択してください-----」という選択肢を表示プルダウンメニュー内に表示させる場合

<option value="" selected>-----都道府県を選択してください-----</option>

と表記する.

 

☆リストボックスのデータ取得

プルダウンメニューのselectタグに size="num" multiple を追加するだけ.

 

データ取得の例.

 

if(isset($_POST["hobby"])){

     print "my hobbies are under here.<br>";

     foreach($_POST["hobby"] as $hobby)

     {

          print $hobby;

          print "<br>";

     }

} else {

     何も選択されていない時の挙動;

}

 

☆Cookiesを取得する

Cookiesはパソコンに保存されたテキストファイルのこと.

1度目に閲覧したときにWebサーバから送信されたレスポンスヘッダにCookie情報が格納されていると、ブラウザがその情報をテキストファイルとして保存する.2回目の閲覧時にブラウザは閲覧中のサイトに関連したCookiesがあると、その内容をリクエストヘッダに含めてWebサーバに送信する.保存されたデータを活用して色々なことができる.

 

Cookieのセット

setcookie("キー", "値", クッキーの有効期限);

※有効期限はUNIXタイムスタンプ形式で設定する.

time() + 60 * 60 * 24* 30とかにすると有効期限は30日間.

 

クッキー取得の例

<?php

$count = 1;

if( isset($_COOKIE["count"]) ){

     $count = $_COOKIE["count"];

     $count++;

}

setcookie("count", $count, time() + 10);

?>

 

<html>

<head>

<title>test for cookie</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

<p>クッキーのテスト</p>

<?php

if ($count == 1) {

?>

<p>最初の訪問です.</p>

<p>クッキー情報はありません.</p>

<p>リロードしてください.</p>

 

<?php

} else {

?>

 

<p>貴方の訪問は<?=$count?>回目です.</p>

<p>10秒以内にリロードするとカウントアップします.</p>

 

<?php

}

?>

 

</body>

</html>

 

PHPBasic認証

Basic認証とは、Apacheに搭載されているアクセスを制限するための機能.

この機能で許可した人だけが閲覧出来るページを作成可能.

 

ユーザIDとパスワードを知っているユーザだけに閲覧を許可できる.

Basic認証は、HTTPプロトコルで定義された認証プロトコルを使用する.

認証を必要とするURLにアクセス→WWW-Authenticate: Basic realm="任意の文字列"というレスポンスヘッダがサーバからブラウザに送られる→ブラウザは認証ダイアログを表示する

という流れ.

 

example…

 

<?php

if( empty($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] == "") {

     header("WWW-Authenticate: Basic realm=\"Sample\"");

     header("HTTP/1.0 401 Unauthorized");

?>

 

<html>

<head>

<title>Basic Certification</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

 

<p>Test for Basic Certification</p>

<p>Basic Certification has canceled.</p>

 

</body>

</html>

 

<?php

} else {

     if($_SERVER['PHP_AUTH_USER'] == "yasu" && $_SERVER['PHP_AUTH_PW'] == "pass") {

?>

 

<html>

<head>

<title>Basic Certification</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

 

<p>Test for Basic Certification</p>

<p>Hello, <?=$_SERVER['PHP_AUTH_USER']?>.</p>

 

</body>

</html>

 

<?php

     } else {

     header("WWW-Authenticate: Basic realm=\"Warning!: UserID or PASSWORD is not correct.\"");

     header("HTTP/1.0 401 Unauthorized");

?>

 

<html>

<head>

<title>Basic Certification</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

 

<p>Test for Basic Certification</p>

<p>UserID or PASSWORD is not correct.</p>

 

</body>

</html>

 

<?php

     }

}

?>

 

☆セッション

sessionとは、Webサイトに対するアクセス数の単位のこと.

ショッピングサイトの買い物かご、とかに使う.

 

PHPでは、閲覧したユーザ毎にセッションIDを発行する.

このセッションIDはクッキーに保存orURLに付加される.

セッションID毎の保存用ファイルの場所はphp.iniで決めることが出来る.

 

session_start(); //セッションを開始する.

 

$_SESSION["キー"] = "値";

session_unregister("キー"); //セッションからキーの登録を削除する.

 

session_unset(); //セッションを終了する

session_cache_expire(60); //有効期限を60分に設定

session_destroy(); //セッションを破棄する 有効期限に関わらない

 

SID…セッションに関係する特別な定数

<a href="xxx.php?<?=SID>">xxxx</a>

というようにしてセッションIDをURLに付加できる.

この機能を有効にするにはphp.iniのsession.se_trans_sid Onにする.

 

example...

 

<?php

session_start();

 

$count = 1;

if( isset($_SESSION["count"]) ){

     $count = $_SESSION["count"];

     $count++;

}

$_SESSION["count"] = $count;

?>

 

<html>

<head>

<title>test for session</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

<p>Test for Session</p>

<?php

if ($count == 1) {

?>

<p>最初の訪問です.</p>

<p>Session変数にデータがありません.</p>

<p>このページをリロードしてください.</p>

 

<?php

} else {

?>

 

<p>貴方の訪問は<?=$count?>回目です.</p>

 

<?php

}

?>

 

</body>

</html>

 

☆ファイルアップロード

formタグにenctype="multipart/form-data"を埋め込み

ファイルはinput type="file"

 

$_FILES["uploadfile"]["name"] //アップロードファイル名

$_FILES["uoloadfile"]["type"] //ファイルのMIME

$_FILES["uploadfile"]["size"] //ファイルサイズ

$_FILES["uploadfile"]["tmp_name"] //一時的に付けられたファイル名

$_FILES["uploadfile"]["error"] // エラーコード

 

ファイルアップロード例

form.html

<html>

<head>

<title>test for file upload</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

 

<body>

<p>test for file upload</p>

<form name="form1" method="post" action="view.php" enctype="multipart/form-data">

<input type="hidden" name="MAX_FILE_SIZE" value="500000">

photo:

<input type="file" name="uploadfile">

<br>

description:

<input type="text" name="comment">

<br>

<br>

<input type="submit" value="file upload">

</form>

</body>

</html>

 

view.php

<html>

<head>

<title>Test for PHP</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

 

<?php

$file_dir = '/Applications/MAMP/htdocs/image/'; //ファイルの移動先を格納

$file_path = $file_dir.$_FILES["uploadfile"]["name"]; //移動先のパスが格納されていて、実際の名前が格納されている

if(move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $file_path)) { //この関数でファイルを移動

 

$img_dir ="/image/"; //画像ファイルの移動先パスが格納されている

$img_path = $img_dir.$_FILES["uploadfile"]["name"]; //$img_dirとファイル名が格納されている

$size = getimagesize($file_path); //アップロードした画像の情報を取得する

?>

<p>File upload has completed!</p><!-- 正常に移動したらここが実行される.-->

<img src="<?=$img_path?>"<?=$size[3]?>><br> <!-- $size[3]はwidth="xx" height="xx"形式で返すということ -->

<br>

<b><?=$_POST["comment"]?></b>

 

<?php

} else {

?>

<p>File upload was incorrectly done.</p>

<?php

print $_FILES["uploadfile"]["error"];

}

?>

 

</body>

</html>

 

☆MacのFinderのタイトルバーにフォルダのUNIXフルパスを表示する方法

http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-display-the-full-path-of-folder-in-macos-finder-titlebar.html

このサイトが大変参考になった.解除方法もある.

 

☆画像編集(画像縮小)

gdというライブラリが必要らしいが、自動的に入っていた.

確認するにはターミナルで「php -m」.

 

<html>

<head>

<title>Test for PHP</title>

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">

</head>

<body>

 

<?php

$resizeX = 50;

$thumbnail_name = "thumbnail.jpg"; //縮小後のファイル名

$file_dir = '/Applications/MAMP/htdocs/image/'; //ファイルの移動先を格納

$file_path = $file_dir.$_FILES["uploadfile"]["name"]; //移動先のパスが格納されていて、実際の名前が格納されている

if(move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $file_path)) { //この関数でファイルを移動

 

$img_dir ="/image/"; //画像ファイルの移動先パスが格納されている

$img_path = $img_dir.$_FILES["uploadfile"]["name"]; //$img_dirとファイル名が格納されている

$thumbnail_path = $img_dir.$thumbnail_name;

 

     if( mb_strpos($_FILES['uploadfile']['type'], 'jpeg') ) {

          $gdimg_in = imagecreatefromjpeg($file_path);

          $ix = imagesx($gdimg_in);

          $iy = imagesy($gdimg_in);

 

          $ox = $resizeX;

          $oy = ($ox * $iy)/$ix;

          $gdimg_out = imagecreatetruecolor($ox, $oy);

          imagecopyresized($gdimg_out, $gdimg_in, 0,0,0,0,$ox,$oy,$ix,$iy);

          imagejpeg($gdimg_out, $thumbnail_path);

          imagedestroy($gdimg_in);

          imagedestroy($gdimg_out);

$size = getimagesize($file_path); //アップロードした画像の情報を取得する

$size2 = getimagesize($thumbnail_path);

?>

<p>File upload has completed!</p><!-- 正常に移動したらここが実行される.-->

<img src="<?=$img_path?>"<?=$size[3]?>><br> <!-- $size[3]はwidth="xx" height="xx"形式で返すということ -->

<img src="<?=$thumbnail_path?>"<?=$size[3]?>><br>

<b><?=$_POST["comment"]?></b>

 

<?php

} else {

     print "Prepare the JPEG style photograph!<br>";

     }

} else {

print "<p>File upload was incorrectly done.</p>";

}

?>

 

</body>

</html>

 

これでなぜかうまくいかない.thumbnail.jpgがアップロードされていないので表示できない、とのWarningが返ってくるが、imagejpeg関数で保存してあるはず、だが…

初めてここに来て詰まった.

 

 

 

 

 

PHPのお勉強。5

PHP正規表現について分かりやすく解説しているサイト.

http://www.standpower.com/php_match.html

 

フォームと連動

フォームに入力されたテキストはリクエストヘッダに格納されてWebサーバに届く.

ブラウザからサーバにデータを送信する方法"GET","POST"

"POST"...お問い合わせフォーム、アンケート申し込みフォーム、掲示板投稿フォーム.画像等のバイナリファイルも送信可能.

"GET"...検索エンジンの検索結果のようにリンク部分にデータを付加して送信するとき

.htmlでデータ送信の為のページを作る→.phpでテキストデータを受信して表示

 

example.

<form name="form" method="post" action="xxx.php">

name: <br>

<input type="text" name="name">

<br>

<input type="submit" value="submit">

</form>

 

PHP $_POSTメソッドに値が入力されていないWarning

.htmlと.phpの両方のファイルにmetaタグでcharsetをちゃんとUTF-8に統一したら出来た.

ただし、文字化けする

そこで、htmlファイルをUTF-8phpファイルをEUCにcharset変更すると成功.

phpファイルだけEUCにするように心がける必要がある?

 

GETで送信するには

URL?キー=データ&キー=データ&キー=データ

例 http://localhost/xxx.php?name=Yasu?gender=male

マルチバイト文字(漢字など)をデータに指定するとGETでは文字化けの可能性が高くなるので意識する.

エンコード処理はrawurlencode関数で簡単に処理できる.

<?php

$name = rawurlencode("夜露死苦");

?>

 

<a href="http://localhost/view.php?name=<?=$name>">submit</a>

 

<?=$name?>の部分は<?php print $name; ?>と同じ意味.