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

时间:2015-04-28 13:40:58

标签: php mysql pdo sqlite

我有两个DB:MySQL中有1个,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? 请问我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

尝试这种方式,这是您真正需要的唯一断点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();
}

答案 1 :(得分:0)

首先,我要感谢所有在这里贡献的人:) 我想发布确定的工作代码,因为某些行,也应该更改,尊重上面的代码。 事实上,PDO方法lastErrorMsg();似乎不存在,PDO method close();也是如此。应该使用errorInfo()来代替lastErrorMsg();并且它{&1;}一个数组。在关闭数据库连接时:我在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;

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