いくつかのヒント:
-
廃止されたext/mysqlを使用しないでください 、ext/mysqliまたはPDOを使用できる場合。
-
csvファイル全体をPHP変数に読み込まないでください。ファイルが500MBの場合はどうなりますか?
-
組み込み関数
fgetcsv()> 。 -
外部ファイルのデータをSQLステートメントに補間しないでください。これには、SQLインジェクション のリスクがあります。 信頼できないユーザー入力を補間する場合と同じように、脆弱性。
-
MySQLの
データ入力の読み込み 指図。行ごとに挿入するよりも20倍高速です。
より簡単な解決策は次のとおりです。
<?php
$databasehost = "localhost";
$databasename = "test";
$databasetable = "sample";
$databaseusername="test";
$databasepassword = "";
$fieldseparator = ",";
$lineseparator = "\n";
$csvfile = "filename.csv";
if(!file_exists($csvfile)) {
die("File not found. Make sure you specified the correct path.");
}
try {
$pdo = new PDO("mysql:host=$databasehost;dbname=$databasename",
$databaseusername, $databasepassword,
array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
} catch (PDOException $e) {
die("database connection failed: ".$e->getMessage());
}
$affectedRows = $pdo->exec("
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
LINES TERMINATED BY ".$pdo->quote($lineseparator));
echo "Loaded a total of $affectedRows records from this csv file.\n";
?>
これをMacでPHP5.3.26でテストし、LinuxでMySQL5.6.14に接続しました。