【问题标题】:Run SQL script via PHP通过 PHP 运行 SQL 脚本
【发布时间】:2021-06-04 04:59:22
【问题描述】:

我创建了一个backup.sql 脚本来恢复MySql 数据库。我已经使用 PHPMyAdmin 导入检查了脚本,一切正常(数据库已成功恢复)。现在我想通过 PHP 运行它。我找到了this question,并且找到了:

1) 在 htdocs 文件夹中创建了一个 PHP 文件,内容如下

$site_path= realpath(dirname(__FILE__)).'/';

$command = 'mysql'
    . ' --host=' . 'localhost'
    . ' --user=' . 'myuser'
    . ' --password=' . 'mypass'
    . ' --database=' . 'dbname'
    . ' --execute="SOURCE ' . $site_path;

$output = shell_exec($command . 'backup.sql"');
echo "<pre>".$output."</pre>";

2) 将 backup.sql 脚本放入 htdocs 文件夹

但是当我运行脚本时,数据库上什么也没有发生,shell_exec 结果也没有显示。我在 Windows 机器上的 Apache 下运行 PHP 和 MySql。命令变量的值如下:

mysql --host=localhost --user=myuser --password=mypass--database=dbname --execute="SOURCE C:\Programmi\Apache Software Foundation\Apache2.2\htdocs/

我错过了什么?

【问题讨论】:

  • 您是否启用了 php 错误?
  • 是的,我已经启用了 error_reporting(E_ALL);ini_set('display_errors', 1); 的错误
  • 我刚刚意识到您想导入以前用 PHP 制作的备份。为什么你甚至想用 PHP 脚本来做呢?您可以通过手动甚至 bash 脚本轻松完成此操作。
  • 因为我想让站点管理员能够通过浏览器恢复数据库(即只需单击一个按钮)。管理员对 Mysql 和 PhpMyAdmin 一无所知,应该只浏览 sql 文件。其余的通过 PHP 脚本完成。

标签: php mysql shell scripting


【解决方案1】:
$mysql_host = "localhost";
$mysql_database = "db";
$mysql_user = "user";
$mysql_password = "password";
# MySQL with PDO_MYSQL  
$db = new PDO("mysql:host=$mysql_host;dbname=$mysql_database", $mysql_user, $mysql_password);

$query = file_get_contents("shop.sql");

$stmt = $db->prepare($query);

if ($stmt->execute())
     echo "Success";
else 
     echo "Fail";

如果您的 sql 文件中的整个代码 100% 正确且无需对其进行任何更改,请尝试此操作,使用 PDO 以提高代码的安全性。

【讨论】:

  • 它说“在将 dbname 导出到 ~/backup.sql 期间出现警告”。但是,如果我正确解释了您的答案,则此脚本似乎导出了一个数据库,而我想将以前创建的备份导入 Mysql。
【解决方案2】:

您可以通过使用 MYSQL DBMS 工具作为Workbench 来克服这个问题,您可以在其中连接到远程/本地服务器并在不使用 PHP 的情况下运行 .sql 文件。

PHP 旨在用于应用反映某些业务功能的业务查询,而不是基本上用于服务器操作或其他工具作业(如 DBMS 工具)。

如果你真的需要这样做,你可以检查这个tutorial,它读取 sql 文件并使用分隔每个查询的; 字符将查询分解为一个数组。

然后它使用 foreach 遍历数组中的每个查询并自行执行查询。

【讨论】:

  • php 虽然可能主要用于运行 Web 应用程序,但它是一种通用脚本语言,非常适合服务器操作、自动化、内部功能或任何其他需要脚本语言的用例
【解决方案3】:

我注意到的一件事是,该操作可能需要更长的时间,或者如果之后需要进行其他操作,特别是在开发测试文件已被执行的过程中,execute 方法不会终止

我简单的解决方案是执行查询,然后获取准备好的查询并运行方法rowCount,这样我们就可以安全地测试执行是否已经终止。

所以只需使用$count = $stmt-&gt;rowCount(); 而不仅仅是$stmt-&gt;execute();

try {
    $db = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
    $query = file_get_contents(__DIR__ . "/test.sql");
    $stmt = $db->prepare($query);
    $stmt->execute();
    $stmt->closeCursor();// Safely consuming the SQL operation till end
    $count = $stmt->rowCount(); // Check if not pending transaction
    if ($count) {
        foreach($db->query('SELECT * from person') as $row) {
            print_r($row);
        }
    }

} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    exit;
}

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多