【发布时间】:2012-08-22 04:57:46
【问题描述】:
我有一个脚本,可以将表从主 sql 转储文件克隆到唯一命名的 MySQL 数据库。每个帐户都有自己的数据库,但所有帐户的表结构都相同。我的解决方案是转储主数据库表,然后通过 PHP shell_exec,运行 MySQL 控制器 cmd (mysql) 以使用默认表填充新创建的数据库。
问题:该过程有效,但仅当我在主 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
【问题讨论】:
-
好吧,你从哪里得到这个 acct_dbId?
-
形成一个较早的进程。该过程在帐户的主数据库中设置帐户 ID。 dbID 是一个以 acct_ 为前缀的数字。
-
好吧,你为什么不查询这个主数据库的 account_ids 并遍历它们,为每一个做这个表创建?
-
基本上就是这样。我想避免的是写出每个表都是一个 CREATE TABLE 语句。唯一阻止我使用 sql 转储文件的是 USE 子句需要反映唯一的帐户名称。
-
为什么你需要使用 shell_exec 而不仅仅是通过 PHP 将文件传递给你的 mysql 服务器?
标签: php command-line mysqli variable-assignment shell-exec