簡體   English   中英

在以PHP運行的MySQL文件中使用PHP會話變量?

[英]Using a PHP session variable within a MySQL file run in PHP?

這聽起來可能有點令人困惑,也許我正在做的事情根本不對,但是可以。

我們的用戶可以上傳包含學校數據的.csv文件,這些文件是從稱為SIMS的外部管理系統導出的。 一旦他們上傳了該文件,我想運行一個.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 ;
   }

下面是我的.sql文件的一部分,其中包含會話變量,該文件在PHP中運行。 由於大多數填充腳本在整個過程中都使用相同類型的命令,因此可能無法向您顯示所有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']變量中的文件路徑和文件名,但實際上並沒有執行任何操作。 是否可以通過PHP為文件名設置變量來操作此.sql文件的方法? 非常感謝!

經過長期,艱苦和廣泛的搜索,我們找到了一個(我們認為是唯一的)解決方案:創建一個函數來循環遍歷這些“迷你查詢”中的每一個,這似乎要高興得多現在! 我們實際上曾經遇到過這個建議,但是我們最初拒絕了它,因為它(並且確實)要花費很多時間來分離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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM