読者です 読者をやめる 読者になる 読者になる

PHP オブジェクト指向、PDOとか

php関連

PDOなどに関して下記サイトがむっちゃ分かりやすい説明をしてくれているんで、早速飛んでみてください。⇩

PDOで接続、SELECT、プリペアドステートメントとは(PHPでMySQLに接続)

オブジェクト指向とは?

 オブジェクト指向とは、プログラムの構造をオブジェクト群の相互作用とその雛形であるクラス群の関係として捉え、相互にメッセージを送りあうオブジェクトの集まりとしてプログラムを構成する技法のこと。この技法をサポートするプログラミング言語オブジェクト指向プログラミング言語と呼ばれる。これらの言語では、クラスとその継承などの仕組みを利用することで開発効率を高められる。

『オブジェクト』を作って、プログラムを作っていこうということらしっす。

クラス

オブジェクトを作る際のもとになる設計書。

クラスとは、一般に関数の集合体として定義されていますが、関数と比べデータの扱いという点で見比べてみるとその違いがよりわかりやすくなります。関数は与えられた入力値(引数)を元にして処理結果を戻り値として出力するだけのしくみですが、クラスまたはオブジェクトは、自分自身のなかにデータを格納する変数としての役割もはたしています。その結果、関数でのデータの扱いは、データが処理を「通過」していくだけなのにたいして、クラス、オブジェクトではさらに処理前、処理後のデータを内部で保持しておくことが可能になります。プログラマは必要に応じこの値を取り出して再度利用することができるようになるわけです。

  データを保持 データを処理
変数 ×
関数 ×
クラス、オブジェクト

 

オブジェクト

 クラスをもとにして作られたコピーのこと。

クラスを理解するうえで重要になってくるのがオブジェクトです。クラスとオブジェクトは似て非なるものです。オブジェクトとはクラスを元にしてつくられたコピーを指します。クラスでは「データを保持できる」という性質をもっているため、複数の処理でひとつのクラスにアクセスした場合、データの上書き(不整合)を引き起こす危険があります。そのため、処理に応じクラスのコピーを作成し、そのコピーに対してアクセスすることが考えだされました。実際に使う場合には、まずクラス本体には手を加えず、オブジェクトと呼ばれるクラスのコピーを作成しそれを処理の対象としてプログラムを組んでいきます。

インスタンス

クラスのコピー(オブジェクト)を生成すること。

インスタンス化とは、クラスを扱うための「自分専用の領域」を確保する行為ともいえます。PHPでは、クラスのインスタンス化を次のようにnew演算子を使って行ないます。また、インスタンス化の際に、必要に応じて初期化のためのデータを引き渡すことも可能です。

$変数名 = new クラス名([引数,...]);


 引数が必要ない場合でもカッコは省略できない点に注意してください。インスタンス化したオブジェクト「$変数名」に格納され、以降はこの変数をオブジェクトとして扱うことになります。また、インスタンス化した変数「オブジェクト変数」と呼称します。この場合、オブジェクト変数のなかのクラスに属する関数変数のことをメンバ関数「メンバ変数」、または「メソッド」と「プロパティ」と呼びます。

・処理の適応、戻り値の取得
[戻り値] = $変数名 -> メソッド名([引数,...]);

・値の参照、代入
$変数名 -> プロパティ名 [ = 値];

オブジェクト指向まとめ

クラスが持つ変数プロパティ と呼び、public か private で定義します。
public の場合はクラスの外から直接アクセスできる変数になり、
private の場合はクラスの外から直接アクセスできない変数になります。
( ※PHP4の名残りで、public の場合は var と書くこともできます。)

クラスが持つ関数メソッドと呼び、関数と同様 function で定義します。

定義したクラスからオブジェクト作成するには new を使用します。
作成したオブジェクトは各々が、クラスで定義したプロパティメソッドを持ちます。
プロパティメソッドにアクセスするには、オブジェクトに対して
 -> (アロー演算子)』を使用します。

PDO( PHP Data Objects )

PDO( PHP Data Object )とは、PHP標準( 5.1.0 以降 )のデータベース接続クラスのことです。

PDOってけっこう革命的なことっぽい(私の独断と偏見です)

