PHP - 两次显示RegEx错误

时间:2017-11-05 10:07:48

标签: php html regex

我确定这与PHP无关,但我缺乏技能:D 我做了一个输入表单,可以记录他们的个人数据。为了验证它,我有一个正则表达式。当出现问题时,我想给用户一个错误提示,告诉他他做错了什么。但是我的程序会在整个时间内打印两次。 有正则表达式函数:

protected function isFirstnameValid($firstname)
{
    $is_Valid = preg_match('/^[A-Za-z\-_\säöüß]{1,20}$/', $firstname);

    if($is_Valid === FALSE) {
        throw new InvalidArgumentException();
    } else if ($is_Valid === 0) {
        HTMLOutput::printErrorWhenWrongPattern(
            'Der Vorname ist nicht valide. Bitte geben Sie einen Namen
        zwischen 1 und 20 Zeichen an. Erlaubt sind nur Groß- und Kleinbuchstaben, 
        Leerzeichen, Umlaute und folgende Sonderzeichen: - _');

    } else {
        return $is_Valid === 1;
    }

}

这是我使用该功能的地方:

public function isValidPersonalData()
{
    try
    {
        if(isset($_POST[Person::INDEX_FIRSTNAME]) && $this->isFirstnameValid($_POST[Person::INDEX_FIRSTNAME]))
        {
            saveDataToSession(Person::INDEX_FIRSTNAME);
        }
    } catch (Exception $exception) {
        echo 'Der reguläre Ausdruck ist nicht valide. Bitte wenden Sie sich an den Adminstrator.';
    }

    try
    {
        if(isset($_POST[Person::INDEX_SURNAME]) && $this->isSurnameValid($_POST[Person::INDEX_SURNAME]))
        {
            saveDataToSession(Person::INDEX_SURNAME);
        }
    } catch (Exception $exception) {
        echo 'Der reguläre Ausdruck ist nicht valide. Bitte wenden Sie sich an den Adminstrator.';
    }

    try
    {
        if(isset($_POST[Person::INDEX_UNIVERSITY]) && $this->isUniversityValid($_POST[Person::INDEX_UNIVERSITY]))
        {
            saveDataToSession(Person::INDEX_UNIVERSITY);
        }
    } catch (Exception $exception) {
        echo 'Der reguläre Ausdruck ist nicht valide. Bitte wenden Sie sich an den Adminstrator.';
    }

    return !empty($_SESSION[Person::INDEX_FIRSTNAME])
        && !empty($_SESSION[Person::INDEX_SURNAME])
        && !empty($_SESSION[Person::INDEX_UNIVERSITY]);
}

错误-HTML-功能(不要因为名字而笑笑:D):

public static function printErrorWhenWrongPattern($text)
{
print <<<HTML
<div class="alert alert-danger" role="alert">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Fehler:</span>
$text;
</div>

HTML;     }

我正在使用isValidPersonalData()函数的代码:

if ($personalDataValidator->isValidPersonalData() && $bookDataValidator->isValidBookData()) {
    $htmlOutput->printPageCaption('Ausgabe der Daten');
    $htmlOutput->printPersonalDataTable(
        $_SESSION[Person::INDEX_FIRSTNAME],
        $_SESSION[Person::INDEX_SURNAME],
        $_SESSION[Person::INDEX_UNIVERSITY]
    );
    $htmlOutput->printBookDataTable(
        $_SESSION[Book::INDEX_BOOKONE],
        $_SESSION[Book::INDEX_BOOKTWO],
        $_SESSION[Book::INDEX_BOOKTHREE]
    );
    stopSession();
} else if ($personalDataValidator->isValidPersonalData()) {
    $htmlOutput->printPageCaption('Eingabe der Buch-Daten');
    $htmlOutput->printBookDataForm();

} else {
    $htmlOutput->printPageCaption('Eingabe der persönlichen Daten');
    $htmlOutput->printPersonalDataForm();
}
$htmlOutput->printPageFooter();

The error shown twice

希望我提供了所有必要的数据。不要担心我的代码中的安全问题。这只是大学的一项练习,我不打算在完成这门课程后再次使用PHP:D但遗憾的是我找不到自己的错误:(

提前多多感谢:)

1 个答案:

答案 0 :(得分:0)

这是因为isValidPersonalData()正在调用两次(如果>,则为;如果,则为,否则为2.)因此,如果第一个条件为becomw flase,则会老化在else if语句中执行isValidPersonalData()。您可以单次执行它并将结果存储在变量中然后使用该变量

$is_valid = $personalDataValidator->isValidPersonalData(); // add this
if ($is_valid && $bookDataValidator->isValidBookData()) { //change here
    $htmlOutput->printPageCaption('Ausgabe der Daten');
    $htmlOutput->printPersonalDataTable(
        $_SESSION[Person::INDEX_FIRSTNAME],
        $_SESSION[Person::INDEX_SURNAME],
        $_SESSION[Person::INDEX_UNIVERSITY]
    );
    $htmlOutput->printBookDataTable(
        $_SESSION[Book::INDEX_BOOKONE],
        $_SESSION[Book::INDEX_BOOKTWO],
        $_SESSION[Book::INDEX_BOOKTHREE]
    );
    stopSession();
} else if ($is_valid) { //change this 
    $htmlOutput->printPageCaption('Eingabe der Buch-Daten');
    $htmlOutput->printBookDataForm();

} else {
    $htmlOutput->printPageCaption('Eingabe der persönlichen Daten');
    $htmlOutput->printPersonalDataForm();
}
$htmlOutput->printPageFooter();