ステップアップ備忘録

学習用備忘録

ログイン機能を実装してみる

今回はdotinstallのPHPでログイン機能を実装するの項目についてのまとめ
気になったこと、引っかかってもたついた点を重点的に

MVC設計


ユーザーインターフェースを持つアプリケーションソフトウェアを実装するためのデザインパターン

  • Model → データベースの参照などのアプリケーション固有の処理部分や状態遷移部分を記述(ビジネスロジック部分)
  • View → 表示画面に関する部分
  • Controller → ModelとViewの制御をする部分
    • validation(検証)やsessionの管理、エラーハンドリング、リクエスト処理など
  • ユーザーインターフェース(UI) → 機械↔人間でやり取り(入力や出力)を実現させる方法(仕組み)

オートロード


  • spl_autoload_register → 指定の関数をautoload()の実装として使う
  • substr→文字列の一部を返す
  • str_replace→文字列の置換をする
  • strpos→文字列内の部分文字列が最初に現れる場所を見つける

名前空間、サブ名前空間

  • 名前空間→定義することで、そのファイルが同じ空間に属していることを示す
    phpは同じ関数名が違うファイル内でも定義ができない(エラーになる)が、名前空間が違うと同じ関数名の定義が可能になる
  • サブ名前空間ディレクトリの構造のように階層を持たせた記述の仕方(「 \ 」で区切る)

ページのリダイレクト


  • URLを定数で管理するメリット
    • 複数回使用するときなどの打ち間違いの防止
    • アドレス変更があった際の時間を短縮する

formタグ(html)のオプション


  • action→送信先のURLを指定、一番優先される
  • method→送信方法の指定
    • get→URLとして送信する、URLの後ろ?以降に表示される
    • post→本文として送信する、URLには表示されない

データのフィルタリング


  • filter_var → 指定したフィルタでデータをフィルタリングする
    • FILETER_VALIDATE → 検証フィルタ

javascript(onclick)


stdClass、get_object_vars


  • stdClass→クラスを定義していないデータ(配列)について、オブジェクト形式での保存を行う、内部定義関数
  • get_object_vars → 指定したオブジェクトのプロパティを取得する
    (スコープ内でアクセス可能なこと、非staticプロパティであることが条件)

prepareステートメントにおける名前付きパラメータと疑問符パラメータ


  • 名前付きパラメータ → 名前を指定した値を使用してプリペアステートメントを準備し、実行する。名前付きパラメータの前には「 : 」がつく

/ 値の配列を渡してプリペアドステートメントを実行する /
$sql = 'SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));

引用元PHP公式マニュアル

  • 疑問符パラメータ → 名前付きパラメータの「:変数」の部分を「?」に置き換えたもの、名前を指定していないので実行前(もしくは実行時)にわざわざ連想配列を作らなくてもいい

$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));

引用元PHP公式マニュアル

セッションハイジャック


  • いわゆる「なりすまし行為」で被害が大きくなりやすい(管理者権限を奪われたりなど)
    • 対策
      • フォームデータ上のhiddenフィールドでやりとりする
      • ワンタイムセッションID(都度IDが変わる)を発行する

PDO(fetch)とパスワードハッシュ


  • fetch_class → クラスの新規インスタンスを返す

  • password_hash → パスワードのハッシュを作成する

    • ハッシュ → 固定長のランダムに見える値に不可逆変換する
  • password_verify → パスワードがハッシュに適合するかを調べる

まとめ


  • MVC設計について
    前に一度他で触れる機会があったときは内容がほとんど理解できておらず、 かなりもたついたので、今回dotinstallで触れる機会があってよかった。
    MVCのそれぞれがどういうプログラムを置いておく場所で、お互いがどういう風に作用していくのか流れが見えたので、 今度MVC設計の考え方で作る際はもう少し考えやすいはずと思えるくらいの理解ができた。

  • 名前空間についても改めて調べることで名前空間がなぜ必要かや、useはどんな役割を果たすのかなど感覚的ではない理解ができた。

クイズアプリを作成する

