2017-08-03 13 views
0

私は例外をスローし、エラーをキャッチしてから番号をエコーし​​ようとしています。エラーハンドルphp_network_getaddresses:getaddrinfoが失敗しました。どうやって?

これは私がこれまで行ってきたことですが、次のPHPエラーを返すので、AJAX beforeSendリクエストがハングします。

PHPコードIは、前述しましたように私は優雅に、このエラーを処理するにはどうすればよい

<?php 

    /* Status Codes 

    return 0 = Nothing to Update 
    return 1 = Successful Update Query 
    return 2 = Database Connection refused 
    return 3 = MySQL Query Error OR Wrong URL Parameters */ 

    if(isset($_GET["postT_VAL"])) { 

    $client_id = $_GET["postCLIENT_ID"]; 
    $project_id = $_GET["postPROJECT_ID"]; 
    $mainsheet_id = $_GET["postMAINSHEET_ID"]; 
    $field_name = $_GET["postT_ID"]; 
    $field_value = $_GET["postT_VAL"]; 

    if(!$link = mysqli_connect("intentionally_mispelled", "correct_user", "correct_pass", "correct_database")) { 
    echo "2"; 
    exit; 

    } else { 
    /* Build dynamic Update Query string */ 
    $sql = "UPDATE tbl_mainsheet2 SET ".$field_name." = '".$field_value."' WHERE client_id = '".$client_id."' AND project_id = '".$project_id."' AND mainsheet_id = '".$mainsheet_id."'"; 

    /* Execute Update Query */  
    if(!mysqli_query($link, $sql)) { 

    echo "3"; 
    /* Close Connection */ 
    mysqli_close($link); 

    exit; 

    } else { 

    /* return 0 = Nothing to Update/1 = Successful Update Query */ 
    echo "".mysqli_affected_rows($link); 

    /* Close Connection */ 
    mysqli_close($link); 

    } 
    } 

} 

?> 

<br /> 
    <b>Warning</b>: mysqli_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known in <b>/nfs/c12/h02/mnt/220474/domains/site.com/html/autosave4/processor.php</b> on line <b>20</b><br /> 
    <br /> 
    <b>Fatal error</b>: Uncaught exception 'mysqli_sql_exception' with message 'php_network_getaddresses: getaddrinfo failed: Name or service not known' in /nfs/c12/h02/mnt/220474/domains/nexlevel.org/html/autosave4/processor.php:20 
    Stack trace: 
    #0 /nfs/c12/h02/mnt/220474/domains/nexlevel.org/html/autosave4/processor.php(20): mysqli_connect('intentionally_mispelled', 'correct_username', 'correct_password', 'correct_database') 
    #1 {main} 
     thrown in <b>/nfs/c12/h02/mnt/220474/domains/site.com/html/autosave4/processor.php</b> on line <b>20</b><br /> 

基本的には、単純な数字2をエコーし​​たいだけですが、PHPは自分のエコーを中断し、このエラースタックを以下に出力します。

FINAL CODE - あなたはif声明のこの種を使用していないexceptionmをキャッチし、スローにしたい場合はWORKING &は

<?php 

    /* Status Codes 

    return 0 = Nothing to Update 
    return 1 = Successful Update Query 
    return 2 = Database Connection refused 
    return 3 = MySQL Query Error OR Wrong URL Parameters */ 

    /* Sample URL */ 
    // mysite.org/autosave5/processor.php?postCLIENT_ID=111&postPROJECT_ID=222&postMAINSHEET_ID=333&postT_ID=WTRESRVD&postT_VAL=147 

    /* Disable Warnings so that we can return ONLY what we want through echo. */ 
    mysqli_report(MYSQLI_REPORT_STRICT); 

    if(isset($_GET["postT_VAL"])) { 

    // Initialize Global variables. 
    $client_id = ''; 
    $project_id = ''; 
    $mainsheet_id = ''; 
    $field_name = ''; 
    $field_value = ''; 

    /* Database Connection Check */ 
    try 
    { 
    if ($link = mysqli_connect("incorrect_domain", "correct_username", "correct_password", "correct_database")) 
    { 

     // Set and Escape Global variables. 
     $client_id = mysqli_real_escape_string($link, $_GET["postCLIENT_ID"]); 
     $project_id = mysqli_real_escape_string($link, $_GET["postPROJECT_ID"]); 
     $mainsheet_id = mysqli_real_escape_string($link, $_GET["postMAINSHEET_ID"]); 
     $field_name = mysqli_real_escape_string($link, $_GET["postT_ID"]); 
     $field_value = mysqli_real_escape_string($link, $_GET["postT_VAL"]); 

     /* Build dynamic Update Query string */ 
     $sql = "UPDATE tbl_mainsheet2 SET ".$field_name." = '".$field_value."' WHERE client_id = '".$client_id."' AND project_id = '".$project_id."' AND mainsheet_id = '".$mainsheet_id."'"; 

     /* Execute Update Query */  
     if(!mysqli_query($link, $sql)) { 
     /* return 3 = MySQL Query Error OR Wrong URL Parameters */ 
     echo "3"; 
     /* Close Connection */ 
     mysqli_close($link); 
     exit; 
     } else { 
     /* return 0 = Nothing to Update/1 = Successful Update Query */ 
     echo "".mysqli_affected_rows($link); 
     /* Close Connection */ 
     mysqli_close($link); 
    } 

    } else { 
     throw new Exception('2'); 
    } 
    } catch(Exception $e) { 
    /* echo $e->getMessage(); 
     return 2 = Database Connection refused */ 
    echo "2"; 
    } 

} 

?> 
+0

を使用してください。あなたは[** mysqli **](https://secure.php.net/manual/en/mysqli.prepare.php)または[** PDO **](https ://secure.php.net/manual/en/pdo.prepared-statements.php)ドライバ。 [**この記事**](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)には、いくつかの良い例があります。 –

+0

ちょうど更新されました!すべての人が学ぶために掲載された作業コード。 – ASPiRE

答えて

1

をコメントしました。あなたのコードは[** SQLインジェクション**](https://en.wikipedia.org/wiki/SQL_injection)攻撃に対して脆弱であるtry ... catch

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

あなた。私は今それを本当に理解するような方法でそれを見せただけです。ちょうど質問。新しいExceptionをスローします( 'Unable to connect')。 「接続できません」と言う必要がありますか、それとも空にすることができますか? – ASPiRE

+0

「接続できません」というテキストは、あなたが望むものにすることができます。それを空にするか、カスタムメッセージで文字列を書くことができます – sheplu

+0

正しいのですが、表示されているのはエフェクトの中に書かれているものではないようです。 – ASPiRE

関連する問題