我如何检查连接到appropriete数据库的PDO

时间:2015-05-07 12:33:32

标签: php mysql pdo

我使用此代码检查数据库连接(MYSQL)。如果数据库名称不可用,则表示连接成功。

if(isset($_REQUEST['submit']))
          {
              echo $name = $_REQUEST['name'];
              echo $pwd  = $_REQUEST['password'];

              $servername = "localhost";
              $username = "root";
              $password = "";
              try
              {
                  $conn = new PDO("mysql:host = $servername;dbname = pdo",$username,$password);
                  //echo "Connected successfully";
                  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                  echo "connect successfully";
              }
              catch(PDOException $e)
              {
                echo "Connection failed: " . $e->getMessage();
              }
          }    

1 个答案:

答案 0 :(得分:0)

<强> TL; DR

因为您的代码使用try-catch块,所以只要没有抛出异常,就可以确保连接成功建立。否则,请检查存储在异常中的错误代码以解决错误类型。

更详细

您的代码使用了异常,因此如果在尝试连接时发生错误,则会引发异常。据我所知,PDO对象在构造时默认抛出异常,并在创建实例时回退到静默模式。因此,如果施工期间发生任何不良事件,您将得到警告。

更新1

  

如何使用PDO检查数据库名称是否可用于数据库?

如上所述,您可以利用例外。但是,您可以使用PDOException方法getCode()检查返回的错误代码,而不是回显异常消息。使用php 5.6.8版,我将获得代码1049。然后,您可以使用以下方法进行检查:

try {

    $pdo = new PDO($dsn, $username, $passowrd, [
        PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => false
    ]);

}catch(PDOException $exception) {

    if($exception->getCode() == 1049) {
        echo 'Database does not exist!';
    }

    // Continue error handling...

}

更新2:替代

使用与上述相同的PHP版本可以避免在DSN中选择数据库。有了这个,您可以获取已使用的MYSQL用户的可访问数据库列表。使用此列表,您可以同时检查一个或多个数据库是否存在,并避免异常停止执行脚本的开销。

/*
 * I assume you are on localhost.
 */
$pdo = new PDO('mysql:host=127.0.0.1', $username, $password, [
    PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false
]);

$databases = $pdo->query('SHOW DATABASES'); // Does not require a prepared statement since it takes no input.

/*
 * The following can be done more elegant/efficient.
 */
$exists = false;  // Equals TRUE if the database exists.
$check  = 'test'; // Enter the database to check for.

foreach($databases->fetchAll(PDO::FETCH_ASSOC) as list($database)) {

    if($database == $check) {
        $exists = true;
        break;
    }

}

<强>加成

在构建PDO实例后,您正在设置错误模式。这也可以使用PDO构造函数的第四个参数来完成。我认为这会导致代码更易读。

我还建议将配置PDO::ATTR_EMULATE_PREPARES设置为false。这确保始终使用准备好的语句。 The documentation can be found here

$pdo = new PDO($dsn, $username, $password, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false
]);

快乐的编码!