高校のフットボール チームのスコアを更新するために、PHP/MySQL CSV アップローダー/アップデーターを作成しました。
Windows 7 の XAMPP でこのスクリプトを実行すると、「LOAD DATA INFILE」クエリのパーミッション エラーが発生しました。PHPMyAdmin 内で自分のアクセス許可を確認したところ、ユーザーはすべてのアクセス許可を持っていたので、そうではありませんでした。
まずその問題を解決する必要があります。PHPMyAdminで直接クエリを実行して、すべてをアップロードすることになりました。ただし、2 つのアップロード クエリを実行しようとすると、スクリプトがタイムアウトしました。
ここで行うプロセスは、ファイルをアップロードし、レコードを新しいテーブル (csv_data) にインポートすることです。次に、2 つの更新クエリを実行して、ゲーム テーブルを csv_data テーブルの新しいデータで更新します。
2 つのクエリの理由は、ホーム/ビジターに関する限り、間違ったチームが間違った列にあることがあるからです。CONCAT() を使用すると、実際に速度が低下することがわかりました。
そのため、最初に「LOAD DATA INFILE」クエリでアクセス許可の問題を修正してから、更新クエリを高速化する方法を見つける必要があります。何か案は?
<?php
require_once('global.php');
if (array_key_exists('submit', $_POST)) {
if ($_FILES['csv']['error'] > 0){
echo "Error: " . $_FILES['csv']['error'] . "</br>" . "You have not selected a file or there is another error.";
} else {
$tmp = $_FILES['csv']['tmp_name'];
}
if (!$_FILES['csv']['type'] == 'text/csv'){
echo "Please select a CSV File";
} else {
$location = dirname(__FILE__) . '/csv/' . basename($_FILES['csv']['name']);
move_uploaded_file($tmp, $location);
}
$errors = array();
// Need to get this query to work properly regarding permissions
$query = $db->prepare("LOAD DATA INFILE ?
INTO TABLE csv_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(game_week, home_team, home_score, visitor_team, visitor_score)");
if ($query->execute(array($location))) {
try {
// Need to figure out how to use LIKE instead of = and do it quickly
$query_two = $db->prepare("UPDATE game g, csv_data c, team home_team, team visit_team
SET g.game_home_score = c.home_score,
g.game_visitor_score = c.visitor_score,
g.game_complete = 'Y'
WHERE g.game_week = c.game_week
AND home_team.team_name LIKE CONCAT('%', c.home_team, '%')
AND home_team.team_id LIKE CONCAT('%', g.game_home_team, '%')
AND visit_team.team_name LIKE CONCAT('%', c.visitor_team, '%')
AND visit_team.team_id LIKE CONCAT('%', g.game_visitor_team, '%')");
if (!$query_two->execute()) {
$errors[] = 'The first update query failed.';
}
$query_three = $db->prepare("UPDATE game g, csv_data c, team home_team, team visit_team
SET g.game_home_score = c.visitor_score,
g.game_visitor_score = c.home_score,
g.game_complete = 'Y'
WHERE g.game_week = c.game_week
AND home_team.team_name LIKE CONCAT('%', c.visitor_team, '%')
AND home_team.team_id LIKE CONCAT('%', g.game_home_team, '%')
AND visit_team.team_name LIKE CONCAT('%', c.home_team, '%')
AND visit_team.team_id LIKE CONCAT('%', g.game_visitor_team, '%')");
if (!$query_three->execute()) {
$errors[] = 'The second update query failed.';
}
} catch(PDOException $e) {
echo $e->getMessage();
}
} else {
$errors[] = 'CSV Upload Query Failed.';
}
}
?>