PHP は標準で MySQL や PostgreSQL や SQLite など、色々なデータベースに接続するための命令が用意されています。
データベースの種類によって条件分岐させて命令を呼び出せば、プログラムを複数のデータベースに対応させることもできます。
ですが、PDOを使用していれば、同じ命令で複数のデータベースに接続ができるようになるので、さらに開発が容易になります。

これはPHP 5.1から新たに用意された機能で、単にオブジェクト指向な手段を提供するというだけでなく、データベースの違いを吸収し、アクセス先が何であろうと変わらない処理が作成できるように設計されています。

PDOができること

  1. INSERT・UPDATE・DELETEのSQLクエリの実行
  2. 以下の形式でのデータベースからの値の取得
       配列
       オブジェクト(定義されているクラスのインスタンスの作成)
       同じスコープ内で有効な変数
       文字列
  3. 複数次元の配列でのすべての行の取得
  4. プリペアードステートメントの実行
  5. トランザクションの使用
  6. オートコミットのサポート
  7. テーブルのカラムの一般化機能

 

 ⇩ オブジェクト指向などの詳細はこちらのサイト。

独学PHP はじめよう、PHPでオブジェクト指向

 

クラスPDOのオブジェクトをnew演算子で生成し、そのオブジェクトの中で用意されているprepare( )メソッドの引数にSQL文を指定することで、データベースに送信しようとするSQL文の準備をすると同時にprepare( )メソッドで生成される、クラスPDOStatementのオブジェクトで用意されているexecute( )メソッドSQL文を実行

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PDOオブジェクト</title>
</head>
<body>
<?php
/* 'mysqk:データベース名=db1; =db1; ホスト名=localhost'を$dbnに代入。*/
  $dbn 'mysql:dbname=db1; host=localhost;';

  $user 'root';

  $password = 'root';
/*データベースを扱うためのクラスがPDOというオブジェクトをnew演算子で作成し、$dbhに代入。($dbhという名前のオブジェクトを生成したことになります。)*/
  $dbh = new PDO$dbn , $user , $password );
/*テーブルtbから id,nameを、まだid,nameが定まってない場所から選んできて、$sqlに代入。*/
  $sql = "select id,name from tb where id=? and pass=?";
/* $dbh -> prepare( );は、$dbhオブジェクトの中にあるprepare( );関数を使ってオブジェクトを生成するという意味、$sqlを使えるように準備するのがprepare( );関数。ここでprepare( );関数によって、$stmtオブジェクトが生成されます。*/
  $stmt = $dbh -> prepare$sql );
/* $stmtオブジェクトの中にあるexecute( );を呼び出す。array( )配列に$id,$passを入れることで、sql文のid=?,name=?を補完する。execute( );の引数はarray( $id , $pass )。*/
  $stmt -> executearray( $id , $pass ));
/* $stmtオブジェクトの中のfetch( )関数を呼び出す。fetch( )はデータ1行を呼び出す。$['name','id']の連想配列ができるので、$c_name、$c_idにそれぞれ代入。今回はデータが1個で良いのでif文。条件に合わせてwhile文などを使っても良い。*/
  if$db = $stmt -> fetch( ) ){

    $c_name = $db['name'];

    $c_id = $db['id'];
/* nullを代入することで、$dbhオブジェクトの中身を空にする。*/
    $dbh = null;
  }else{ // データが1個もない場合echo "IDかパスワードが間違っています。"
    echo "IDかパスワードが間違っています。";
    $dbh = null;
    exit;
}
?>
</body>
</html>

 

f:id:ts0818:20150313104819p:plain

データベースの練習

db_test.php

<!DOCTYPE html>

<html lang="ja">
<head>
</head>
<body>
<h1>DB練習</h1>
<h2>データを入力して下さい</h2><BR>


<form method="GET" action="select.php">
表示する社員番号は?<BR>
<input name="bang" type="text" size="40">
<input type="submit" value="表示">
</form><BR /><--select.phpのページに飛ばす。-->

 

<form method="GET" action="insert.php">
社員番号は?<BR>
<input name="bang" type="text" size="40"><BR>
月は?<BR>
<input name="tuki" type="text" size="40"><BR>
追加する売上は?<BR>
<input name="uri" type="text" size="40">
<input type="submit" value="追加">
</form><BR /><--insert.phpのページに飛ばす。-->

 