今回はdotinstallのクイズアプリ作成の項目について。
気になったところ、引っかかってもたついた点を重点的に。

jQueryの作りこみ


  • use strict
    厳格モードを使うという意味。処理を厳密に行い、デバッグ時の負担を減らす。
    定義できるのはJavaScript文の先頭と、関数内の先頭。

HTTPステータスコード


100番台(案内)、200番台(正常処理)、300番台(移転通知)、
400番台(クライアント側の)処理失敗通知、500番台(サーバ側の)エラー通知
プログラムに設定する際だけでなく、アクセスログなどを見た時にすぐ判断をできるようにしておくと便利。まとめてあるようなサイトを参照しておく。

チェック方式(token)の作成方法


CSRF→cross-site-request-forgeriesの略
詳しくは情報処理推進機構 脆弱性対策(3.クロスサイトリクエストフォージェリ)
この対策のために擬似乱数を作成し、tokenに格納する必要がある。 openssl_random_pseudo_bytes()→php擬似乱数を()内で指定された文字数で作成する関数
bin2hex→10進数の数字もしくは16進数に変換した文字列を返す

spl_autoload_register


  • spl(standard php library)が提供するautoloadキューに指定した関数を登録する。

    • spl_autoload_register(function ($class) {
      include 'classes/' . $class . '.class.php';
      });
      ↑公式のマニュアルからの例、php5.3以降無名関数が使える。

    • function my_autoloader($class) { include 'classes/' . $class . '.class.php';
      }
      spl_autoload_register('my_autoloader');
      ↑公式マニュアルからの略さない記述方法。

関数を定義して、それをキューに登録する。(二つともやっていることは同じ) 一つ目は関数を定義する部分を省略してそのまま入れ込む形。

まとめ


サーバーエラーになってしまう際の処理でつまづくことが多いので、ステータスコードの番号と何が関連しているのかをしっかり理解しておきたい。

ToDo管理のアプリを作成する

今回はdotoinstallのToDo管理アプリの作成について。
気になったことやつまづいたところを重点的に。

MySQL(データベース)の設定


  • MySQL部分

    • tinyint → 整数型の一つ。0~255までの範囲の数字を扱う。
    • default→ 何も変更されていない際の規定値を示す
  • HTML部分の作成

    • placeholder → 入力欄に初期表示する内容を定義(仮で入れておく情報)
  • CSS部分の作成

    • float → 指定された要素を左寄せまたは右寄せに配置する ul > li → liがulの直下の子要素であることを示す border-radius → ボックスの4つのコーナーの角丸をまとめて指定する。
  • 詳しい内容は↓のサイトを参照
    HTMLクイックリファレンス

全件抽出してみる


  • queryとprepareの違い
    きちんと理解していなかったので、しっかりまとめてみます。 どちらもphpからMySQLを実行したい際に使う、実行前の準備をするようなメソッド

      query → 実行の際にユーザからの入力情報を含めることができない  
          $sql = 'select * from データベース名';   
          $stmt = $db->query($sql);  
          $stmt->excute();  
    
    
      prepare → 実行の際にユーザーからの入力情報を含めることができる  
          $sql = ' Insert into (todos → テーブル名) (title→変数) values (:title→変数);  
          $stmt =($this->) $db->prepare($sql);  
          $stmt->excute();  
    

ちなみに、execute()は実行する際のメソッド、$stmtはPDOStatmentオブジェクトを指す

イベントの追加(jQuery)

  • jQueryjavascriptライブラリの一つでブラウザによって異なるjavascriptの仕様のそれぞれの違いを吸収し同じコードで違うブラウザでも同じ動作を実現できるのが特徴。

    • CDN(ContentsDeliveryNetwork)を用いるやり方と自サイトにjQueryファイルをアップロードして使うやり方がある。
    • jQueryの1型、2型、3型などのバージョンの違いは、それぞれがサポートしているブラウザの違いになる。
      • javascriptを適用したいブラウザ(ターゲット)にIE8以下を含む場合は1型
      • IE9以上、その他も3型に適合しない場合は2型
      • chrome, egde, safari, FireFox, Operaの最新バージョンとそのひとつ前、IE9以上、モバイルならばsafari(iOS7以上)とAndroidの標準ブラウザ(Android4.0以上)などがターゲットになるならば3型

