2017-05-18 12 views
0

私は決してここで何も尋ねたことはありませんが、バグがあります。AJAXを使用してエラーを処理するより適切な方法はありますか?

私は約1年間PHPを使っています。私はPHP、JQuery、MySQLなどを学びながら自分自身をかなり大きなプロジェクトにしました。それは完璧ではなく、完成さえしていませんが、新しい機能を追加しながら既存のコードを改善しようと常に努めています。テキストベースのMMORPGゲームです(まだ開発中です)、リンクが必要な場合はそれを提供しますが、私はそれを促進するためにここに来ませんでした。

手順上のPHPで大丈夫だと思いますが(私はまだ繰り返しコードに問題がありますが)、私はOOPに移行することに決めました。私は理論でそれを理解し、基礎を知っており、実際には徐々に進んでいますが、あまりにも遠くに移動する前に、あなたの助言が必要でした。手続き型コードと私のオリジナルゲームで

が、私は多くの場合、これらの線に沿って何かをやっている:

  • ユーザー訪問ページを、shop.phpは言います。サイトを開くと、shop.phpは購入可能なアイテムのデータベースリストから取得します。空白があります#成功メッセージ#エラーメッセージの段落がサイトにあります。
  • ユーザーは、その後、彼はJavaScriptをトリガー、AJAX呼び出しがbuy-に
  • を返されるJSONを期待し、バイインitem.phpに行われている項目をクリックbuy-したいお店から項目を選択することができますitem.php配列を作成しています。$ result( "success" => 0、 "message" => "")
  • buy-item.phpは、バックパックのスペースなどがあり、満たされていない条件がある場合、$ result ["message"]は、 "あなたはもっと金が必要です"と設定します。すべての条件が満たされた場合、result ["success"]は1に設定され、$ result ["message"]は "Purchase successful"に設定されます。最後に、AJAXにjson_encode($ result)が返されます。 AJAX 成功に
  • 私はチェックすると(result.success)、および購入が成功した場合、私は思いますaccordingly-行動$( "#エラー・メッセージ")HTML(result.message)、それが成功した場合は、代わりにresult.messageを "#success-message"に入れます(同じ段落にエラーメッセージと成功メッセージの両方を表示できますが、これらのメッセージのスタイルは異なっており、成功は緑色で、エラーは赤色です)。

エラーを処理する正しい方法はありますか?それとも、私はそれを完全に違うようにコーディングすべきですか?このアプローチはOOPでも有効ですか?

のindex.php:

私はこの例で何を意味するかをお見せしましょう、私は現時点でいじるよ(は単純化のために、コードのセキュリティ、あるいは有用性を忘れてください)

<!DOCTYPE html> 
<html lang="pl-PL"> 
    <head> 
     <meta charset="UTF-8"> 
     <script 
      src="https://code.jquery.com/jquery-3.2.1.min.js" 
      integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" 
      crossorigin="anonymous"> 
     </script> 
     <script src="script.js"></script> 
    </head> 
    <body> 
     <div id="wrapper"> 
      <p id="error-message"></p> 
      <p id="success-message"></p> 
      <form id="registration-form" method="post"> 
       <input type="text" placeholder="Account Name" name="nickname"></input> 
       <input type="text" placeholder="Password" name="password"></input> 
       <input type="text" placeholder="E-mail" name="email"></input> 
       <button type="submit">Register</button> 
      </form> 
     </div> 
    </body> 
</html> 

ユーザー。PHP

<?php 

class User{   
    //register method 
    public function register($nickname, $password, $email){ 
     $result = array("success" => 0, "message" => ""); 
     //example validation 
     if($nickname==123){ 
      $result["message"] = "Could not register."; 
     } 
     else{ 
      //add user to the database 
      //sql code here 
      $result["success"] = 1; 
      $result["message"] = "Registration successful."; 
     } 
     return $result; 
    } 
} 

?> 

registerProcessing.php

<?php 
    require_once 'User.php'; 

    $user = new User(); 

    echo json_encode($user->register($_POST["nickname"], $_POST["password"], $_POST["email"])); 
?> 

script.js

