如何使用PHP脚本通过.sql文件更新远程服务器的数据库?

时间:2012-01-07 06:19:08

标签: php mysql

我想在PHP中创建一个像phpMyAdmin的导入选项一样的实用程序,该选项应允许通过.sql文件对远程服务器进行数据库更新,而无需创建新的数据库。

由于它是客户端实用程序,因此不允许访问cpanel。

该应用有两种工作环境,离线&线上。

如果客户端脱机工作,他们需要备份数据库,并且应该使用类似于在线的远程服务器更新数据库。

然后他们必须更新远程服务器的数据库。

4 个答案:

答案 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 = '';
        }
    }