2017-05-03 23 views
15

PHPでデータベース接続と例外処理を含むプログラムを作成したいと思います。間違ったユーザー名を挿入すると、それに対応するエラーメッセージが表示されます。間違ったデータベースを挿入すると、対応するエラーメッセージが表示されます。PHPで期待される例外メッセージが表示されない

しかし、間違ったデータベースや間違ったユーザー名を挿入するかどうかにかかわらず、「データベースに接続できませんでした」というメッセージのみが表示されます。

<?php 
    $hostname = "localhost"; 
    $username = "root1"; 
    $password = ""; 
    $database = "php_thenewboston"; 
    $conn = mysqli_connect($hostname,$username,$password); 
    $conn_db = mysqli_select_db($conn,$database); 
    class ServerException extends Exception{} 
    class DatabaseException extends Exception{} 
    try{ 
     if(!$conn){ 
      throw new ServerException('Could not connect to server.'); 
     }elseif(!$conn_db){ 
      throw new DatabaseException('Could not connect to database.'); 
     }else{ 
      echo "Connected."; 
     } 
    }catch(ServerException $ex){ 
     echo "Error :".$ex->getMessage();   
    }catch(DatabaseException $ex){ 
     echo "Error :".$ex->getMessage(); 
    } 
?> 

私はPHPの初心者です。 質問があれば、以下のコメントをお寄せください。

EDIT

以下@Hatef で尋ねたとおりのユーザー名が誤っている場合、パスワードが正しいとデータベース名$connvar_dumpです正しい

以下
object(mysqli)#1 (19) { 
    ["affected_rows"]=> 
    int(-1) 
    ["client_info"]=> 
    string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $" 
    ["client_version"]=> 
    int(50012) 
    ["connect_errno"]=> 
    int(0) 
    ["connect_error"]=> 
    NULL 
    ["errno"]=> 
    int(1044) 
    ["error"]=> 
    string(68) "Access denied for user ''@'localhost' to database 'php_thenewboston'" 
    ["error_list"]=> 
    array(1) { 
    [0]=> 
    array(3) { 
     ["errno"]=> 
     int(1044) 
     ["sqlstate"]=> 
     string(5) "42000" 
     ["error"]=> 
     string(68) "Access denied for user ''@'localhost' to database 'php_thenewboston'" 
    } 
    } 
    ["field_count"]=> 
    int(0) 
    ["host_info"]=> 
    string(20) "localhost via TCP/IP" 
    ["info"]=> 
    NULL 
    ["insert_id"]=> 
    int(0) 
    ["server_info"]=> 
    string(21) "5.5.5-10.1.16-MariaDB" 
    ["server_version"]=> 
    int(50505) 
    ["stat"]=> 
    string(132) "Uptime: 1072 Threads: 1 Questions: 16 Slow queries: 0 Opens: 18 Flush tables: 1 Open tables: 11 Queries per second avg: 0.014" 
    ["sqlstate"]=> 
    string(5) "00000" 
    ["protocol_version"]=> 
    int(10) 
    ["thread_id"]=> 
    int(9) 
    ["warning_count"]=> 
    int(0) 
} 

$connときののvar_dumpでありますユーザー名が正しいか、パスワードが正しいか、データベース名が正しくありません。

object(mysqli)#1 (19) { 
    ["affected_rows"]=> 
    int(-1) 
    ["client_info"]=> 
    string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $" 
    ["client_version"]=> 
    int(50012) 
    ["connect_errno"]=> 
    int(0) 
    ["connect_error"]=> 
    NULL 
    ["errno"]=> 
    int(1049) 
    ["error"]=> 
    string(36) "Unknown database 'php_thenewboston1'" 
    ["error_list"]=> 
    array(1) { 
    [0]=> 
    array(3) { 
     ["errno"]=> 
     int(1049) 
     ["sqlstate"]=> 
     string(5) "42000" 
     ["error"]=> 
     string(36) "Unknown database 'php_thenewboston1'" 
    } 
    } 
    ["field_count"]=> 
    int(0) 
    ["host_info"]=> 
    string(20) "localhost via TCP/IP" 
    ["info"]=> 
    NULL 
    ["insert_id"]=> 
    int(0) 
    ["server_info"]=> 
    string(21) "5.5.5-10.1.16-MariaDB" 
    ["server_version"]=> 
    int(50505) 
    ["stat"]=> 
    string(132) "Uptime: 1417 Threads: 1 Questions: 18 Slow queries: 0 Opens: 18 Flush tables: 1 Open tables: 11 Queries per second avg: 0.012" 
    ["sqlstate"]=> 
    string(5) "00000" 
    ["protocol_version"]=> 
    int(10) 
    ["thread_id"]=> 
    int(10) 
    ["warning_count"]=> 
    int(0) 
} 
+1

** mysqli_select_db()の結果を確認してから** mysqli_select_db()を呼び出して結果を確認してください... –

+0

mysqli_connectとmysqli_select_dbをtryブロックの中に入れてください。 。 – aynber

+2