$(function() { 

    $("#wrapper").on("submit", "#registration-form", function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: "registerProcessing.php", 
      data: $("#registration-form").serialize(), 
      dataType: "json", 
      success: function(result){ 
       if(result.success){ 
        $("#success-message").html(result.message); 
       } 
       else{ 
        $("#error-message").html(result.message); 
       } 
      } 
     }); 
    }); 

}); 
+2

おそらくhttps://codereview.stackexchange.comでこれを求めてみてください。これは、このようなものを好きでした/。 – TheUknown

+2

とあなたの人生の話をあなたの問題/質問になる前に伝えないでください。 –

+0

ハハ、残念ケビン、私はちょうど私の最初のSOの投稿では、私についてのいくつかの言葉を言うことは適切だろうと思った、もう一度やっていない、約束! :) –

答えて

1

適切な方法は、AJAXコールバックの研究で、すでにジャバスクリプト/ jQueryのに作られた状態と、それらと遊ぶ。もっと高度な機能が必要な場合は、send by backendいくつかのヘッダーは適切なコールバックやカスタマイズされたものによって処理できるいくつかのステータスを強制する必要があります。

主に大規模なjsライブラリ/フレームワーク(XMLHttpRequestpure itself that follow the HTTP pattern of codes, see MDN)で処理されたHTTP status codesを使用することができます。

あなたの質問に直接答える、いいえ、そうではありません。あなたのajaxはメインコールバック(成功)を使用して戻り値で処理しています。それは仕事ですが、私が上記のようにコールバックに関するベストプラクティスを欠いています。

何ができるか

例:

$("#wrapper").on("submit", "#registration-form", function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: "registerProcessing.php", 
      data: $("#registration-form").serialize(), 
      dataType: "json", 
      success: function(result){ 
       $("#success-message").html(result.message); 
      }, 
      error: function(result){ 
       $("#error-message").html(result.message); 
      } 
     }); 
    }); 

または

$("#wrapper").on("submit", "#registration-form", function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: "registerProcessing.php", 
      data: $("#registration-form").serialize(), 
      dataType: "json", 
      statusCode: { 
       404: function() { 
       $("#error-message").html('NOT FOUND'); 
       }, 
      200: function(result) { 
       $("#success-message").html(result.message); 
      }, 
      500: function(result) { 
       $("#error-message").html(result.message); 
      } 
      } 
     }); 
    }); 

あるいは、XMLHttpRequestの例で:

var request; 
if(window.XMLHttpRequest) 
    request = new XMLHttpRequest(); 
else 
    request = new ActiveXObject("Microsoft.XMLHTTP"); 
request.open('GET', 'http://www.mozilla.org', false); 
request.send(); // there will be a 'pause' here until the response to come. 
// the object request will be actually modified 
switch (request.status){ 
    case 404: 
    break; 
    case 500: 
    break; 
    case 200; 
    break 
} 
+0

ステータスコードは200でもかまいませんが、メッセージにエラーがあります。 – Gerard

+0

だからこそ、私は彼が適切にコード化されたメッセージを送るヘッダーの操作を研究することを勧めました。これは、http_response_code(例の場合)で行うことができます。 http://php.net/manual/en/function.http-response-code.php – calexandre

+0

それは役に立ちます!どうもありがとうございます! –

1

HTTPステータスを使用してエラーの取り扱いについてCarlosAlexandreの答え@に追加しますコード:OOPプログラミングへの移行のために、あなたはそれがa besになっていることに気づくべきです例外処理を使用してエラー条件を回避することを練習してください。

User.php

class User{   
    //register method 
    public function register($nickname, $password, $email){ 
     //example validation 
     if($nickname==123){ 
      throw new InvalidArgumentException('Invalid username'); 
     } 

     //add user to the database 
     //sql code here 
    } 
} 

registerProcessing.php

require_once 'User.php'; 

$user = new User(); 
$response = array(
    'success' => 0, 
    'message' => 'Unknown error', 
); 

try { 
    $user->register($_POST["nickname"], $_POST["password"], $_POST["email"]); 

    $response['success'] = 1; 
    $response['message'] = 'Registration successful.'; 
} catch (Exception $exception) { 
    $response['message'] = $exception->getMessage(); 
} 

echo json_encode($response); 
+0

あなたのご意見ありがとうございました。 :) –

関連する問題