Security Record

セキュリティ全般に関する情報を発信しています

PHPとMySQLの接続方法をいろいろ比較した

PHPの学習をしていた時、PHPとデータベースの色々なDB接続方法を調べたのでそれを纒めました。 かなり古い実装方法も記載してある為、万一この記事を参考にする場合は、非推奨と書かれていない方法で実装することをオススメします。

mysql_connect関数を使う(非推奨)

公式サイトによると、mysql_connectは PHP5.5.0で非推奨になり、PHP 7.0.0で削除されています。 よほど古いサイトの改修などに関わる時以外は使う事はまず無いでしょう。 他にもほとんどのmysql関数が非推奨または削除となっています。

// DBへ接続
$link = mysql_connect('localhost', 'user_name', 'password');
if(!$link){
    die("データベースの接続に失敗しました");
}

// データベースの選択
$db_selected = mysql_select_db('db_name' , $link);
if(!db_selected){
    die("データベースの選択に失敗しました");
}

// クエリの実行
$query  = "SELECT * FROM TABLE_NAME";
$result = mysql_query($query);

// 表示処理
while($row = mysql_fetch_assoc($result)){
    echo $row["name"];
}

// 接続を閉じる
mysql_close($link);

使用関数

mysqli関数(オブジェクト指向)

mysql_connectが削除されたのでその代替方法として用意されているのがmysqli関数です。 mysqli関数はオブジェクト指向手続き型の2パターンでの実装が可能です。これはmysql_connectからの移行を配慮して後方互換の為に残しておいたものらしいので、基本的にはオブジェクト指向の方で実装すれば良いかと思います。

// DBへ接続
$mysqli = new mysqli('localhost', user_name, password, db_name);
if (mysqli_connect_error()){
    die("データベースの接続に失敗しました");
}

// クエリの実行
$query = "SELECT * FROM TABLE_NAME";
$stmt  = $mysqli->prepare($query);
$stmt->execute();

// プリペアドステートメントに変数をバインドする
$stmt->bind_result($name, $email);

// 表示
while($stmt->fetch()){
    echo $name;
    echo $email;
}

// 接続を閉じる
$mysqli->close();

使用関数一覧

  • mysqli()
  • mysqli_connect_error()
  • prepare()
  • execute()
  • bind_result()
  • fetch()
  • close()

mysqli関数(手続き型)

// DBへ接続
$link = mysqli_connect('localhost', user_name, password, db_name);
if(!$link){
    die("データベースの接続に失敗しました");
}

// クエリの実行
$query = "SELECT * FROM TABLE_NAME";
$stmt  = mysqli_prepare($link, $query);
mysqli_stmt_execute($stmt);

// プリペアドステートメントに変数をバインドする
mysqli_stmt_bind_result($stmt, $name, $email);

// 表示
while(mysqli_stmt_fetch($stmt)){
    echo $name;
    echo $email;
}

// ステートメントを閉じる
mysqli_stmt_close($stmt);

// 接続を閉じる
mysqli_close($link);

使用関数一覧

  • mysqli_connect()
  • mysqli_prepare()
  • mysqli_stmt_execute()
  • mysqli_stmt_bind_result()
  • mysqli_stmt_close()
  • mysqli_close()

PDOを使用する

PDOとはPHP Data Objectsの略で、PHPからデータベースのアクセスを抽象化してくれるものです。PDOで実装したソースコードmysqlに依存しないので、他のデータベースに移行する場合も比較的容易になります。 特に理由が無ければPDOで実装すると良いかと思います。

$dsn      = 'mysql:dbname=db_name;host=localhost';
$user     = 'user_name';
$password = 'password';

// DBへ接続
try{
    $dbh = new PDO($dsn, $user, $password);

    // クエリの実行
    $query = "SELECT * FROM TABLE_NAME";
    $stmt = $dbh->query($query);

    // 表示処理
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        echo $row["name"];
    }

}catch(PDOException $e){
    print("データベースの接続に失敗しました".$e->getMessage());
    die();
}

// 接続を閉じる
$dbh = null;

サンプルソースにあるquerySQLを一行だけ実行する場合に使用します。 複数行まとめて実行する場合はexecを使用します。 PDO::exec()は複数行まとめて実行でPDO::query()一行実行です。

使用関数一覧

  • query()
  • fetch()
  • die()

まとめ

以前調べた時もmysql_connectは非推奨だったけど、いつの間にか完全に削除されてしまってました。 今はPDOを使用するのがベターな選択かと思いますが、その時の主流に合わせて最適な実装方法選択する必要があると思いました。