動的な部分の作りこみ


  • index.phpにidもしくはclassを定義し、javascriptと紐づけする
    idと紐づける場合先頭に#、classと紐づける場合は先頭に「 . 」を持ってくる。
  • javascript部分のphp内での動作
    _(ファイル名).phpはファイルがバックグラウンドで動作するという意味。
    javascriptで指定された処理を受け取った時にどう処理していくかを記述する。

  • メソッドの実装
    sprintf → フォーマットされた文字列を返す
    fetch column → 単一カラムを返す
    removeclass → jQueryのメソッド、addclassで適用したCSSクラス(今回はdone)の適用を外す

  • CFRS対策
    データの改ざんチェック
    サーバ側からtoken(推測されにくい文字列のこと)を発行し、まずSESSION(サーバ側のデータ保存機能)に格納される。
    そのあとフォーム(クライアント側)からもtokenを発行し、処理の中でsessionに格納されたtokenとフォームからのtokenを突き合わせて一致するかを確認する。

  • 削除と追加
    動的な部分はjQueryで管理し、受け取った後の処理部分はPHPに記述する。

完成させる


  • CSS部分
    display → ディスプレイへの表示と非表示を管理

  • jQuery部分
    prepend → 引数で指定したコンテンツを各要素の先頭に挿入する
    attr(key, value) → キーと値を渡してすべての要素に属性を設定する

  • エラーコードへの対応
    illegal return statementというエラーが出た際に気を付けたいこと
    このエラーはreturnができない場所からreturnしたという意味
    returnは関数内でのみ可能なので、「関数の外からreturnしてるよ」と言われている、この時は閉じかっこをよく確かめることが大事

まとめ


  • jQueryの記述の仕方が少し難しい、少しだけjavascriptに触れたことがあるがだいぶ忘れているので、
    わからないと思ったことをそのままにせず、しっかり調べておく。 

投票システムを作成する

今回はdotinstallの投票システムを作成しようの項目。
例にもれず気になったりつまづいたりしたところを重点的に。

スタイルを整える(css)


  • ブロック要素 → 見出しや段落などの基本構成部分(h1~h6, formなど)
  • インライン要素 → ブロック要素の内容部分(a,big, brなど)
  • inline-block→インライン要素のような表示形式で内部の横幅、高さなどを指定できる。
  • line-height→行の高さ

リダイレクトする


  • [HTTP_USER_AGENT] → ページにアクセスしているユーザの識別子(ブラウザ名やOS名など)
  • jQuery
    • function → 関数そのものの定義というより関数かどうかを判断する。 ※リダイレクトでセッションを使う際は、設定のファイルに

    • session_start();を必ず入れる 

  • 結果の取得
    • array_fill → 配列を指定した値で埋める
    • array_fill(0, 3, 0) → 配列を3まで([0]~[2]まで)数字で埋める(初期値は0から)

まとめ


  • 何をやっているか、どうすればそうなるかということは少しずつ理解ができてきたと思う。ただ、理解ができたのと実際に使えるのかは別物なので、理解したうえで細かい部分も実際使えるように理解をしていきたい。

画像をアップロードする掲示板を作る

今回はドットインストールの画像アップロードの掲示板作成の項目から。
気になるところや引っかかったところを重点的に。

ファイルのアップロード 


  • enctype ="multipart/form-data"
    →form要素のエンコード(符号化)のタイプを指定する(method属性がpostの場合のみ)
  • "multipart/form-data" → フォームにファイルを送信する機能がある場合指定
  • "applocation/x-www-form-urlencoded" → すべての文字をエンコードする
  • "text/plain"→ スペースの部分のみ「 + 」に変換し、その他の特殊文字は変換しない

