1

少しややこしく聞こえるかもしれませんし、私がしていることはまったく正しくないかもしれませんが、ここまでです。

ユーザーは、SIMS と呼ばれる外部管理システムからエクスポートされた、学校のデータを含む .csv ファイルをアップロードできます。彼らがそのファイルをアップロードしたら、このファイルで提供された情報でデータベースを更新する .sql スクリプトを実行したいと思います。私が行ったことは、ファイルのアップロード ページ (チャームのように機能します) で、以下に示すように、アップロードされたファイルのファイル パスと名前を含むセッション変数を作成することです (ファイル パスは空白になっています)。

$target_path = "xxx"; 

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path))
   {
     echo "<p>The file ".  basename( $_FILES['uploadedfile']['name']). " has been uploaded.</p>" ;
     echo "<p><a href='sqltest.php'>Click here</a> to upload your files into the database.</p>" ;

     $_SESSION['file'] = $target_path ;
   }

以下は、セッション変数を含む PHP 内で操作される .sql ファイルの一部です。この populate スクリプトのほとんどは全体を通して同じ種類のコマンドを使用するため、973 行のコードすべてを表示するのはおそらく意味がありません (もちろん、ページの上部でアクティブな session_start() があります)。

$filename = $_SESSION['file'] ;

mysqli_query($dbc, 'SET foreign_key_checks = 0') ;

$populate =

"CREATE TEMPORARY TABLE IF NOT EXISTS `mldb`.`TempSchool`
    (
        `CentreNo` INT UNSIGNED NOT NULL,
        `School` VARCHAR(255) NULL,
        `Street` VARCHAR(255) NULL,
        `Town` VARCHAR(255) NULL,
        `County` VARCHAR(255) NULL,
        `Postcode` VARCHAR(10) NULL,
        `Tel` VARCHAR(45) NULL,
        `URL` VARCHAR(512) NULL,
        `Email` VARCHAR(255) NULL,
        `Headteacher` VARCHAR(255) NULL,
        `LEA` VARCHAR(45) NULL,
        `LEANo` INT UNSIGNED NULL,
        `EstablishmentNo` INT UNSIGNED NULL,
        `URN` INT UNSIGNED NULL,
        `Governance` VARCHAR(45) NULL,
        `Phase` VARCHAR(45) NULL,
        PRIMARY KEY (`CentreNo`)
    )
    ENGINE = InnoDB ;

LOAD DATA INFILE '$filename'        
IGNORE INTO TABLE `TempSchool`                  
FIELDS TERMINATED BY ' , ' 
OPTIONALLY ENCLOSED BY ' \" '
LINES TERMINATED BY ' \r\n '                                
IGNORE 1 LINES  (etc...)                                            

コードの 25 行目 (LOAD DATA INFILE '$filename') でエラーが発生し、次のように表示されます。

Invalid query:You have an error in your SQL syntax; check the manual that corresponds to your MySQL   
server version for the right syntax to use near 'LOAD DATA INFILE   
'C:/Users/Public/Dropbox/mlwebfiles/Trial/uploads/MarksLive Set' at line 25

おそらく、$_SESSION['file'] 変数に格納されているファイル パスとファイル名を認識しているにもかかわらず、実際には何もしていないという事実と関係があります。この .sql ファイルがファイル名の変数を設定する PHP を介して操作できる方法はありますか? どうもありがとう!

4

1 に答える 1

0

長く懸命に、そして広範囲に検索した後、(私たちが唯一だと考えている) 解決策を見つけました。今!以前にこの提案に出くわしましたが、個々のデータベースの追加をすべて分割するために973行のコードを分離するには多くの時間がかかるため(実際にそうでした)、最初は拒否しました...

$populate = 
"
    CREATE TEMPORARY TABLE IF NOT EXISTS `mldb`.`TempSchool`
    (
        `CentreNo` INT UNSIGNED NOT NULL,
        `School` VARCHAR(255) NULL,
        `Street` VARCHAR(255) NULL,
        `Town` VARCHAR(255) NULL,
        `County` VARCHAR(255) NULL,
        `Postcode` VARCHAR(10) NULL,
        `Tel` VARCHAR(45) NULL,
        `URL` VARCHAR(512) NULL,
        `Email` VARCHAR(255) NULL,
        `Headteacher` VARCHAR(255) NULL,
        `LEA` VARCHAR(45) NULL,
        `LEANo` INT UNSIGNED NULL,
        `EstablishmentNo` INT UNSIGNED NULL,
        `URN` INT UNSIGNED NULL,
        `Governance` VARCHAR(45) NULL,
        `Phase` VARCHAR(45) NULL,
        PRIMARY KEY (`CentreNo`)
    )
    ENGINE = InnoDB ;

" ;
populate ($dbc, $populate);


$populate = 
"   
    LOAD DATA INFILE '$path'
    IGNORE INTO TABLE `mldb`.`TempSchool`
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '\"'
    LINES TERMINATED BY '\\r\\n'
    IGNORE 1 LINES
        (@AdNo, @UPN, @ULN, @UCI, @CandidateNo, @LegalSurname, @LegalForename, 
        @PreferredSurname, @PreferredForename, @Gender, @DOB, @Email,
        @InCare, @EverInCare, @FSM, @FSMEver6, @EAL, @SENStatus, @AMA,
        @Attendance, @RegGroup, @YearGroup, @EnteredYearDate, 
        @Class, @Subject, @Staff, @Initials, 
        CentreNo, School, Street, Town, County, Postcode, Tel, URL,
        Email, Headteacher, LEA, LEANo, EstablishmentNo, Governance, Phase)
" ;
populate ($dbc, $populate);
于 2013-11-06T10:22:21.133 に答える