PHPとMariaDBでLOAD DATA LOCAL INFILEを使う際のエラーと解決策
PHP、MariaDB、および LOAD DATA LOCAL INFILE に関する「LOAD DATA LOCAL INFILE が禁止されました」エラー
このエラーは、PHP または MariaDB のアップデート後に、LOAD DATA LOCAL INFILE
コマンドを実行しようとすると発生します。このコマンドは、ローカルファイルからデータをデータベースに読み込むために使用されますが、セキュリティ上の理由から、デフォルトで無効化されています。
原因
このエラーが発生する理由は、以下の2つが考えられます。
- PHP の設定
PHP 5.3.0 以降では、mysqli.allow_local_infile
という設定がデフォルトで false
に設定されています。この設定が false
の場合、LOAD DATA LOCAL INFILE
コマンドは実行できません。
- MariaDB の設定
MariaDB 10.2.2 以降では、secure_file_priv
という設定がデフォルトで /tmp
に設定されています。この設定は、LOAD DATA LOCAL INFILE
コマンドで読み込むことができるファイルの場所を指定します。デフォルトでは、/tmp
ディレクトリにのみアクセスできるため、その他の場所にあるファイルを読み込むことはできません。
解決策
このエラーを解決するには、以下の方法があります。
- PHP の設定を変更する
php.ini
ファイルを開き、mysqli.allow_local_infile
設定を true
に変更します。
mysqli.allow_local_infile = true
my.cnf
ファイルを開き、secure_file_priv
設定を、読み込みたいファイルのある場所に変更します。
secure_file_priv = /path/to/directory
注意事項
LOAD DATA LOCAL INFILE
コマンドは、セキュリティ上のリスクを伴います。このコマンドを使用する場合は、以下の点に注意してください。
- 読み込むファイルは、信頼できるソースからのものであることを確認してください。
代替方法
LOAD DATA LOCAL INFILE
コマンドを使用せずに、ローカルファイルからデータをデータベースに読み込む方法はいくつかあります。
- LOAD DATA INFILE コマンドを使用する
このコマンドは、リモートファイルからデータをデータベースに読み込むために使用されます。
- PHP のスクリプトを使用する
PHP のスクリプトを使用して、ファイルをデータベースに読み込むことができます。
- MySQL Workbench を使用する
MySQL Workbench は、MySQL データベースを管理するためのツールです。MySQL Workbench を使用して、ローカルファイルからデータをデータベースに読み込むことができます。
補足
このエラーは、PHP または MariaDB のバージョンによって異なる場合があります。詳細については、上記の参考資料を参照してください。
<?php
// データベースへの接続
$mysqli = new mysqli('localhost', 'root', 'password', 'database');
// ファイルのパス
$file_path = '/path/to/file.csv';
// LOAD DATA LOCAL INFILE コマンドの実行
$mysqli->query("LOAD DATA LOCAL INFILE '$file_path' INTO TABLE table_name");
// データベースへの接続を閉じる
$mysqli->close();
?>
このコードを実行する前に、以下の点を確認してください。
mysqli.allow_local_infile
設定がtrue
に設定されていることsecure_file_priv
設定が、読み込みたいファイルのある場所を指していること
このコードは、サンプルとして提供されています。必要に応じて、コードを変更してください。
LOAD DATA LOCAL INFILE コマンドの代替方法
例
<?php
// データベースへの接続
$mysqli = new mysqli('localhost', 'root', 'password', 'database');
// リモートファイルのパス
$file_path = 'https://example.com/file.csv';
// LOAD DATA INFILE コマンドの実行
$mysqli->query("LOAD DATA INFILE '$file_path' INTO TABLE table_name");
// データベースへの接続を閉じる
$mysqli->close();
?>
<?php
// ファイルのパス
$file_path = '/path/to/file.csv';
// ファイルを開く
$file = fopen($file_path, 'r');
// ファイルの内容をデータベースに読み込む
while (($data = fgetcsv($file)) !== FALSE) {
// データベースへの接続
$mysqli = new mysqli('localhost', 'root', 'password', 'database');
// データの挿入
$mysqli->query("INSERT INTO table_name (column1, column2) VALUES ('$data[0]', '$data[1]')");
// データベースへの接続を閉じる
$mysqli->close();
}
// ファイルを閉じる
fclose($file);
?>
手順
- データベースに接続します。
- データベースのナビゲーターで、テーブル を右クリックします。
- データのインポート を選択します。
- ファイルの場所 で、読み込みたいファイルを選択します。
- フォーマット で、CSV を選択します。
- オプション で、必要に応じて設定を変更します。
- 開始 をクリックします。
これらの方法は、それぞれメリットとデメリットがあります。どの方法を使用するかは、状況によって異なります。
php mariadb load-data-infile