0

READABLE フィードバックをエンド ユーザーに提供する場合、どの方法を使用するのが最適かわかりません。私はいくつかのフォーラムを読みましたが、実際には賢明ではありませんでした (または私はそれを理解していませんでした)

挿入/更新が失敗したとき、成功したとき、およびカスタム フィードバック (アイテムが既に存在するかどうかを確認するなど) を提供するときに、フィードバックを提供したいと思います。

INSERT、UPDATE、DELETE、DROP などでは、クエリは TRUE または FALSE を返します。したがって、私の結果プロパティ$this->query_resultは常に true または false のいずれかでなければなりません。

私の問題:

  • フォームの送信後にユーザーにフィードバックを動的に表示 (同じページに送信)
  • $this->query_result は、文字列を返す場合に true

自分が何をしているかを確認するためのコードを追加しました (間違っています)

これらは、DB の接続/クエリに使用する関数です。

  public function connect() 
  { 

      if (!($this->conn = mysql_connect($this->host, $this->username, $this->pwd)))  {
         die("Error connecting to DB by user = " . $this->username); 
      } 

      $this->db = mysql_select_db($this->dbname,$this->conn) 
        or die("Unable to connect to database " . $this->dbname); 
  }  

  private function query($sql) 
  {
      $this->query_result = mysql_query($sql, $this->conn)or die("Unable to query local database <b>". mysql_error()."</b><br>$sql"); 

      if (!$this->query_result){ 
          die("database query failed."); 
      } else { 
          return $this->query_result; 
      }
  } 

ここに私の問題があります: データ アクセス層 (DAL) に関するフィードバックを提供しています。たとえば、次を参照してください。

  public function addNewPerson($formData)
  {
    $sql = "INSERT INTO my_table(`name`, `email`, `www`)";

    $sql .= " VALUES('".
      $formData['name']."','".
      $formData['email']."','".
      $formData['www']."','");

   $this->query($sql);
   return $this->query_result;
  }

テキスト文字列を返すことにより、返される結果は常に true になります。私が読んだことから、おそらくエラー/フィードバックを処理する機能が必要です。

これは、テンプレートでフィードバックを使用して現在行っていることです。

  if (isset($_POST['form_submit']))
  {

    if (isset($_POST['person_submit'])) {
      $formData = $sl->getFormData();
      $result = $myDB->addNewPerson($formData);

      if ($result == true)
      {
        echo '<script type="text/javascript" language="JavaScript">
              jQuery("#contentArea .messageWindow1").show(500);
              jQuery("#contentArea :input").click(function(){ jQuery("#contentArea .messageWindow1").hide(500); });
        </script>';
      } else {
        echo '<script type="text/javascript" language="JavaScript">
              jQuery("#contentArea .messageWindow2").show(500);
              jQuery("#contentArea :input").click(function(){ jQuery("#contentArea .messageWindow2").hide(500); });
        </script>';
      }
    }
  } 

<div id="contentArea">   
  <div class="messageWindow1"> <span class="msg"><?php echo $labelResult ?></span></div>
  <div class="messageWindow2"> <span class="msg"><?php echo $labelResult ?></span></div>
</div>
4

4 に答える 4

4

PHP5 の組み込みの例外処理を使用して、エラーと、場合によっては検証エラーもトラップします。例:

    class DatabaseException extends Exception {}
    class ValidatorException extends Exception {}

         public function connect() 
          { 

              if (!($this->conn = mysql_connect($this->host, $this->username, $this->pwd)))  {
                 throw new DatabaseException("Error connecting to DB by user = " . $this->username); 
              } 

              if(!($this->db = mysql_select_db($this->dbname,$this->conn))) { 
                throw new DatabaseException("Unable to connect to database " . $this->dbname);
 }
          }  

    //....


    public function addNewPerson($formData)
      {
        $sql = "INSERT INTO my_table(`name`, `email`, `www`)";

        $sql .= " VALUES('".
          $formData['name']."','".
          $formData['email']."','".
          $formData['www']."','");

       //If less than 2 characters, do not insert data.
       if (strlen($formData['name']) < 2)
        throw new ValidatorException( "Person not saved. Name field was to short or empty.");

       //If person already exists
       if($this->isPersonInList($formData['name']))
        throw new ValidatorException( "Person already exists!");

       //Process query
       $this->query($sql);
       return $this->query_result;
      }

