PHP:为 2 个不同的 DB 创建 2 个 PDO,一个阻塞第二个

PHP: creating 2 PDOs for 2 different DBs, one blocks the second one

我有 2 个数据库:1 个在 MySQL 中,另一个在 SQLite3 中。

我需要在两者中插入相同的数据。为了通过表单实现这一点,我正在制作一个 PHP 脚本,它有一些问题。 下面是代码,然后是对发生的事情的解释:

// MySQL
try {
    $sql = new PDO($pdo_servername, $username, $password, $pdo_options);
    $sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $ret = $sql->exec($query);
    if(!$ret){
          echo $sql->lastErrorMsg();
          } else {
          echo "New record created successfully on MySQL DB";   
    }
} catch (PDOException $e) {
    echo $sql . "<br>" . $e->getMessage();
}
    $sql->close();



// SQLite
try {
    $sqlite = new PDO($pdo_servername_sqlite3);
    $sqlite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $retlite = $sqlite->exec($query);
    if(!$retlite){
          echo $sqlite->lastErrorMsg();
          } else {
          echo "New record created successfully on SQLite3 DB"; 
    }
} catch (PDOException $e) {
    echo $sqlite . "<br>" . $e->getMessage();
}
    $sqlite->close();

MySQL 工作正常,而 SQLite3 甚至无法启动。 反转块,因此首先是 SQLite3 然后是 MySQL,问题是反转的:SQLite3 工作正常并且 MySQL 没有启动。 我没有返回任何错误

我也尽量避免任何try-catch-finally,我只是写的代码很简单,我得到了同样的情况。 是否禁止打开 2 个 PDO 连接到 2 个不同的数据库? 请问我的错误在哪里?

尝试这种方式,这是您真正需要的唯一断点try...catch:

// MySQL
try {
    $sql = new PDO($pdo_servername, $username, $password, $pdo_options);

} catch (PDOException $e) {
    echo 'MySQL connection failed: ' . "<br>" . $e->getMessage();
    $sql = false;
}

// SQLite
try {
    $sqlite = new PDO($pdo_servername_sqlite3);
} catch (PDOException $e) {
    echo 'SQLite connection failed: '. "<br>" . $e->getMessage();
    $sqlite = false;
}

if ($sql != false) {
  $ret = $sql->exec($query);
  if(!$ret){
      echo $sql->lastErrorMsg();
  } else {
      echo "New record created successfully on MySQL DB";   
  }
  $sql->close();
}

if ($sqlite != false) {
  $retlite = $sqlite->exec($query);
  if(!$retlite){
      echo $sqlite->lastErrorMsg();
  } else {
      echo "New record created successfully on SQLite3 DB"; 
  }
  $sqlite->close();
}

首先我要感谢所有在这里贡献的人:) 我想 post 最终的工作代码,因为有些行,也应该改变,尊重上面的代码。 事实上,PDO 方法 lastErrorMsg(); 似乎不存在,对于 PDO method close(); 也是如此。应该使用 errorInfo() 代替 lastErrorMsg(); 并且它是一个数组。在关闭数据库连接时:我在 Whosebug 上的某个地方读到,当脚本执行结束时,PDO 会自动将其关闭,或者您需要销毁分配一个 null.

的对象

因为@Alex 建议的代码经过这些小的更改后终于可以正常工作,所以我能够从 PHP 中得到错误,突出显示上述详细信息。 请在下面找到最终的工作代码,希望对其他有同样问题的人有用:

/**
 * MySQL - try to open it. If it fails, 
 * it returns which error and continues the execution of the script
 */
try {
    $sql = new PDO($pdo_servername, $username, $password, $pdo_options);

} catch (PDOException $e) {
    echo 'MySQL connection failed: ' . "<br>" . $e->getMessage();
    $sql = false;
}

/**
 * SQLite - try to open it. If it fails, 
 * it returns which error and continues the execution of the script
 */
try {
    $sqlite = new PDO($pdo_servername_sqlite3);
} catch (PDOException $e) {
    echo 'SQLite connection failed: '. "<br>" . $e->getMessage();
    $sqlite = false;
}

/**
 * If the connection is made, it executes the Query
 * If anything wrong with the Query insertion, an error is returned.
 * The script continues
 */
if ($sql != false) {

  $ret = $sql->exec($query);

  if(!$ret){
      print_r($sql->errorInfo());  // THIS is the valid method for PDO Exec and returns an array
  } else {
      echo "New record created successfully on MySQL DB";   
  }
}

if ($sqlite != false) {

  $retlite = $sqlite->exec($query);

  if(!$retlite){
      print_r($sqlite->errorInfo());  // THIS is the valid method for PDO Exec and returns an array
  } else {
      echo "New record created successfully on SQLite3 DB"; 
  }

}

/**
 * Closes the DB Connections
 */
$sql = null;
$sqlite = null;

感谢大家的有效帮助。我非常感激:)