uploadメソッド(アップロードの流れ)


  • try catchで例外処理の条件を作成

    • try → アップロード時のチェック
      1. 画像保存時のタイプチェック→ 画像の種類によってPHP側の命令が変わる
      2. 保存処理
      3. サムネイル作成
    • catch → エラーメッセージの表示
    • 処理の終了後にindex.phpを再読み込み(リロード)すると二重投稿になるのでリダイレクトを設定する
      • header命令 → リダイレクトの設定
    • HTTP_HOST→ クライアント側の接続している仮想ホスト
  • 投稿されたファイルの検証

    • $_FILES → PHPで定義済みの変数
    • $_FILES['image']['error'] → ファイルアップロードに関するエラーコードを格納している
    • ファイルをセットした際にチェックし、定数(文字列)で返す
  • 画像の種類の判別

    • exif→撮影条件のメタデータを追加保存できる画像ファイル形式の規格
    • 保存された画像の確認
      確認の際に『warning failed to open stream:permission denied』というようなエラーメッセージが。
      これは書き込み権限がないよというメッセージなので、chmodで権限変更をかけたけれどまたはじかれる。
      調べたらSELinuxが絡んでいることが判明、setenforceでpermissiveモードに変更したらはじかれずにすんだ。
  • サムネイルの作成

    • サムネイル画像の高さ
      → 元画像の高さ×サムネイル画像の横幅/元画像の横幅
    • imagecreatetruecolor → truecolorイメージの新規作成
  • 画像リストの作成

    • basename
      → ファイルまたはディレクトリへのパスを含む文字列を受け取って、最後にある名前の部分を返す(入力文字列をそのまま単純に処理するので、実際のファイルシステムを確認したり、".." のようなパスを気にすることはない。
    • ul → 順序のないリストを表示
    • ol → 意味のある順序のリストを表示
    • li → リスト項目の記述(ulやolの子要素)ulの中で使う場合はリスト項目となって互いに関連するが、それ以外に配置された場合はほかのli要素とは無関係になる。
  • セッションの開始
    • session → サーバ側に保存されるデータ(キーと値)
    • cookie → サーバ側から発行され、ブラウザ(クライアント)側に保存されるデータ(キーと値)
    • session_start → セッション管理に必要な一意の値(sessionID)を自動発行する。

まとめ


学習を続けている中で、『何をやっているか』はだいぶ理解ができるようになってきたので、次は『なぜそうするか(なぜそのやり方を用いるのか)』を理解できるようにしていきたいと思う。 SELinuxに悩まされることが多々あるので、どういうときにこの機能が絡んでくるのかをきちんと理解してすぐに検討がつくようにしたいと思う。

PHPとHTMLでカレンダーを作成してみる

今回はdotinstallのPHPの項目にある「Datetimeクラスを使ってphpでカレンダーを作成する」から。

今回は、気を付けたい(もしくは気になる)点や引っかかってもたついた点について

それぞれのタイトルに 気を付けたい(気になる)→ ☆ 引っかかった→ ◎

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 画面の作りこみ(html記述)

colspan → 行ごとにセルを結合

rowspan → 列ごとにセルを結合

&laquo; ,  &raquo; → HTMLエンエティ(特殊文字を表示する)

           これの場合は「<<」「>>」が表示される

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

◎ webページで確認する

いざ作ったものを確認しようとすると、permission deneidエラー表示に。

調べるとSELinuxというカーネルの制御機能が関係しているとのこと。

これは細かいアクセス制御を行いたいときに使う機能で、

CentOSFedoraなどのRedHat系のLinuxではデフォルトで有効になっている。

これのモードを変更することでページの確認が可能になる。

詳し内容は

eng-entrance.com

 上などを参照して、自分に合ったモードに変更する。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

CSS(スタイルシート)の設定

collapse → 隣接するセルのボーダーを重ねて表示する。

separate→ 隣接するセルのボーダーの間隔をあけて表示する。

二つとも『border-collapse:』の後に続ける、初期値はseparate

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

PHPで動的にカレンダーを作成する

DateTime → 日付と時刻をあらわす。

       PHP側であらかじめ定義をしてあるクラス(標準クラス)で

       クラス定義をしなくてもオブジェクトを生成できる。

DateInterval → 日付の間隔をあらわす。

        格納方式は固定値(年月日など)かDateTimeなどで使える相対書式

 

※DateTimeなどで使える相対書式はPHPの公式マニュアルを参照

PHP: 相対的な書式 - Manual

※相対書式を使う際は書き方に注意

 first day of this month → first day of December 2018などの具体的なほうがベスト

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 週ごとに行を変える

format → 指定された書式に置き換えて返す。

     0個以上の指示子(ディレクティブ)で構成される文字。

    format('Y-m-d')など。書式に決まりがあるので注意する。

    PHP: DateInterval::format - Manual

    上の公式マニュアルを参照

sprintf() → formatされた文字列を返す。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 翌月分のカレンダーの作成

$a .=  $b → aとb双方の演算結果をaに代入する

 DateTimeオブジェクト($firstDayOfNextMonthなどの)→add(new DateIntarval('P1D'))

→ 指定したDateIntervalオブジェクトを指定のDateTimeオブジェクトに加える

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ ◎ 前月部分を作成する

($deteなど)                                    sub(new DateInterval('P10D')など

☆ DateTimeオブジェクト   →    sub(DateIntervalオブジェクト)

DateTimeオブジェクトからDateIntervalオブジェクト引くという意味

 

◎ この時のアロー演算子(→)についてパッと見て理解ができていなかったので調べた

前項の翌月分を作る際のaddも含めてこのアロー演算子が少し疑問。

アロー演算子(→)は、データを参照する(手元に呼び出して見られるようにする)形で使うのでそのもの自体を操作ができないと認識でいた。

(ここでいうDateIntervalオブジェクトの値('P10D'のような)は参照しているのでその値を他(任意の変数)に代入せずに使うことはできないという認識)

 

その為に左辺に右辺を加える(加算)、左辺から右辺を引く(減算)のような形で説明されているのがよくわからないことになっていた原因でした。

 

これはもともとメソッド(関数)があって、そのメソッド内で処理されて返された値をDateTimeオブジェクトから参照するというような形だったので自分の認識は一応あってるはず。

 

オブジェクト指向型と手続き型で見比べてみると

 

オブジェクト指向
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n";

手続き型

$date = date_create('2000-01-20');
date_sub($date, date_interval_create_from_date_string('10 days'));
echo date_format($date, 'Y-m-d');

 

・手続き型に基づいて見比べる

$date → ここに与えられた値が新しいDateTimeオブジェクトと同義

date_interval_create_from_date_string

→ ここに与えられた値が新しいDateIntervalオブジェクトと同義

date_sub → $dateの値からdate_interval_create_from_date_stringに与えられた値を引く

date_add → date_subと同じ扱い方で値を加える。

ここで得られた値をDateTimeオブジェクトが参照する。

大体ふわっとした理解の上で書いているのできちんと理解を深めたい項目。

詳しいことはPHP: DateTime::sub - Manualを参照。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ 指定された月を表示させる

F → (12月などの月をフルスペル(英語)で取得する。

受け取った引数(月と年)に対する処理の仕方

→月や年を-するのか+するのかを注意。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ URLから値を取得する

値取得の際の例外処理(try catch)を忘れない。

preg_match → 正規表現によるマッチングを行う

この処理の際のパターンについて

\A → 先頭(行)と適合する → 「 ^ 」と同義

\Z → 末尾(最終行)と適合する → 「 $ 」と同義

「 ^ 」や「 $ 」を使うと不具合が起こりやすいので\A, \Zを必ず使う

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

☆ リンクをつくる

(式1) ? '式2' : ’式3’ → 三項演算子

式を左から順に評価していく

式1がtrue → 式2を値にする

式1がfalse → 式3を値にする

もしくは

(式1) ? '(式3)'というように真ん中を抜く形も可能

その場合は

式1がtrue → 式1を値にする

式1がfalse → 式3を値にする

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

オブジェクト指向で書き換える

名前空間を使う際の注意

PHPの標準クラス(ExceptionやDateTimeなど)は名前空間の一番上位から呼び出さなければならない。

名前空間の区切り文字( \ )をクラス名の前に入れる。

 

・ index.phpからCalendar.phpを呼び出すとき

requireを用いるのとCalendar.php内のCalendarクラスをインスタンス化するのを忘れない。

Calendarクラスをインスタンス化→$calなど適当な変数に代入

Calendarクラス内のprev変数を呼び出したい

 $cal → prevのようになる。

 

private, public, protectedなどのアクセス権についてきちんと理解する。

プロパティやメソッドの前に用いてアクセス権を指定する

private → 自身のクラス内でのみ呼び出しが可能

public → 外部のクラスやファイルからでも呼び出しが可能

protected → 自身のクラスと継承する子クラス(子クラスに変数を定義していたらその親クラス)から呼び出しが可能

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

まとめ

今回まとめていて、一番ふわっとした理解になっているところ(アロー演算子の部分)

オブジェクト指向を(用語を含めて)きちんと理解することと、その処理の中身を手続き型とオブジェクト指向型の両方で理解していくことが大切なのかもと思い、改めて道のりの長さを感じたところでした。

PHPでデータベースを使う。

今回はdotinstallのPHPデータベース入門の#1~#13について。

 

PDO=PHP Data Objectの略

拡張モジュールの一種で、PHPの中からデータベースに接続する

PDOを使う際の注意

PHP7にはSQLiteがデフォルトで有効になっているのでMySQLを有効にする。

php-mysqlndとphp-fpmをインストールする(どちらもPHPインストールの時に一緒にインストールすると便利)

個別にインストールする場合は、php-fpmのインストール後に

systemctl restart httpd.serviceで再起動させると有効になる

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

まず、データベースの設定(mysql側で)をする。

・端末で$ mysql -u  root -pでルート権限に接続

mysql> create database ~

→データベースの作成(例 MenuList)

mysql> grant all on ~

→作成したデータベースに限って全権限を与えたユーザの作成

identified by でパスワードを付与しておく

(例 ユーザ名をchief01, パスワードをGG09F77)

・create table ~

→テーブルを作成。1つ以上の値などを指定しないとエラーになる。

例 

× create table menu;

○ create table menu(id int auto_increment primary key,name varchar(255),

   price int);

・一度quit; or \qでルート権限を抜ける

・端末で$ mysql -u chief01 -p  menuListと入力

→chief01のユーザ名でmenuListというデータベースに接続する。

・show tables

→テーブルの確認

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

次にPHP側でPDOを設定する。

(mysqlの操作画面を抜けてから)

PHPのファイルを作成

vagrant仮想マシンに接続しているので、その端末から操作する。

その場合、webサイトで確認したい内容であれば、ドキュメントルート

/var/www/html(CentOSの場合)の直下にphpファイルを保存する。

cd /var/www/htmlでディレクトリを移動

vim pricelist.phpなどとしてPHPファイルを作成

新しいファイル(pricelist.php)が編集可能になるので、それを編集する。

・define文でデータベースを定義する

 defineは定数を定義する際に使う。

 difine('DB_DATABASE', 'menuList');

 → データベースmenuListをDB_DATABASEに格納

 define('DB_USERNAME', 'chief01'); 

 → ユーザ名をDB_USERNAMEに格納

 define('DB_PASSWORD, 'GG09F77');

 →パスワードをDB_PASSWORDに格納

 define('PDO_DSN', 'mysql:host=localhost;dbname=' .DB_DATABASE');

 →PDO_DSNはデータベースに接続する情報が含まれたもの

 DataSourceNameの略

 DSNは各PDOドライバ(mySQLSQLite,PostgreSQLなどのSQL)

 の後にコロンが続き、そのあとに固有の接続構文が入る。

 hostのアドレスなどを入れる場合がある。

・defineで定数の定義を終えたらtry→catchでエラーモードの指定と例外処理の指定をする。

 try{

   $db = new(PDO_DSN, DB_USERNAME, DB_PASSWORD);

   $db = setAttribute(PDO:ATTR_ERRMODE,

                     PDO::ERRMODE_EXCEPTION);

→setAttributeで属性を設定、エラーモードをATTR_ERRMODE(エラーをレポートする)、ERRMODE_EXCEPTION(例外を投げる)というように設定する。

   }catch(PDOExeption $e){

                 echo $e->getMessage();

     exit;

}

→ 受け取った例外メッセージを出力する。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

exec()→これは結果を返す必要がない

query()→結果を返すが一回の関数コールのみで得られた結果セットを返す

prepare()→結果を返し、複数回の実行をする、安全対策が必要

     ユーザからの入力に対して悪意のあるコードに対する対策を行う

     statmentオブジェクト(容器の役目をする)が返ってくる。

     このオブジェクトにはexecute()というメソッドがあり、

     そちらに受け渡すと安全な形で値を埋め込むことができる

lastInserted()→最後に挿入したレコードのIDを引っ張ってくる関数

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

名前付きパラメータ

prepareに対して名前付きパラメータを設定できる

$stmt = prepare("inser into テーブル名(name, score) values (:name, :score);

$stmt ->execute([':name'=>'tanaka', ':score'=>65]);

 

パラメータの定義には2種類ある

(?, ?)→valuesの後の()内に?を入れる、使いやすくてシンプル

(:変数1, :変数2)→()内に:に続いて値を入れたい変数を入れる

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

bindValueとbindParam

bindValueは値を紐づけする関数

bindParamはパラメータを紐づけし、変数も参照として紐づけしてexecute()が実行されたときにそのパラメータを評価する。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

query()での抽出 query→結果は返すが一回の実行のみの関数

$stmt = $db->query("select from user");というように指定

 

fetchall → 全ての結果行を含む配列を返す

fetch_assoc→帰ってきた値のカラム名で添え字をつけた配列を返す

fetchallで抽出する文にはforeachが使える

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

条件付きでの抽出 prepare()を使う

$stmt = prepare(指定文)→抽出したい部分を?にする(数字の抽出)

execute([?の中身を挿入]);

文字の抽出も同じようにできる

スコアを降順に並べて上位1位の数字を取り出す

$stmt = prepare("select score from テーブル名 order by score desc limit ?")

これはこのままexecuteするとエラーになる(解釈がうまくいかない)

bindValueで紐づけする

$stmt->bindValue(1,1, PDO::PARAM_INT)

$stmt->execute();

で文の解釈がうまくいく

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

FETCH CLASS

抽出したデータを任意のクラスに直接セットする

class User(){

public function show(){echo "$this->name($this->score));

}

}

$stmt = $db->query("select * from テーブル名);

$テーブル名 = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');

 

省いているところがあるが、query関数で呼び出した結果を$stmtに代入し、

それをテーブルの中に代入するという式

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

更新と削除

特定の名前に対してスコアを更新する

$stmt = $db->prepare("update テーブル名 set score = :score where name = :name);

$stmt->execute([':score'=>100, ':name'=>'tanaka']);

特定の名前を削除する

$stmt = $db->prepare("delete from テーブル名  name = :name);

$stmt->execute([':name'=>'satou']);

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

トランザクション

ある処理を行う際にその処理が必ず行われることを保証する

処理の前に

$db->beginTransaction();

としてその続きに処理を書く

処理の記述の後に$db->commit(正しければ反映する)と記述

また、例外処理のところにもし処理を間違えても元に戻したいという記述をする場合

$db = rollback();

と記述する

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

〇まとめ

PHPとデータベースを関連付けて操作する方法についてはだいぶ理解ができたので、

あとは実際に0から作ってみたときにどこにつまずくのかをしっかりと把握しておきたい。関数とオブジェクトのあたりでどの関数を使うかを迷いそうな気もするのできちんと復習しておく。