2012-08-27 32 views
0

我有一個腳本,可以將表克隆到來自主SQL轉儲文件的唯一命名的MySQL數據庫。每個帳戶都有自己的數據庫,但所有帳戶的表結構都相同。我的解決方案是轉儲master數據庫表,然後通過PHP shell_exec,運行MySQL控制器cmd(mysql)以使用默認表填充新創建的數據庫。將可變數據從PHP傳遞到shell_exec命令

問題:只有當我在主SQL轉儲文件中對帳戶唯一數據庫名稱進行硬編碼時,該過程才起作用。

但是,主SQL文件中的「USE acct_dbID」行需要在運行時動態設置。

下面是代碼:

include('.dbase_credentials'); //constants for connection object 

//using PHP built in connection class mysqli 
$mysqli = new mysqli(DB_HOST,DB_UNAME,DB_UPWORD,DB_NAME); 
if ($mysqli->connect_errno){ 
    echo "Failed to open database connection: ".$mysqli->connect_error; 
    exit(); 
} 

$dbID=$varNum; //variable, number ID generated earlier in the account setup process 

//create database, doesnt return a resultset, no need for object var here 
if ($mysqli->query("CREATE DATABASE acct_".$dbID) === TRUE){ 

    //if dbase was created, clone the tables 
    $res = shell_exec('mysql -u dbaseUser --password=`cat /path/to/pass` -e "source /path/to/master_tables.sql" acct_'.$dbID); 

    //provide some UI feedback, shell_exec returns null on failure 
    if ($res!=null){ 
     echo "The tables were cloned!"; 
    }else{ 
     echo "The cloning process failed!"; 
    } 
}else{ 
    echo "no database created."; 
} 

如此反覆,master_tables.sql需要可變數據通過它在運行時,因此「USE acct_dbID」可以具體到每個新帳戶。

任何想法表示讚賞。 rwhite35

+0

那麼,你從哪裏得到這個acct_dbId? – thatidiotguy

+0

形成一個較早的過程。該過程在帳戶的主數據庫中設置帳戶ID。 dbID是一個以acct_開頭的數字。 – rwhite35

+0

好吧,您爲什麼不查詢account_ids的這個master數據庫並遍歷它們,爲每個表創建這個表? – thatidiotguy

回答

0

knittl有正確的方向,我需要做的事情。請參閱上面的評論對話。感謝knittl。 以下是使用multi_query和file_get_contents的新代碼塊。

if ($mysqli->query("CREATE DATABASE acct_".$dbID) === TRUE){ 
$acct="acct_".$dbID; 
$query = "USE ".$acct.";"; 
$query .= file_get_contents('/path/to/master_table.sql'); 
$result=$mysqli->multi_query($query);   
} 

目前佔可變量,multi_query將運行字符串中的每個查詢語句。我可能會失去一些效率,但可以爲每個新帳戶克隆表格。唯一的附加編輯是master_table.sql。我刪除了轉儲進程添加的所有註釋。 謝謝, rwhite35