PHPからMariaDB(MySQL)へ接続
公開日:2019-07-03
更新日:2020-07-21
更新日:2020-07-21
1. 概要
PHP から MariaDB(MySQL)への接続を行います。
2. 接続確認プログラムの作成
DB は、前回の「MariaDB(MySQL) のインストール」で作成したものを使います。
作成後、http://192.168.233.100/db.php にアクセスすると、
HTTP ERROR 500 のエラーになります。
vi /var/www/html/db.php
を実行して、以下のファイルを作成します。<?php
$db = new PDO('mysql:dbname=db_test; host=127.0.0.1;port=3306', 'root', 'root');
$sql = 'select * from d_data where data = :data';
$stmt = $db->prepare($sql);
$stmt->bindValue(':data', 'bbbb');
$result = $stmt->execute();
$dataList = [];
while($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$dataList[] = $data;
}
var_dump($dataList);
作成後、http://192.168.233.100/db.php にアクセスすると、
HTTP ERROR 500 のエラーになります。
3. PHP のエラーの表示
エラーは以下で確認できます。
今回はテスト環境のため、画面にエラーが出るようにします。
/etc/php.ini の display_errors が Off になっているため、On にします。
本番環境では Off のままにしてください。
vi /etc/php.ini
php.ini の修正後、apache を再起動します。
http://192.168.233.100/db.php にアクセスするとエラーの詳細が表示されます。
tail /etc/httpd/logs/error_log
今回はテスト環境のため、画面にエラーが出るようにします。
/etc/php.ini の display_errors が Off になっているため、On にします。
本番環境では Off のままにしてください。
vi /etc/php.ini
display_errors = On
php.ini の修正後、apache を再起動します。
systemctl restart httpd
http://192.168.233.100/db.php にアクセスするとエラーの詳細が表示されます。
Fatal error: Uncaught Error: Class 'PDO' not found in /var/www/html/db.php:2
Stack trace: #0 {main} thrown in /var/www/html/db.php on line 2
PDO が見つからないと言われています。4. PDO の有効化
必要なモジュールをインストールします。
1. pdo のインストール
1. pdo のインストール
インストール
yum install --enablerepo=remi-php74 php-pdo
インストール先の確認
rpm -ql php-pdo
インストール先
php.d 配下に .ini があるため、php.ini の修正は不要です。
/etc/php-zts.d/20-pdo.ini
/etc/php-zts.d/20-sqlite3.ini
/etc/php-zts.d/30-pdo_sqlite.ini
/etc/php.d/20-pdo.ini
/etc/php.d/20-sqlite3.ini
/etc/php.d/30-pdo_sqlite.ini
/usr/lib64/php-zts/modules/pdo.so
/usr/lib64/php-zts/modules/pdo_sqlite.so
/usr/lib64/php-zts/modules/sqlite3.so
/usr/lib64/php/modules/pdo.so
/usr/lib64/php/modules/pdo_sqlite.so
/usr/lib64/php/modules/sqlite3.so
2. mysqlnd のインストール
インストール
yum install --enablerepo=remi-php74 php-mysqlnd
インストール先の確認
rpm -ql php-mysqlnd
インストール先
php.d 配下に .ini があるため、php.ini の修正は不要です。
/etc/php-zts.d/20-mysqlnd.ini
/etc/php-zts.d/30-mysqli.ini
/etc/php-zts.d/30-pdo_mysql.ini
/etc/php.d/20-mysqlnd.ini
/etc/php.d/30-mysqli.ini
/etc/php.d/30-pdo_mysql.ini
/usr/lib64/php-zts/modules/mysqli.so
/usr/lib64/php-zts/modules/mysqlnd.so
/usr/lib64/php-zts/modules/pdo_mysql.so
/usr/lib64/php/modules/mysqli.so
/usr/lib64/php/modules/mysqlnd.so
/usr/lib64/php/modules/pdo_mysql.so
3. モジュールの読み込みの確認
apache を再起動します。
systemctl restart httpd
phpinfo() を確認して、PDO, pdo_mysql, mysqlnd のセクションが追加されていれば OK です。
http://192.168.233.100/db.php にアクセスすると、エラーが以下のように変わります。
db.php 2行目で、DB の接続が拒否されています。
Fatal error: Uncaught PDOException:
SQLSTATE[HY000] [2002] Permission denied in /var/www/html/db.php:2
Stack trace: #0 /var/www/html/db.php(2):
PDO->__construct('mysql:dbname=db...', 'root', 'root') #1 {main} thrown in /var/www/html/db.php on line 2
yum install --enablerepo=remi-php74 php-pdo
インストール先の確認
rpm -ql php-pdo
インストール先
php.d 配下に .ini があるため、php.ini の修正は不要です。
/etc/php-zts.d/20-pdo.ini
/etc/php-zts.d/20-sqlite3.ini
/etc/php-zts.d/30-pdo_sqlite.ini
/etc/php.d/20-pdo.ini
/etc/php.d/20-sqlite3.ini
/etc/php.d/30-pdo_sqlite.ini
/usr/lib64/php-zts/modules/pdo.so
/usr/lib64/php-zts/modules/pdo_sqlite.so
/usr/lib64/php-zts/modules/sqlite3.so
/usr/lib64/php/modules/pdo.so
/usr/lib64/php/modules/pdo_sqlite.so
/usr/lib64/php/modules/sqlite3.so
インストール
インストール先の確認
インストール先
php.d 配下に .ini があるため、php.ini の修正は不要です。
yum install --enablerepo=remi-php74 php-mysqlnd
インストール先の確認
rpm -ql php-mysqlnd
インストール先
php.d 配下に .ini があるため、php.ini の修正は不要です。
/etc/php-zts.d/20-mysqlnd.ini
/etc/php-zts.d/30-mysqli.ini
/etc/php-zts.d/30-pdo_mysql.ini
/etc/php.d/20-mysqlnd.ini
/etc/php.d/30-mysqli.ini
/etc/php.d/30-pdo_mysql.ini
/usr/lib64/php-zts/modules/mysqli.so
/usr/lib64/php-zts/modules/mysqlnd.so
/usr/lib64/php-zts/modules/pdo_mysql.so
/usr/lib64/php/modules/mysqli.so
/usr/lib64/php/modules/mysqlnd.so
/usr/lib64/php/modules/pdo_mysql.so
3. モジュールの読み込みの確認
apache を再起動します。
systemctl restart httpd
phpinfo() を確認して、PDO, pdo_mysql, mysqlnd のセクションが追加されていれば OK です。
http://192.168.233.100/db.php にアクセスすると、エラーが以下のように変わります。
db.php 2行目で、DB の接続が拒否されています。
Fatal error: Uncaught PDOException:
SQLSTATE[HY000] [2002] Permission denied in /var/www/html/db.php:2
Stack trace: #0 /var/www/html/db.php(2):
PDO->__construct('mysql:dbname=db...', 'root', 'root') #1 {main} thrown in /var/www/html/db.php on line 2
systemctl restart httpd
phpinfo() を確認して、PDO, pdo_mysql, mysqlnd のセクションが追加されていれば OK です。
http://192.168.233.100/db.php にアクセスすると、エラーが以下のように変わります。
db.php 2行目で、DB の接続が拒否されています。
Fatal error: Uncaught PDOException:
SQLSTATE[HY000] [2002] Permission denied in /var/www/html/db.php:2
Stack trace: #0 /var/www/html/db.php(2):
PDO->__construct('mysql:dbname=db...', 'root', 'root') #1 {main} thrown in /var/www/html/db.php on line 2
5. SELinux の設定変更
SELinux(SUSE Linux とは無関係)を使うと、詳細なアクセス制御が行えます。
これにより、DB 接続時に Permission denied が発生しているため、設定を変更します。
以下のコマンドを実行して、httpd からのネットワーク接続を可能にします。
http://192.168.233.100/db.php にアクセスすると、正常に結果が表示されます。
apache の再起動は不要です。
また、エラーの原因が SELinux かどうかは、一時的に SELinux を無効にすることで判断することができます。
テスト環境やセキュリティー的に問題ない場合は、無効のままでも良いかもしれません。
これにより、DB 接続時に Permission denied が発生しているため、設定を変更します。
以下のコマンドを実行して、httpd からのネットワーク接続を可能にします。
setsebool -P httpd_can_network_connect 1
-P 永続化http://192.168.233.100/db.php にアクセスすると、正常に結果が表示されます。
apache の再起動は不要です。
また、エラーの原因が SELinux かどうかは、一時的に SELinux を無効にすることで判断することができます。
テスト環境やセキュリティー的に問題ない場合は、無効のままでも良いかもしれません。
setenforce 0 無効化
setenforce 1 有効化
getenforce 取得

