PHPからMySQLに接続する方法

PHP

今回は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 ..”);

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‘);

INSERT,DELETE,UPDATE文実行

$result=$pdo->exec(SQL文);
//作用した行数を返す。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->fetchColumn(列番号); //0~

総行数、総列数

// 総行数
$result = $pdoStmt->rowCount();
//総列数
$result = $pdoStmt->columnCount();

PDOStatementループ

foreach($pdoStmt as $row) {
 var_dump($row);   //1行内容
}

トランザクション

// トランザクション開始
$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())”);

①の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(); //実行
}

①直接実行

$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); //実行
}

②の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(); //実行
}

②の直接実行

$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); //実行
}

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);
タイトルとURLをコピーしました