2011-09-15 104 views
6
function cpanel_populate_database($dbname) 
{ 
    // populate database 
    $sql = file_get_contents(dirname(__FILE__) . '/PHP-Point-Of-Sale/database/database.sql'); 
    $mysqli->multi_query($sql); 

    $mysqli->close(); 
} 

sql文件是從phpMyAdmin直接導出的,大約95%的時間運行沒有問題,所有的表格都被創建並且數據被插入。 (我從頭開始創建一個數據庫)mysql multi_query間歇性失敗

其他5%只創建第一個表或有時創建前4個表,但沒有其他表創建(有30個表)。

我決定不使用multi_query,因爲它看起來有問題,並且在分號後的每一行上查看是否僅使用了mysql_query。有沒有人遇到這樣的問題?

回答

2

。特別是,我傾向於獲得似乎與外鍵相關的InnoDB 1005錯誤;這就好像MySQL在移動到下一個語句之前沒有完成一個語句,所以外鍵缺少適當的指示。

在一個系統中,我將有問題的語句分成他們自己的文件。在另一箇中,我確實分別運行了每個命令,分號分號:

function load_sql_file($basename, $db) { 
    // Todo: Trim comments from the end of a line 
    log_upgrade("Attempting to run the `$basename` upgrade."); 

    $filename = dirname(__FILE__)."/sql/$basename.sql"; 
    if (!file_exists($filename)) { 
     log_upgrade("Upgrade file `$filename` does not exist."); 
     return false; 
    } 

    $file_content = file($filename); 
    $query = ''; 
    foreach ($file_content as $sql_line) { 
     $tsl = trim($sql_line); 
     if ($sql_line and (substr($tsl, 0, 2) != '--') and (substr($tsl, 0, 1) != '#')) { 
      $query .= $sql_line; 
      if (substr($tsl, -1) == ';') { 
       set_time_limit(300); 
       $sql = trim($query, "\0.. ;"); 
       $result = $db->execute($sql); 
       if (!$result) { 
        log_upgrade("Failure in `$basename` upgrade:\n$sql"); 
        if ($error = $db->lastError()) { 
         log_upgrade("$error"); 
        } 

        return false; 
       } 

       $query = ''; 
      } 
     } 
    } 

    $remainder = trim($query); 
    if ($remainder) { 
     log_upgrade("Trailing text in `$basename` upgrade:\n$remainder"); 
     if (DEBUG) trigger_error('Trailing text in upgrade script: '.$remainder, E_USER_WARNING); 
     return false; 
    } 

    log_upgrade("`$basename` upgrade successful."); 
    return true; 
} 
0

我從來沒有訴諸多重查詢。當我需要這樣的事情時,我轉移到mysqli。此外,如果您不需要查詢的任何結果,則將腳本傳遞給mysql_query也將起作用。如果導出的錯誤順序與外鍵等需求表衝突,您也會得到這些錯誤。

0

我認爲將SQL文件分解爲單個查詢的方法是個好主意。即使它只是爲了比較目的(看看它是否能解決問題)。

另外,我不確定你的文件有多大 - 但是我有幾個案例,這個文件非常大,並且把它分成批處理。

12

快,我已經使用multi_query用它可以創建或更改表查詢時看到了類似的問題,有效

system('mysql -h #username# -u #username# -p #database# < #dump_file#');