0

ホテルのウェブサイト用のこのフォームがあります。部屋の人数を検証する必要があります。ユーザーは、部屋の数と各部屋の人数を選択します。私は部屋をループしており、各部屋の人数が大人と子供を含めて 4 人以下であることを確認しています。

私はすべてをほぼ完了しましたが、使用しているクラスはループで機能していないようです。これが起こることです。リストの最後の部屋が人数に問題がなければ、クラスはデータベースにデータを記録し、次のステップに進みます。ただし、部屋には 4 人までしか入室できないというエラー メッセージが引き続き表示されます。すべきことは、最後のフォームに戻ってエラーを表示し、ユーザーが再度部屋を選択できるようにすることです。

これはコードですので、あなたはそれで私を助けるかもしれません:

foreach ($_POST['adt'] as $key => $adt){
  $chd = $_POST['chd'][$key];

  $v = new validacao;
  echo $v->validarApt($chd, $adt);
  echo $v->validarQpt($qpl);
  echo $v->validarTpl($tpl);
  echo $v->validarChd($chdroom);
  echo $v->validarAdt($adt);

}

if ($v->verifica()) {

この後、検証された場合はデータベースに記録し、コードを続行する必要があります。

これはクラスです:

<?

class validacao {
    var $campo;
    var $valor;
    var $msg = array();

    function mensagens($num, $campo, $max, $min) {
      $this->msg[0] = "<img src='imagens/x.jpg' /> Os apartamentos neste hotel permitem a acomodação de no máximo 4 passageiros, incluindo adultos e crianças <br />"; // apartamentos  
      $this->msg[1] = "<img src='imagens/x.jpg' /> Este hotel não possui apartamentos quádruplos, por favor selecione 2 apartamentos duplos <br />"; // apartamentos    
      $this->msg[2] = "<img src='imagens/x.jpg' /> Este hotel não possui apartamentos triplos, por favor selecione 2 apartamentos, 1 duplo e 1 single ou faça nova busca e procure por hotéis com apartamentos triplos que tenham preços divulgados em nossa tabela <br />"; // apartamentos    
      $this->msg[3] = "<img src='imagens/x.jpg' /> Este roteiro não dispõe de preços diferenciados para crianças, por favor inclua a criança como adulto <br />"; // apartamentos   
      $this->msg[4] = "<img src='imagens/x.jpg' /> Você deve incluir pelo menos 1 adulto no apartamento <br />"; // apartamentos

      return $this->msg[$num];
    }

    function validarApt($adt,$chd) {
      if ($chd + $adt >= 5) {
        return $this->mensagens(0, null, null, null);
      }
    }   

    function validarQpt($qpl) {
      if ($qpl == 0) {
        return $this->mensagens(1, null, null, null);
      }
    }   

    function validarTpl($tpl) {
      if ($tpl == 0) {
        return $this->mensagens(2, null, null, null);
      }
    }   

    function validarChd($chdroom) {
      if ($chdroom == 0) {
        return $this->mensagens(3, null, null, null);
      }
    }   

    function validarAdt($adt) {
      if ($adt == 0) { 
        return $this->mensagens(4, null, null, null);
      }
    }

    function verifica() {
      if (sizeof($this->msg) == 0) {
        return true;
      } else {
        return false;
      }
    }
  }
?>

私はあなたの助けに感謝します。ありがとう!

4

1 に答える 1

1

これは役立つはずです。ループを通過するパスが失敗した場合に false になるフラグを追加し、完了後にそれを確認する必要があります。最後のパスが失敗したかどうかのみを確認しています。

$verified = true;
foreach ($_POST['adt'] as $key => $adt){
  $chd = $_POST['chd'][$key];

  $v = new validacao;
  echo $v->validarApt($chd, $adt);
  echo $v->validarQpt($qpl);
  echo $v->validarTpl($tpl);
  echo $v->validarChd($chdroom);
  echo $v->validarAdt($adt);

  if(!$v->verifica()){ $verified = false; }
}

if ($verified) {
  ... //proceed with rest of code
}

ここにも問題があります:(明確にするためにいくつかの詳細を省略しています)

class validacao {
  ...
  var $msg = array();

  function mensagens($num, $campo, $max, $min) {
    $this->msg[0] = "<img src='imagens/x.jpg' /> Os apartamentos neste hotel permitem a acomodação de no máximo 4 passageiros, incluindo adultos e crianças <br />"; // apartamentos 
    $this->msg[1] = "<img src='imagens/x.jpg' /> Este hotel não possui apartamentos quádruplos, por favor selecione 2 apartamentos duplos <br />"; // apartamentos  
    ...

    return $this->msg[$num];
  }

  ...

  function verifica() {
    if (sizeof($this->msg) == 0) {
      return true;
    } else {
      return false;
    }
  }
}

前者の関数は一連のエラー メッセージを設定するため、後者の関数は常に false を返します。各検証関数は、mensagens常にクラスのメンバー変数を返す関数の結果を返しています。おそらく静的関数を読み、どの関数を静的にする必要があるか、どの関数を動的にするか、返すメッセージをどのように保存するか、実際に失敗する検証とどのように異なるかを検討する必要があります。

于 2012-05-15T16:35:40.487 に答える