【问题标题】:PHP: creating 2 PDOs for 2 different DBs, one blocks the second onePHP:为 2 个不同的数据库创建 2 个 PDO,一个阻止第二个
【发布时间】:2015-07-07 09:51:36
【问题描述】:

我有 2 个 DB: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 个不同的 DB? 请问我的错在哪里?

【问题讨论】:

  • 有趣的问题,也许这个codereview.stackexchange.com/questions/30689/… 和这个stackoverflow.com/questions/10292789/… 会有所帮助。
  • 其实更多的是第二个链接的情况。但是在我的情况下,它总是在第一个被调用的数据库中工作。从来没有第二个。为了能够使用第二个,我必须颠倒顺序。我不明白为什么
  • 你可以尝试在-&gt;close() 之后设置$sql = NULL$sqlite = NULL 吗?因为连接在该PDO 对象的生命周期内保持活动状态。要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁该对象 - 您可以通过将NULL 分配给保存该对象的变量来执行此操作。如果你没有明确地这样做,PHP 会在你的脚本结束时自动关闭连接。
  • 现在就按照您的建议去做了。没有任何变化:-/
  • 你为什么要try...catch?你通常不需要它。这种技术只是对你隐藏一些行为。

标签: php mysql pdo sqlite


【解决方案1】:

首先我要感谢在这里贡献的每一个人 :) 我想发布最终的工作代码,因为某些行也应该更改,尊重上面的代码。 实际上,PDO 方法lastErrorMsg(); 似乎不存在,对于 PDO method close(); 也是如此,应该使用errorInfo() 代替lastErrorMsg();,它是一个数组。关闭数据库连接时:我在 Stackoverflow 上的某处读到,当脚本执行结束时,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;

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

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

    • 复制、粘贴并尝试。我遇到了同样的问题,并且得到了更多详细信息:使用您发布的列表:MySQL 正在运行,但 SQLite3 没有。如果我在彼此之间翻转 2“如果”,使 SQLite3 在 MySQL 之前出现,那么 SQLite3 正在工作,而不是 MySQL。
    • 好的,问题可能在“if”中。我现在尝试避免任何“如果”并将 jsut 放入 2 个指令 $ret = $sql-&gt;exec($query); $retlite = $sqlite-&gt;exec($query); 并且两个数据库都已更新。因此,tehre 应该是有问题的。我发现指令$sql-&gt;close();$sqlite-&gt;close(); 应该放在文件的最后。然后更新两个数据库。我觉得这很奇怪,因为这是我对代码执行的第一个操作。但可能代码本身也导致了问题,而根据您的建议和这些小的改进,一切都解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多