WordPressでブログを運営しているにも関わらず、phpに関しての理解がイマイチだと自分で思ったことと、開発スピードを上げるために今の自分の知識以上の情報がほしかったのでよく利用するドットインストールさんの動画で応用編の内容をメモ書き。別ページで基本編も用意します。
phpmyadminを使ったデータベースの操作は:: phpmyadminを使ったMYSQLのSQL構文の入門編メモ書きで説明しています。
P.S ドットインストールさん、いつもありがとうございます。とっても勉強になっています!!
目次
データベースへの接続
データベース
DB接続のプログラム
1 2 3 4 5 6 7 8 9 10 |
try { $dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’, ‘dbuser001’, ‘dbpwd0001’); } catch (PDOException $e) { // 例外が発生したら処理を行う(catch) var_dump($e->getMessage()); // エラーの内容を詳細に表示する exit; // プログラムの終了 } echo “success!”; // 成功した場合の表示 $dbh = null; // DBとの接続を切断する場合 |
Exception (例外) とは
プログラミング言語には「Exception (例外)」という「異常な事態を上位のプログラムに伝えるための機構」が備わっているものが多い。
$dbh = new PDO( … ); の部分では、データベースに接続できないといったエラーが発生したときに PDOException という例外が発生する。
try … catch とは
その例外の発生を検知するために try … catch という構文が必要になる。
もし try … catch を使わずに書くと、例外が発生した時にそれを補足できず、「Uncaught Exception …」つまり「Exception (例外) が catch されなかった」という致命的なエラーが発生し、プログラムが異常終了しましまう。(いきなり画面が真っ白、とか。)
そのような事態にならないよう、例外が発生する可能性のある処理に対しては、きちんと try … catch 構文を使ってエラー処理をおこなう必要がある。
データを全件表示する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// データベースへの接続 try { $dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’, ‘dbuser001’, ‘dbpwd0001’); } catch (PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 $sql = “select * from users”; // usersテーブルから全フィールド(列、カラム)抽出 $stmt = $dbh->query($sql); // $sql文の実行 foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) { // 連想配列的にデータを取得 var_dump($user[‘name’]); } echo $dbh->query(“select count(*) from users”)->fetchColumn() . “records found”; // 件数を取得する // 切断 $dbh = null; |
実行結果: string(6) “tanaka” string(6) “suzuki” 2records found
※fetchAll: (全データを配列に変換)
※PDO: Php Date Objectの略。PDO::FETCH_ASSOC以外にもたくさんある。詳しくはWeblioを参照
データの挿入
複雑なSQLを書く場合にはプリペアードステートメントを利用することが推奨されている。
プレースホルダーを?とした場合の書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// データベースへの接続 try { $dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’, ‘dbuser001’, ‘dbpwd0001’); } catch (PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 $stmt = $dbh->prepare(“insert into users (name, email, password) values (?,?,?)”); $stmt->execute(array(“n”, “e”, “p”)); // n=name, e=email, p=passwordに挿入 echo “done”; // 切断 $dbh = null; |
※(?,?,?)はプレースホルダーと呼ばれる
分かりやすいプレースホルダーを使った書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// データベースへの接続 try { $dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’, ‘dbuser001’, ‘dbpwd0001’); } catch (PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 $stmt = $dbh->prepare(“insert into users (name, email, password) values (:name,:email,:password)”); $stmt->execute(array(“:name”=>”n2”, “:email”=>”e2”, “:password”=>”p2”)); echo “done”; // 切断 $dbh = null; |
プリペアードステートメントとbindParamを使ったデータ挿入方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// データベースへの接続 try { $dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’, ‘dbuser001’, ‘dbpwd0001’); } catch (PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 $stmt = $dbh->prepare(“insert into users (name, email, password) values (:name,:email,:password)”); $stmt->bindParam(“:name”, $name); // $stmt->bindParam(“:email”, $email); $stmt->bindParam(“:password”, $password); $name = “n10”; // $nameにn10を挿入 $email = “e10”; // $emailにe10を挿入 $password = “p10”; // $passwordにp10を挿入 $stmt->execute(); // プリペアドステートメントを実行 $name = “n10x”; $stmt->execute(); // プリペアドステートメントを実行 echo $dbh->lastInsertId(); // 最後にインサートされたIDを返す echo “done”; //終了 // 切断 $dbh = null; |
※bindParamとは、(':name', $name, PDO::PARAM_STR)
のように、一個目で :name のように与えたパラメータを指定。2個目に、それに入れる変数を指定します。bindParam には直接数値を入れれない変数のみです。3個目で型を指定。PDO::PARAM_STR は「文字列だよ」って事。
データの更新・削除
更新処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// データベースへの接続 try { $dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’, ‘dbuser001’, ‘dbpwd0001’); } catch (PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 $stmt = $dbh->prepare(“update users set email = :email where name like :name); $stmt->execute(array(“:email”=>”dummy”, “:name”=>”n%”)); echo “done”; // 切断 $dbh = null; |
削除処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// データベースへの接続 try { $dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’, ‘dbuser001’, ‘dbpwd0001’); } catch (PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 $stmt = $dbh->prepare(“delete from users where password = :password”); $stmt->execute(array(“:password”=>”p10”)); // passwordが「p10」のレコードを削除 echo $stmt->rowCount() . “records deleted”; // 削除された件数を表示 echo “done”; // 切断 $dbh = null; |
cookieを使う
cookieとはブラウザにデータを保存する仕組み。
setcookie(‘userName’, ‘tanaka’, time()+60*60*24*14); // 第3引数で有効期限を指定する。
setcookie(‘userName’, ”, time()-60); // 第3引数で-を指定するとcookieを削除する
echo $_COOKIE[‘userName’]; // COOKIEのセット
※第3引数が空の場合はブラウザを閉じたタイミングで削除される。上記のケースでは「60秒*60分*24時間*14日 = 2週間」となる
セッションを使う
セッションとは、サーバー側にデータを保存する仕組み
session_start();
$_SESSION[‘userName’] = “tanaka”; // セッションのセット
unset($_SESSION[‘userName’]); // unsetでセッションの削除
echo $_SESSION[‘userName’]
クラスを使う
オブジェクト指向の概念
クラス: オブジェクトの設計図
– メンバー変数
– メソッド(関数)
– コンストラクタ
インスタンス: クラスを実体化したもの
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class User { public $name; // class User内で使えるメンバー変数 public $email; // class User内で使えるメンバー変数 public function __contruct($name, $email) { //$nameと$emailはインスタンス化される時に呼ばれる引数 $this->name = $name; $this->email = $email; } public function sayHi() { //メソッドを定義 echo “hi! my name is ” . $this->name; } } $tom = new User(“tom”, “tom@dummy.com”); // 実態化する(インスタンスを作る)時はnewを使う $bob = new User(“bob”, “bob@dummy.com”); // 実態化する(インスタンスを作る)時はnewを使う echo $tom->name; // 変数、メソッドにアクセスする「->」 echo $tom->sayHi(); // hi! my name is tom // 呼び出し echo $bob->sayHi(); // hi! my name is bob // 呼び出し |
※thisとはクラス内で定義されたメンバー変数やメソッドにアクセスすることができる
※publicだとどこからアクセスされてもOK (実態化された後でも呼ぶことができる)
※privateだと実態化したあとに呼ぶことはできない
クラスを継承してサブクラスを作る
似たようなオブジェクトだが、1つをユーザから拡張したメソッドを使いたい場合などに使える。
継承クラスを作る場合は、「class クラス名 extends 継承元クラス名」で作ることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class User { // Userクラス public $name; protected $email; // Userクラスでも使えるし、継承されたSuperUserクラスでも使える public function __contruct($name, $email) { $this->name = $name; $this->email = $email; } public function sayHi() { echo “hi! my name is ” . $this->name; } } class SuperUser extends User { // Userクラスを継承している。上書きできる public function sayHi() { echo “HIIIIIIIIIIIIiiiiii! my name is ” . $this->name; } } $tom = new User(“tom”, “tom@dummy.com”); $bob = new SuperUser(“bob”, “bob@dummy.com”); $bob->sayHi(); // HIIIIIIIIIIIIiiiiii! my name is bob |
※protectedを使うと、Userクラスでも使えるし、継承されたSuperUserクラスでも呼び出すことができる
ファイルを分割する
ファイルが長くなってきた時に別のファイルで分割する方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
classファイル(user.class.php) class User { // Userクラス public $name; protected $email; // Userクラスでも使えるし、継承されたSuperUserクラスでも使える public function __contruct($name, $email) { $this->name = $name; $this->email = $email; } public function sayHi() { echo “hi! my name is ” . $this->name; } } class SuperUser extends User { // Userクラスを継承している。上書きできる public function sayHi() { echo “HIIIIIIIIIIIIiiiiii! my name is ” . $this->name; } } インスタンスファイル require_once(‘user.class.php’); // user.class.phpを読み込む $tom = new User(“tom”, “tom@dummy.com”); $bob = new SuperUser(“bob”, “bob@dummy.com”); $bob->supersayHi(); |
その他の読み込み方法とその違い
1 2 3 4 5 |
require(‘…’); // 途中でエラーが起きた場合に強制停止 require_once(‘…’); // 一度だけ読み込む include(); // 途中でエラーが起きた場合に警告して、処理は続行される include_once(); // 一度だけ読み込む |
LEAVE A REPLY