私は 'error_reporting(E_ALL);を使用することをお勧めします。 ini_set( 'display_errors'、1); 'ページ上部にあるので、PHPは非常に有用なメッセージを返すでしょう。 EDIT:プラス 'mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);' DB – OldPadawan

答えて

1

デフォルトでは、mysqlは自動的に例外をスローします。手動で例外をスローするには、ファイルの上に次の行を書く必要があります これはmysqli_connectでも例外をスローします。ですから、tryブロックにconnectメソッドを追加する必要があります。 mysqli_report(MYSQLI_REPORT_STRICT);

更新:あなたの場合、上記の行を書き込まないで、ホスト名を&に変更すると、キャッチブロックにサーバーエラーが発生します。

+0

私は試しましたが、残念ながら同じメッセージが返されます。 –

+0

@RKホスト名を変更してみてください –

+0

@RKそれはあなたのために機能しましたか? –

1

あなたのコードによれば、あなたは良いoopsプログラマーだと思います。まあすべてのプログラミング言語は、独自のルールセットを持っています&標準。

は、あなたが接続を開始しようとしている。ここ

$conn = mysqli_connect($hostname,$username,$password); 
    $conn_db = mysqli_select_db($conn,$database); 
    class ServerException extends Exception{} 
    class DatabaseException extends Exception{} 

あなたのコードを通過することができます。次にtry catchブロックで接続をチェックしています。

try catchブロックにも接続してください。&例外をキャッチします。例えば

try 
{ 
    if ($db = mysqli_connect($hostname_db, $username_db, $password_db)) 
    { 
     //do something 
    } 
    else 
    { 
     throw new Exception('Unable to connect'); 
    } 
} 
catch(Exception $e) 
{ 
    echo $e->getMessage(); 
} 
-1

<?php 
$mysqli = new mysqli("localhost", "root", "", "php_thenewboston"); 


try{ 
     if(!$mysqli){ 
      throw new ServerException('Could not connect to server.'); 
     }else{ 
      echo "Connected."; 
     } 
    }catch(ServerException $ex){ 
     echo "Error :".$ex->getMessage();   
    }catch(DatabaseException $ex){ 
     echo "Error :".$ex->getMessage(); 
    } 
?> 
0

は、PDOステートメントを使用してください。..接続のために、以下を使用してみてください。下の例は、try/catchセットアップを使用するときに発生するエラーを示しています。

下のコードで接続しPDO:以下に示すように

$mysqli_pdo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS, array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
    )); 

その後のtry/catchセットアップであなたのSQLをラップ:

try { 
    //$mysqli_pdo->beginTransaction(); If you need transaction 
    $sql = $mysqli_pdo->prepare("[YOUR SQL]"); 
    $sql->bindValue(1, $INT_VAL, PDO::PARAM_INT); 
    $sql->bindValue(2, $STR_VAL, PDO::PARAM_STR); 
    $sql->execute(); 
    //$mysqli_pdo->commit(); Don't forget if you use transaction 
    } 
catch(Exception $e) { 
    echo $e->getMessage(); 
    //$mysqli_pdo->rollBack(); Don't forget if you use transaction 
    exit(); 
    } 
-1

をMySQLi拡張モジュールは、エラー情報を提供します。

$conn == false場合は、お使いのエラーメッセージを取得するために後mysqli_connect_error()を呼び出します。

あなたがあなた自身のメッセージを使用したい場合は、mysqli_connect_errno()はあなたが望むどのようにそれを処理するために使用することができ、エラーコードを返します。 PHPのドキュメントから

http://php.net/manual/en/mysqli.errno.php

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

if (!mysqli_query($link, "SET a=1")) { 
    printf("Errorcode: %d\n", mysqli_errno($link)); 
} 

/* close connection */ 
mysqli_close($link); 
?> 
1

mysqli_connectを使用して、あなたは(mysqli_select_dbを待つ必要はありません接続目的のためのように、同じ関数内でデータベース名を渡すことができるようになります)

接続試行後に取得するエラーコードが多数あり、それに基づいて適切なメッセージを指定できるようになります。

あなたのアイデア

<?php 
     $hostname = "localhost"; 
     $username = "root1"; 
     $password = ""; 
     $database = "php_thenewboston"; 
     $conn = mysqli_connect($hostname,$username,$password,$database); 
     $error = mysqli_connect_errno(); 
     //$conn_db = mysqli_select_db($conn,$database); 
     class ServerException extends Exception{} 
     class DatabaseException extends Exception{} 
     try{ 
      if($error == 1044){ 
       throw new ServerException('Could not connect to server. Check Username'); 
      }elseif($error == 1045){ 
       throw new DatabaseException('Could not connect to server. Check Password'); 
      }elseif($error == 1049){ 
       throw new DatabaseException('Could not connect to database. Check Database Name'); 
      }else{ 
       echo "Connected."; 
      } 
     }catch(ServerException $ex){ 
      echo "Error :".$ex->getMessage();   
     }catch(DatabaseException $ex){ 
      echo "Error :".$ex->getMessage(); 
     } 
?> 

を取得するので、私はあなたのコードと条件を更新したが、それはあなたを助けることを願っています。

関連する問題