0

マスターSQLダンプファイルから一意の名前のMySQLデータベースにテーブルのクローンを作成するスクリプトがあります。各アカウントには独自のデータベースがありますが、テーブル構造はすべてのアカウントで同じです。私の解決策は、マスターデータベーステーブルをダンプしてから、PHP shell_execを使用して、MySQLコントローラーcmd(mysql)を実行し、新しく作成されたデータベースにデフォルトテーブルを設定することでした。

問題:プロセスは機能しますが、マスターSQLダンプファイルにアカウントの一意のデータベース名をハードコーディングした場合に限ります。

ただし、マスターSQLファイル内の「USEacct_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は実行時に渡される変数データを必要とするため、「USEacct_dbID」は新しいアカウントごとに固有にすることができます。

どんな考えでもありがたいです。rwhite35

4

1 に答える 1

0

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

于 2012-08-27T18:38:42.310 に答える