我使用此代码检查数据库连接(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();
}
}
答案 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
]);
快乐的编码!