2016-08-08 5 views
4

が有効でない場合、私はPHPのmysqliのが

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 
require_once "configuration.php"; 
header('Content-Type: application/json'); 
try 
{ 
    $mysqli = new mysqli(MYSQL_SERVER, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE); 
    $mysqli->set_charset("utf8"); 
} catch (Exception $e) { 
    echo json_encode(
     array(
      'msg' => $e->getMessage() 
     ) 
    ); 
} 

を持っており、mysqliが有効でない場合、それはエラーをキャッチしない例外をスローしません:それはそのよう

Fatal error: Uncaught Error: Class 'mysqli' not found in C:\test\db_connect.php:8
Stack trace:
#0 C:\test\getContacts.php(2): require_once()
#1 {main} thrown in C:\test\db_connect.php on line 8

は、私が何を行うことができますエラーをキャッチする?

私はこの1つを試してみましたが、それはうまくいきませんでした:停止しません

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 
require_once "configuration.php"; 
header('Content-Type: application/json'); 
try 
{ 
    if(!extension_loaded('mysqli')) 
    { 
     throw new Exception('mysqli is not enabled'); 
    } 

    $mysqli = new mysqli(MYSQL_SERVER, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE); 
    $mysqli->set_charset("utf8"); 
} catch (Exception $e) { 
    echo json_encode(
     array(
      'msg' => $e->getMessage() 
     ) 
    ); 
} 

この1つは、スクリプトを実行し続けています。

{"msg":"mysqli is not enabled"}
Notice: Undefined variable: mysqli in C:\test\getContacts.php on line 99

Fatal error: Uncaught Error: Call to a member function query() on null in C:\test\getContacts.php:99 Stack trace: #0 {main} thrown in C:\test\getContacts.php on line 99

+2

明示的に有効にしない限り、mysqliは例外をスローしません。接続が失敗した場合でも1つもスローされません。 **常にmysqliオブジェクトを取得し、明示的に '$ mysqli-> connect_error'をチェックしなければなりません。致命的なエラーは例外ではありません。それらはオブジェクトや例外とは関係のないPHPレベルのエラーです。彼らは最初に "投げられ"ていないので、 "捕らえられ"てはいけません。 –

+3

''これは停止せず、例外を捕まえるのでスクリプト '' thatsを実行し続けます - これは予想される動作です。例外を捕まえた後に実行を停止したい場合は、 'die()'または 'exit'を使用してください。 – Steve

+2

あなたが実行を継続したと思ったエラーメッセージは、同じコードではありません。未定義の変数 '$ mysqli'に対して' E_NOTICE'を発行していますが、そこに変数を作成していて 'query()'呼び出しで致命的なエラーが発生しましたが、 'query()'は呼び出さなかったのです。ここに掲載されていない他のコードは、あなたが投げた例外に続くエラーに責任があります。将来の実行を止めたい場合は、 'catch {}'で明示的に 'exit()'する必要があります。 –

答えて

7

インストールされていないのは間違いですが、自分自身を圧倒している場合は省略することができます。あなたが異なっそれらをキャッチする必要がPHP 7でエラーがキャッチすることができますが、それはExceptionから継承されません:私は質問がphp-7タグ付けされているとおり、手続きの機能が

if(!function_exists('mysqli_connect')) { 
    throw new Exception('mysqli is not enabled'); 
} 
+1

php-mysql拡張機能はデフォルトインストールに含まれておらず、明示的にインストールする必要があります。そうしないとmysqli_ *関数利用できません。もちろん、ランプ/ワンプ/マンプスタックのようなパッケージを使用している場合は例外があります。しかし、単純な 'apt-get install php' /' yum install php'はそれを含んでいません。 –

2

を存在するかどうかを確認します

... 
} catch (Error $e) { 
     ^^^^^ Not Exception 
    echo json_encode(
     array(
      'msg' => $e->getMessage() 
     ) 
    ); 
    // stop execution 
    exit; 
} 

error handling in php 7の詳細については、マニュアルを参照してください。