我想在PHP中创建一个像phpMyAdmin的导入选项一样的实用程序,该选项应允许通过.sql
文件对远程服务器进行数据库更新,而无需创建新的数据库。
由于它是客户端实用程序,因此不允许访问cpanel。
该应用有两种工作环境,离线&线上。
如果客户端脱机工作,他们需要备份数据库,并且应该使用类似于在线的远程服务器更新数据库。
然后他们必须更新远程服务器的数据库。
答案 0 :(得分:2)
解决方案1
如果您在Linux系统上运行PHP,可以尝试使用'mysql'命令本身。但请注意,您的PHP安装有权运行“system”命令,如system(),exec()等。
所以我的意思是:
system("mysql -U{db_user_name} -h{db_host} -P{db_password} < {full_path_to_your_sql_file}");
请替换,
{db_user_name}使用数据库用户名
{db_host}与数据库主机
带有数据库密码的{db_password}
{full_path_to_your_sql_file},带有SQL文件的路径。
这当然需要上传SQL文件。
解决方案2:
逐行读取SQL文件,同时使用PHP的标准MySQL库读取每个语句。类似的东西:
$arrFile = file("full_path_to_sql_file.sql", FILE_IGNORE_NEW_LINES);
foreach ($arrFile as $q) {
mysql_query($q);
}
然而,这可能并不像看起来那么简单。如果您的SQL文件包含注释和其他特定于.sql的语句,则可能需要将检查放入忽略它们。或者更好的是,如果SQL文件只包含SQL语句。
答案 1 :(得分:0)
您可以使用常规上传脚本来获取.sql文件,确保您正确清理输入字符串以仅获取.sql文件和文本类型,
move_uploaded_file($_FILES["file"]["tmp_name"],"tmpdb/" . $_FILES["file"]["name"]);
完成后,您可以使用
预设定义数据库的数据库设置mysql_select_db('dbname');
然后用fopen()打开sql文件;在变量中打击吸盘
$file = fopen("userdb.sql","r");
$usersql = fread($file, 5);
fclose($file);
然后将其抛入mysql_query();
$uploaddb = mysql_query($usersql) or die(mysql_error());
这些是我建议的概念,或者你可以使用shell exec,但那只会打开其他安全问题。
答案 2 :(得分:0)
您可能需要考虑使用BigDump?
答案 3 :(得分:0)
最终,我自己已经得到了我的问题的答案。我刚刚粘贴了没有配置和其他东西的PHP编码。
$filename ="test.sql";
mysql_select_db("test");
//truncate the database.
$result_t = mysql_query("SHOW TABLES");
while($row = mysql_fetch_assoc($result_t))
{
mysql_query("TRUNCATE " . $row['Tables_in_' . $mysql_database]);
}
// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($filename);
// Loop through each line
foreach ($lines as $line)
{
// Skip it if it's a comment
if (substr($line, 0, 2) == '--' || $line == '')
continue;
// Add this line to the current segment
$templine .= $line;
// If it has a semicolon at the end, it's the end of the query
if (substr(trim($line), -1, 1) == ';')
{
// Perform the query
mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
// Reset temp variable to empty
$templine = '';
}
}