呼び出しスクリプトで

try {
$formData = $sl->getFormData();
$result = $myDB->addNewPerson($formData);
} catch (DatabaseException $e) {
// display $e->getMessage()
} catch (ValidatorException $e) {
//display $e->getMessage()
}

スクリプトで指摘する他のいくつかのこと。

  1. PDO と準備済みステートメントを使用することをお勧めします。
  2. 以下を使用して、文字列の長さが満たされているかどうかを判断することもできます。
$arr = 'ショーアン';
var_dump(isset($arr[10])); //間違い
var_dump(isset($arr[2])); //真実
  1. 入力をデータベースにプッシュする前、またはアプリケーションで使用する前に、SQL インジェクション/XSS エクスプロイトの入力をフィルタリングします。
于 2009-06-10T13:46:09.623 に答える
2

1 つのヒント: オブジェクト指向をプログラミングするときは、例外を使用する必要があります。たとえば、さまざまなエラー フィードバックに対してさまざまな例外を導入できます。

class ValidationException extends Exception
{}

class DatabaseExceptionextends Exception
{}

throw ValidationException("Person not saved. Name field was to short or empty.");
throw DatabaseException("database query failed.");

次に、これらすべての例外をキャッチし、例外のタイプに応じて異なる反応を示します。

try {
    // ...
}
catch (ValidationException $e) {
    // ...
}
catch (DatabaseExceptionextends $e) {
    // ...
}
于 2009-06-10T13:26:30.990 に答える
0

コード スニペットを表示するには、自分の例に答える必要があります。Shoan の提案を受けて、DAL を拡張して PDO を使用しようとしています ( class DAL extends PDO )。しかし、それは私に空白の画面を与えます。これは私の DAL クラスです。

class DAL { 
  protected $username; 
  protected $pwd; 
  protected $host;
  protected $dbname;
  private $conn; 
  private $db; 
  private $query_result; 

  public function __construct($cfg_file = 'nf.config') 
  { 
    $config = parse_ini_file($cfg_file);

    $this->username     = $config['db_user']; 
    $this->pwd          = $config['db_password'];
    $this->host         = $config['db_host']; 
    $this->dbname       = $config['db_name'];
  } 

  public function connect() 
  { 
      ($this->conn = mysql_connect($this->host, $this->username, $this->pwd))  
        or die("Error connecting to DB by user = " . $this->username); 

      $this->db = mysql_select_db($this->dbname,$this->conn) 
        or die("Unable to connect to database " . $this->dbname); 
  }  


  private function query($sql) 
  {
      $this->query_result = mysql_query($sql, $this->conn)
        or die("Unable to query local database <b>". mysql_error()."</b><br>$sql"); 

      if ($this->query_result){ 
          return $this->query_result; 
      }
  } 

  public function getSomeData()
  {
    $sql ="SELECT * FROM myTable";
    //Process query
    $this->query($sql);
      return $this->query_result; 
  }
}

したがって、私のコードでは、次のようにします。
$myDB = new DAL();
$myDB->connect();
$result = $myDB->getSomeData();

しかし、「extends PDO」を追加すると、ページが空白になります。また、try / catch / throw を使用することもできません。すべてエラー メッセージが表示されます。

于 2009-06-12T14:06:12.977 に答える
0

addNewPerson() のエラー メッセージの先頭に特殊文字を追加できます。呼び出しスクリプトは、文字列関数を使用して特殊文字を検出し (エラーがあることを認識できるように)、その文字を削除して、メッセージが表示されないようにします。これはあなたが望むものに役立つと思いますか?

于 2009-06-10T13:25:49.023 に答える