【问题标题】:Run a database dump (Restore) from an sql file in PHP + PostgreSql从 PHP + PostgreSql 中的 sql 文件运行数据库转储(恢复)
【发布时间】:2021-02-04 14:51:09
【问题描述】:

我正在尝试创建一个系统,用户可以在其中创建数据库并从 UI 填充它,这与大多数 CMS 的安装非常相似。我可以以编程方式创建数据库,但创建和填充表是我面临的挑战。

我有一个包含这些表和数据的模板 sql 文件,这些表和数据偶尔会通过转储进行更新,这就是我正在做的事情:

try {
        $dbTablesAndData = file_get_contents('path/to/template.sql');
        $db = setDBConnection($clientDb);
        $query = $db->prepare("$dbTablesAndData");
        $query->execute( array() );

      } catch (PDOException $e) {
        $app->response()->setStatus(401);
        $app->response()->headers->set('Content-Type', 'application/json');
        echo  json_encode(array('response' => 'error', 'data' => $e->getMessage() ));
      }

运行时出现错误:cannot insert multiple commands into prepared statement

所以我的问题是,有没有办法成功执行这个文件中的所有查询?

我从this question 读到了一种相关的解决方案,但它对我不起作用,因为它建议用分号分隔语句:

$statements = explode(';', $script);
foreach($statements as $sql){
    if($sql === '') { continue; }
    $query = $pdo->prepare($sql);
    $query->execute();
    if($query->errorCode() !== '00000'){ die("ERROR: SQL error code: ".$query->errorCode()."\n"); }
}

但是我的 sql 文件包含不应该拆分分号的情况,例如在创建函数时声明变量等。有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: php sql postgresql postgresql-12


    【解决方案1】:

    找到了解决方案。显然,它仅适用于无法运行多个命令的 PDO。所以像pg_query() 这样的东西就足够了,而不是prepare()

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 2019-09-27
      • 2023-01-02
      • 2010-12-20
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多