PHP

PDOのまとめノート

More than 3 years have passed since last update.


参照/引用

「PHPとMySQLのツボとコツがゼッタイにわかる本」


PDOとは


  • データベース抽象化ライブラリ

  • データベースが違っても、同じ方法で扱える

  • ライブラリ自体が例外を通知してくれる。

  • データベース上のテーブルごとに継承したクラスを作成(アクセス処理を記述)

  • 例えば、userテーブルがあれば、UserRepositoryクラスを作成する


PDOStatementクラス

プリペアドステートメント、もしくは、SQL実行後の結果セットを表すクラス。


PDOを使った接続のひな形


SQL

•テスト用のDB

CREATE DATABASE salesmanagement DEFAULT CHARACTER SET utf8;

•テスト用のTABLE

CREATE TABLE goods(
GoodsID VARCHAR(4) NOT NULL,
GoodsName VARCHAR(20) NOT NULL,
Price INT NOT NULL,
PRIMARY KEY(GoodsID)
);



sample_pdo.php

<?php

$USER = 'root';
$PW = '*******';
$dnsinfo = "mysql:dbname=salesmanagement;host=localhost;charset=utf8";
try{
$pdo = new PDO($dnsinfo,$USER,$PW);
$sql = "INSERT INTO goods VALUES('1998','神秘的な鉛筆',300)";
$stmt = $pdo->prepare($sql);
$res = $stmt->execute(null);
}catch(Exception $e){
$res = $e->getMessage();
}

?>

<DOCTYPE html>
<head>
<title>PDOサンプル</title>
<meta charset="utf-8">
</head>

<body>
<h1>テーブルにレコード追加</h1>
<?php
if($res==TRUE){echo "OK";}
else if($res==FALSE){echo "NGだよ";}
else{echo $res;}
?>
</body>
</html>


ss.png

図引用:「PHPとMySQLのツボとコツがゼッタイにわかる本」


テーブルの全レコードを取り出すサンプル


read.php

<?php

$USER = 'root';
$PW = '*******';
$dnsinfo = "mysql:dbname=salesmanagement;host=localhost;charset=utf8";

try{
$pdo = new PDO($dnsinfo,$USER,$PW);

$sql = "SELECT * FROM goods";
$stmt = $pdo->prepare($sql);//prepare(準備するメソッド $sqlを引数に)
$stmt->execute(null);//executeメソッド 戻り値を使用しない
$res = "";
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
//連想配列を使う場合はFETCH_ASSOCを指定
$res .= $row['GoodsID'] ."," .$row['GoodsName'] ."," .$row['Price']."<br>";
}
}catch(PDOException $e){
$res = $e->getMessage();
}

?>

<!DOCTYPE html>
<html>
<head>
<title>始めよう</title>
<meta charset="UTF-8">
</head>
<body>
<h1>goodsテーブルの全レコードを選択する</h1>
<?php echo $res;?>
</body>
</html>


2.png


クラスを使ってすっきり書くひな形


db.php


<?php
class DB{
private $USER = "root";
private $PW = "*******";
private $dns = "mysql:dbname=salesmanagement;host=localhost;charset=utf8";

private function Connectdb(){
try{
$pdo = new PDO($this->dns,$this->USER,$this->PW);
return $pdo;
}catch(Exception $e){
return false;
}
}

public function executeSQL($sql,$array){
try{
if(!$pdo = $this->Connectdb())return false;
$stmt = $pdo->prepare($sql);
$stmt->execute($array);
return $stmt;
}catch(Exception $e){
return false;
}
}
}
?>



DBGoods.php


<?php
require_once('db.php');
class DBGoods extends DB{

public function InsertGoods(){
$sql = "INSERT INTO goods VALUES(?,?,?)";
$array = array($_POST['GoodsID'],$_POST['GoodsName'],$_POST['Price']);
parent::executeSQL($sql, $array);
}

public function SelectGoodsAll(){
$sql = "SELECT * FROM goods";
$res = parent::executeSQL($sql,null);
$records = "<table>\n";
while($row = $res->fetch(PDO::FETCH_ASSOC)){
$records .= "<tr><td>{$row['GoodsID']}</td>";
$records .= "<td>{$row['GoodsName']}</td>";
$records .= "<td>{$row['Price']}</td></tr>\n";
}
$records .= "</table>\n";
return $records;
}
}
?>



CR.php


<?php
require_once('DBGoods.php');
$dbGoods = new DBGoods();
//新規登録の処理
if(isset($_POST['insert'])){
$dbGoods->InsertGoods();
}
//全レコードを表示する処理
$recordlist = $dbGoods->SelectGoodsAll();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>クラスの活用</title>
</head>
<body>
<h1>C</h1>
<form action="" method="post">
<label>GoodsID<input type='text' name='GoodsID' size="8" required></label>
<label>GoodsName<input type='text' name='GoodsName' size="30" required></label>
<label>Price<input type='text' name='Price' size="8" required></label>
<input type='submit' name='insert' value=' 登録 '>
</form>
<hr />
<?php echo $recordlist;?>
<td></td>
</body>
</html>


3.png