我有一个脚本可以从主sql转储文件中将表克隆到唯一命名的MySQL数据库。每个帐户都有自己的数据库,但所有帐户的表结构都相同。我的解决方案是转储master数据库表,然后通过PHP shell_exec,运行MySQL控制器cmd(mysql)以使用默认表填充新创建的数据库。
问题:该过程有效但仅当我在主sql转储文件中对帐户唯一数据库名称进行硬编码时。
但是,master 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 :(得分:0)
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