LOAD DATA INFILEでファイル名を動的に指定する方法はありますか?たとえば、パラメータ化できますか(構文が正しくない可能性があります)LOAD DATA INFILE'$ filename'?
4 に答える
MySQL ドキュメントからの引用:
LOAD DATA INFILE ステートメントは、テキスト ファイルからテーブルに非常に高速で行を読み込みます。ファイル名はリテラル文字列として指定する必要があります。
つまり、準備済みステートメントのパラメーターにすることはできません。しかし、ステートメントが PHP コード内の単なる文字列である場合に、文字列補間を行うことを禁止する人はいません。
または、ファイルの一時コピーを作成することもできます (BATCH の例):
LOAD_DATA.bat
COPY %1 TempFileToLoad.csv
mysql --user=myuser --password=mypass MyDatabase < ScriptLoadMyDatabase.sql
DEL TempFileToLoad.csv
SQL(情報用):
ScriptLoadMyDatabase.sql
load data infile 'TempFileToLoad.csv' IGNORE
into table tLoad
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
lines terminated by '\r\n'
IGNORE 1 LINES
(@DateCrea, NomClient, PrenomClient, TypeMvt, @Montant, NumeroClient)
set DateCrea = str_to_date(@DateCrea, '%Y-%m-%d'), Montant = (round(@Montant / 1000)*2) ;
そして、SendTo windows フォルダに BAT ファイルへのリンクを配置しました。
残念ながら、この機能は MySQL ではまだサポートされておらず、現在バグ/機能リクエスト #39115 http://bugs.mysql.com/bug.php?id=39115としてリストされています。
スクリプトで使用できるかどうかを尋ねている場合。phpで次のようなことができます:
<?php
$mysqli = new mysqli("host", "user", "pwd", "db");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql = "CREATE TABLE number1 (id INT PRIMARY KEY auto_increment,data TEXT)";
if ($result = $mysqli->query($sql)) {
} else {
printf("<br>%s",$mysqli->error);
}
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$filename = "data.csv";
$sql = "LOAD DATA LOCAL INFILE '$host$uri$filename' INTO TABLE number1";
if ($result = $mysqli->query($sql)) {
} else {
printf("<br>%s",$mysqli->error);
}
// Close the DB connection
$mysqli->close();
exit;
%>
ファイルがスクリプトと同じフォルダーにある場合は、$host$uri$filename の代わりに $filename a を使用します。使用しているいくつかのスクリプトからこれを簡単にまとめました。デバッグなしで機能しない場合は申し訳ありませんが、かなり近いはずです。mysqli が必要です。