今回はPHPからMySQLに接続する方法を紹介します。
接続種類
PHPからMySQLに接続するとき、以下の三つ方法があります。
①の方は今回は紹介しない。
①phpのmysql拡張(PHP7.0以降廃止)
②phpのmysqli拡張
③PDO拡張
mysqli拡張
簡単のINSERT,DELETE,UPDATA,SELECTを実行できる実装コードを参考してください。
※異常処理を省略している。
<?php
class MySQLDB {
private $host;
private $port;
private $username;
private $pwd;
private $dbname;
private $dbcharset;
private $dblink;
private static $instance;
private function __construct($param){
$this->initParam($param);
$this->initConnect();
}
private function __clone(){}
// インスタンス取得
public static function getInstance($param=array()) {
if (!self::$instance instanceof self)
self::$instance = new self($param);
return self::$instance;
}
// パラメータ初期化
private function initParam($param) {
$this->host=$param[‘host’]??’127.0.0.1′;
$this->port=$param[‘port’]??’3306′;
$this->username=$param[‘username’]??”;
$this->pwd=$param[‘pwd’]??”;
$this->dbname=$param[‘dbname’]??”;
$this->dbcharset=$param[‘charset’]??’utf8′;
}
// データベース接続
private function initConnect() {
$this->dblink=@mysqli_connect($this->host,$this->username,$this->pwd,$this->dbname,$this->port);
if (mysqli_connect_error()) {
// エラー処理
echo ‘connect error<br>’;
exit;
}
mysqli_set_charset($this->dblink,$this->dbcharset);
}
// SQL実行
private function execSQL($sql) {
if (!$rs=mysqli_query($this->dblink,$sql)) {
// エラー処理
echo ‘sql error<br>’;
exit;
}
return $rs;
}
// 検索系SQL実行
private function execQuerySQL($sql) {
$exec_key=strtoupper(substr(trim($sql), 0, 6));
if ($exec_key === ‘SELECT’) {
return $this->execSQL($sql);
}
return false;
}
// 配列の型
private function getType($type) {
switch($type) {
case ‘num’:
return MYSQLI_NUM;
case ‘both’:
return MYSQLI_BOTH;
default:
return MYSQLI_ASSOC;
}
}
/*
* INSERT,DELETE,UPDATE文実行
* @return bool true:success, false: error
*/
public function execUpdate($sql) {
$sql_key=array(‘INSERT’, ‘UPDATE’,’DELETE’);
$exec_key=strtoupper(substr(trim($sql), 0, 6));
if (in_array($exec_key, $sql_key)) {
return $this->execSQL($sql);
}
return false;
}
/*
* 2次元配列データ取得(複数行)
* @$sql string sql文
* @$type string assoc|num|both
*/
public function fetchAll($sql, $type=’assoc’) {
$rs=$this->execQuerySQL($sql);
$mode=$this->getType($type);
return mysqli_fetch_all($rs, $mode);
}
/*
* 1次元配列データ取得(1行)
* @$sql string sql文
* @$type string assoc|num|both
*/
public function fetchRow($sql, $type=’assoc’) {
$result_list=$this->fetchAll($sql, $type);
if (!empty($result_list)) {
return $result_list[0];
}
return array();
}
/*
* 1カラムデータ取得
* @$sql string sql文
*/
public function fetchColumn($sql) {
$result_list=$this->fetchRow($sql, ‘num’);
if (!empty($result_list)) {
return $result_list[0];
}
return null;
}
}
使用例:
$param=array(
‘host’=>”,
‘username’=>”,
‘pwd’=>”,
‘dbname’=>”
);
$db=MySQLDB::getInstance($param);
$db->execUpdate(‘UPDATE テーブル名 set ..’);
$result = $db->fetchAll(‘select * from テーブル名’);
$result = $db->fetchRow(“select * from テーブル名 where ..”);
$result = $db->fetchColumn(“select カラム名 from テーブル名 where ..”);
class MySQLDB {
private $host;
private $port;
private $username;
private $pwd;
private $dbname;
private $dbcharset;
private $dblink;
private static $instance;
private function __construct($param){
$this->initParam($param);
$this->initConnect();
}
private function __clone(){}
// インスタンス取得
public static function getInstance($param=array()) {
if (!self::$instance instanceof self)
self::$instance = new self($param);
return self::$instance;
}
// パラメータ初期化
private function initParam($param) {
$this->host=$param[‘host’]??’127.0.0.1′;
$this->port=$param[‘port’]??’3306′;
$this->username=$param[‘username’]??”;
$this->pwd=$param[‘pwd’]??”;
$this->dbname=$param[‘dbname’]??”;
$this->dbcharset=$param[‘charset’]??’utf8′;
}
// データベース接続
private function initConnect() {
$this->dblink=@mysqli_connect($this->host,$this->username,$this->pwd,$this->dbname,$this->port);
if (mysqli_connect_error()) {
// エラー処理
echo ‘connect error<br>’;
exit;
}
mysqli_set_charset($this->dblink,$this->dbcharset);
}
// SQL実行
private function execSQL($sql) {
if (!$rs=mysqli_query($this->dblink,$sql)) {
// エラー処理
echo ‘sql error<br>’;
exit;
}
return $rs;
}
// 検索系SQL実行
private function execQuerySQL($sql) {
$exec_key=strtoupper(substr(trim($sql), 0, 6));
if ($exec_key === ‘SELECT’) {
return $this->execSQL($sql);
}
return false;
}
// 配列の型
private function getType($type) {
switch($type) {
case ‘num’:
return MYSQLI_NUM;
case ‘both’:
return MYSQLI_BOTH;
default:
return MYSQLI_ASSOC;
}
}
/*
* INSERT,DELETE,UPDATE文実行
* @return bool true:success, false: error
*/
public function execUpdate($sql) {
$sql_key=array(‘INSERT’, ‘UPDATE’,’DELETE’);
$exec_key=strtoupper(substr(trim($sql), 0, 6));
if (in_array($exec_key, $sql_key)) {
return $this->execSQL($sql);
}
return false;
}
/*
* 2次元配列データ取得(複数行)
* @$sql string sql文
* @$type string assoc|num|both
*/
public function fetchAll($sql, $type=’assoc’) {
$rs=$this->execQuerySQL($sql);
$mode=$this->getType($type);
return mysqli_fetch_all($rs, $mode);
}
/*
* 1次元配列データ取得(1行)
* @$sql string sql文
* @$type string assoc|num|both
*/
public function fetchRow($sql, $type=’assoc’) {
$result_list=$this->fetchAll($sql, $type);
if (!empty($result_list)) {
return $result_list[0];
}
return array();
}
/*
* 1カラムデータ取得
* @$sql string sql文
*/
public function fetchColumn($sql) {
$result_list=$this->fetchRow($sql, ‘num’);
if (!empty($result_list)) {
return $result_list[0];
}
return null;
}
}
使用例:
$param=array(
‘host’=>”,
‘username’=>”,
‘pwd’=>”,
‘dbname’=>”
);
$db=MySQLDB::getInstance($param);
$db->execUpdate(‘UPDATE テーブル名 set ..’);
$result = $db->fetchAll(‘select * from テーブル名’);
$result = $db->fetchRow(“select * from テーブル名 where ..”);
$result = $db->fetchColumn(“select カラム名 from テーブル名 where ..”);
PDO拡張
PDO拡張は以下の三つクラスを紹介します。
1) PDOクラス:
PHP とデータベースサーバーの間の接続
2) PDOStatementクラス:
①結果セット
②プリペアドステートメント
3) PDOExceptionクラス:
PDO が発するエラー
PDO初期化
$dns=”mysql:host=xxxx;port=3306;dbname=xxxx;charset=utf8″;
$pdo = new PDO($dns, ‘username‘, ‘password‘);
$pdo = new PDO($dns, ‘username‘, ‘password‘);
INSERT,DELETE,UPDATE文実行
$result=$pdo->exec(SQL文);
//作用した行数を返す。falseを返す可能性がある
//作用した行数を返す。falseを返す可能性がある
SELECT文実行
2次元配列
$pdoStmt =$pdo->query(‘SQL文’);
$result = $pdoStmt->fetchAll(); // 2次元配列
$result = $pdoStmt->fetchAll(PDO::FETCH_ASSOC);
$result = $pdoStmt->fetchAll(PDO::FETCH_BOTH);
$result = $pdoStmt->fetchAll(PDO::FETCH_NUM);
$result = $pdoStmt->fetchAll(PDO::FETCH_OBJ);
1次元配列
$pdoStmt =$pdo->query(‘SQL文’);
$result = $pdoStmt->fetch();
$result = $pdoStmt->fetch(PDO::FETCH_NUM);
$result = $pdoStmt->fetch();
$result = $pdoStmt->fetch(PDO::FETCH_NUM);
単一カラム取得
$result = $pdoStmt->fetchColumn(列番号); //0~
総行数、総列数
// 総行数
$result = $pdoStmt->rowCount();
//総列数
$result = $pdoStmt->columnCount();
$result = $pdoStmt->rowCount();
//総列数
$result = $pdoStmt->columnCount();
PDOStatementループ
foreach($pdoStmt as $row) {
var_dump($row); //1行内容
}
var_dump($row); //1行内容
}
トランザクション
// トランザクション開始
$pdo->beginTransaction();
//更新処理
……..
// 正常の場合
$pdo->commit();
//異常の場合
$pdo->rollback();
$pdo->beginTransaction();
//更新処理
……..
// 正常の場合
$pdo->commit();
//異常の場合
$pdo->rollback();
SQL ステートメント
種類
以下の2種類があります。
$stmt = $pdo->prepare(“insert into table values(?,?,?,?,?,?,now(),now())”);
$stmt = $pdo->prepare(“insert into table values(:id,:name,:age,:address,:memo,’0′,now(),now())”);
$stmt = $pdo->prepare(“insert into table values(:id,:name,:age,:address,:memo,’0′,now(),now())”);
①のbindParam、bindValue
$stmt = $pdo->prepare(“insert into table values(?,?,?,?,?,?,now(),now())”);
$datas=[
[null,’123′,22,’tokyo’,’memo’],
[null,’124′,23,’tokyo1′,’memo1′],
[null,’125′,24,’tokyo2′,’memo2′]
];
foreach($datas as $data) {
$stmt->bindParam(1, $data[1]);
$stmt->bindParam(2, $data[2]);
$stmt->bindParam(3, $data[3]);
$stmt->bindParam(4, $data[4]);
$stmt->bindParam(5, $data[5]);
$stmt->bindValue(6, ‘0’);
$stmt->execute(); //実行
}
$datas=[
[null,’123′,22,’tokyo’,’memo’],
[null,’124′,23,’tokyo1′,’memo1′],
[null,’125′,24,’tokyo2′,’memo2′]
];
foreach($datas as $data) {
$stmt->bindParam(1, $data[1]);
$stmt->bindParam(2, $data[2]);
$stmt->bindParam(3, $data[3]);
$stmt->bindParam(4, $data[4]);
$stmt->bindParam(5, $data[5]);
$stmt->bindValue(6, ‘0’);
$stmt->execute(); //実行
}
①直接実行
$stmt = $pdo->prepare(“insert into table values(?,?,?,?,?,’0′,now(),now())”);
$datas=[
[null,’123′,22,’tokyo’,’memo’],
[null,’124′,23,’tokyo1′,’memo1′],
[null,’125′,24,’tokyo2′,’memo2′]
];
foreach($datas as $data) {
$stmt->execute($data); //実行
}
$datas=[
[null,’123′,22,’tokyo’,’memo’],
[null,’124′,23,’tokyo1′,’memo1′],
[null,’125′,24,’tokyo2′,’memo2′]
];
foreach($datas as $data) {
$stmt->execute($data); //実行
}
②のbindParam、bindValue
$stmt = $pdo->prepare(“insert into table values(:id,:name,:age,:address,:memo,:del_flg,now(),now())”);
$datas=[
[‘id’=>null,’name’=>’123′,’age’=>22,’address’=>’tokyo’,’memo’=>’memo’],
[‘id’=>null,’name’=>’124′,’age’=>32,’address’=>’tokyo3′,’memo’=>’memo3’]
];
foreach($datas as $data) {
$stmt->bindParam(‘:id’, $data[‘id’]);
$stmt->bindParam(‘:name’, $data[‘name’]);
$stmt->bindParam(‘:age’, $data[‘age’]);
$stmt->bindParam(‘:address’, $data[‘address’]);
$stmt->bindParam(‘:memo’, $data[‘memo’]);
$stmt->bindValue(‘:del_flg’, ‘0’);
$stmt->execute(); //実行
}
$datas=[
[‘id’=>null,’name’=>’123′,’age’=>22,’address’=>’tokyo’,’memo’=>’memo’],
[‘id’=>null,’name’=>’124′,’age’=>32,’address’=>’tokyo3′,’memo’=>’memo3’]
];
foreach($datas as $data) {
$stmt->bindParam(‘:id’, $data[‘id’]);
$stmt->bindParam(‘:name’, $data[‘name’]);
$stmt->bindParam(‘:age’, $data[‘age’]);
$stmt->bindParam(‘:address’, $data[‘address’]);
$stmt->bindParam(‘:memo’, $data[‘memo’]);
$stmt->bindValue(‘:del_flg’, ‘0’);
$stmt->execute(); //実行
}
②の直接実行
$stmt = $pdo->prepare(“insert into table values(:id,:name,:age,:address,:memo,’0′,now(),now())”);
$datas=[
[‘id’=>null,’name’=>’123′,’age’=>22,’address’=>’tokyo’,’memo’=>’memo’],
[‘id’=>null,’name’=>’124′,’age’=>32,’address’=>’tokyo3′,’memo’=>’memo3’]
];
foreach($datas as $data) {
$stmt->execute($data); //実行
}
$datas=[
[‘id’=>null,’name’=>’123′,’age’=>22,’address’=>’tokyo’,’memo’=>’memo’],
[‘id’=>null,’name’=>’124′,’age’=>32,’address’=>’tokyo3′,’memo’=>’memo3’]
];
foreach($datas as $data) {
$stmt->execute($data); //実行
}
PDO異常処理
PDOでSQLを実行するとき、デフォルトはSQL実行エラーが異常とならないので、設定する必要です。
以下の二つ方法を紹介します。
①PDO対象作成時、パラメータ設定
$pdo = new PDO($dns, ‘username’, ‘password’, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
②メソッドで設定
$pdo = new PDO($dns, ‘username’, ‘password’);
$pdo->setAttribute(PDO::ATTR_ERRMODE, POD::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_ERRMODE, POD::ERRMODE_EXCEPTION);