2

これに対する答えはどこにも見つかりません。多分それは本当に単純です

次のようなmysql PDO接続があります。

try{
$DBH = new PDO("mysql:host=$db_hostname;dbname=$db_database", $db_username, $db_password);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
}
catch (PDOException $e){
echo $e->getMessage();
exit;
}

接続が機能したかどうかをテストしたいだけです。パスワード、ユーザー名、データベース名、およびホスト名のスペルが正しい場合。

try, throw は、ドライバーのスペルが間違っている場合など、基本的なエラーを検出するように見えます。パスワードが間違っていると言っても、エラーはスローされません。

ありがとう

4

2 に答える 2

13

この質問からワンクリックするだけで、PDO タグ wikiに正確なハウツーがあります。

$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'root','', $opt);

警告も兼ねて

エラーメッセージを処理するためだけにtry..catch 演算子を使用しないでください。
キャッチされない例外は、PDO エラーを他の PHP エラーとまったく同じように処理するため、この目的にはすでに優れています。したがって、サイト全体の設定を使用して動作を定義できます。カスタム例外ハンドラーは後で追加できますが、必須ではありません。特に新規ユーザーの場合、未処理の例外を使用することをお勧めします。未処理の例外は非常に有益で、便利で安全です。より詳しい情報...

于 2013-08-14T15:41:35.380 に答える
3

次のコードを使用して接続します。

    <?php
class dbConnection extends PDO{

public function __construct() {    
  switch(DB_TYPE){
    case "mysql":
        $dbconn = "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET;
        break;
    case "sqlite":
        $dbconn = "sqlite:".DB_PATH.";charset=".DB_CHARSET;
        break;
    case "postgresql":
        $dbconn = "pgsql:host=".DB_HOST." dbname=".DB_NAME.";charset=".DB_CHARSET;
        break;
    }

    parent::__construct($dbconn,DB_USER,DB_PASS,array(PDO::ATTR_EMULATE_PREPARES => false,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

   }
}
?>

間違ったパスワードを入力すると、

接続エラー: SQLSTATE[28000] [1045] ユーザー 'microaid_logger'@'localhost' のアクセスが拒否されました (パスワードを使用: YES)

あなたの常識が指摘したように、接続が成功しない場合は例外がスローされ、パスワードが間違っている場合にもトリガーされます。エラー メッセージのテキストをフォーマットしたり処理したりしたい場合は、ここで説明されているようにカスタム エラー ハンドラを設定するだけです。

于 2013-08-14T15:36:27.493 に答える