<form method="GET" action="update.php">
社員番号は?<BR>
<input name="bang" type="text" size="40"><BR>
月は?<BR>
<input name="tuki" type="text" size="40"><BR>
修正する売上は?<BR>
<input name="uri" type="text" size="40">
<input type="submit" value="修正">
</form><BR /><--update.phpのページに飛ばす。-->

 

<form method="GET" action="delete.php">
社員番号は?<BR>
<input name="bang" type="text" size="40"><BR>
削除する月は?<BR>
<input name="tuki" type="text" size="40">
<input type="submit" value="削除">
</form><BR /><--delete.phpのページに飛ばす。-->

 

</body>
</html>

select.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
<BR>
<?php
  $bang = htmlspecialchars($_GET["bang"]);

  $dbn = 'mysql:dbname=db1; host=localhost';
  $user = 'root';
  $password = 'root';

//classがPDOのオブジェクトを生成し、名前を$dbhとする。
  $dbh = new PDO$dbn , $user , $password );

/*
$s = mysql_connect( 'localhost' , 'root' , 'root' ) or die( '失敗' );
mysql_select_db( 'db1' , $s );
*/
// SELECTのSQLを用意。
  $sql = "select * from tb where bang = ? order by uri";

  print "実行するクエリ ".$sql."<br><br>結果(?->{$bang})<br>";
/*
$data = mysql_query($sql);
*/
// SELECTに社員番号を埋め込んで実行。
  $stmt = $dbh -> prepare( $sql );
// SELECT結果を取り出す(fetch)
  $stmt -> executearray( $bang ));

  while( $db = $stmt -> fetch( )){
    $uri = $db['uri'];
    $tuki = $db['tuki'];
    print "bang={$bang} uri={$uri} tuki={$tuki}<BR>";
    $dbh = null;
  }
    exit;

?>
<BR><BR>
<a href = "javascript:history.back( );>選択ページへ戻る</a>
</body>
</html>

 

 セキュリティー関係( PHPでパスワード暗号化 )

データベースの情報が何らかの理由で漏洩したことを想定して、データベースに登録するパスワード情報を暗号化(可逆・不可逆)して、情報を盗まれなくすること。

平文データ(生データ)から暗号化されたデータを作成することを暗号化(encryption、encrypt)、暗号化されたデータから元の平文データに戻すことを復号(decryption、decrypt)といいます。

可逆暗号化

復号が可能。

不可逆暗号化

復号が不可能。(ハッカーや頭の良い人が稀に復号してしまうことがあるようです。)

不可逆暗号化のいろいろ

ハッシュ(hash)

パスワードを保護する方法の一例。通常の暗号化とは違い、一度行うと元に戻せなくなる
暗号化方式のことです。ハッシュを行うための方法には、MD5SHA1などがあり、
hash()関数を使うと実行することができる。

ソルト(salt)

ソルト(Salt)とは、パスワードに文字列を追加してから
ハッシュを行うことにより、パスワードを特定させにくくする方法。

ソルト&ペッパー

一度ハッシュ化した値に、ソルトを使ったハッシュ化を更に組み合わせる手法

 例:ソルト&ペッパー

 //暗号化するパスワード
$password = 'password';

//sha1関数でハッシュ化
$password = sha1($password);

//ハッシュ化したパスワードに、適当な文字列を追加する
$password = "salt1".$password."salt2";

//もう一度、sha1関数でハッシュ化
$password = sha1($password);

  ⇩ 詳しいサイトは下記より

PHPでのhash化にSaltを併用したパスワードの保護について

【require文とinclude文】

別ファイルにまとめた関数やファイル、プログラムを読み込む時に使用します。
よく使う関数は別ファイルに用意しておき、複数ページで共通に利用できるようにしておけば、 同じ関数を何度もコードに書くよりは、はるかに手間が省け、開発の効率やメンテナンスの点で非常に有効です。

require( ); ⇒ ファイルの読み込み

require_once( '/home/フォルダ名/ファイル名' );

include( ); ⇒ ファイルの読み込み

include_once( '/home/フォルダ名/ファイル名' );

  ⇩  requireとincludeの説明は下記サイトへ。

PHPの基礎編【require文とinclude文】

広告を非表示にする