外部サーバのmariadbにphpで接続する方法


前提

・mariadbサーバーとphpサーバーがあるとする。

・mariadbサーバーにはmariadb(ポート番号3306を開放しておいてください),phpサーバーにはphpがインストールされている

・mariadbサーバーには接続確認のため、任意のテーブルを作成し、データを入れておいてください。

これからやること

mariadbサーバー側はデフォルトで、localhostしか参照できないようになっているので、
許可したいユーザーと接続元サーバの作成をして、
「このサーバー(今回でいうとphpサーバー)のこのユーザーからのアクセスは許可します」という設定が必要。

ユーザーと接続元サーバの作成

まずは許可したいユーザー(username)と接続元サーバ(192.168.10.1)の作成。
パスワードを指定したければ、IDENTIFIED BY "パスワード"で指定してください。

mysql>CREATE USER [email protected] IDENTIFIED BY "passwd";

作成できているのかを確認

ちゃんと作成できているのかを確認。以下のコマンドで、作成したuserが出てくればOK。

mysql>SELECT User,Host FROM mysql.user;

権限を付与

mysql>GRANT [権限種別] ON [データベース名].[テーブル名] TO [ユーザ名]@[接続元ホスト];

権限種別は外部記事を参考にしてください。

以下の例は、
「接続元「192.168.10.1」のユーザー名「username」には、testdbというデータベースのtesttableというテーブルに全ての権限(selectとかdeleteとか諸々全部)を与える」
という意味です。

mysql>GRANT ALL ON testdb.testtable TO [email protected];

PHPから接続

次にphpのあるサーバー(この例だと、192.168.10.1のはずです。)からpdoを用いて接続します。

phpファイルを作成し、接続を確認しましょう。

pdo.php

<?php
//ここのhostは接続先(mariadbサーバー)を指定.
//dbnameは作成したdb
$dsn = 'mysql:host=192.168.10.31;dbname=testdb';
//許可したいユーザー
$user = 'username';
$password = 'passwd';

try{
    $dbh = new PDO($dsn, $user, $password);
    $sql = 'select * from staffname';
    foreach ($dbh->query($sql) as $row) {
        print($row['id'].',');
        print($row['name']);
        print('<br />');
    }
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

$dbh = null;

?>

ここでinsertしておいたデータが表示され、接続できていることが確認できればOK