在我的表单页面上,我试图让它只接受我的用户名和密码的字母数字字符,并要求它们是6到15个字符。当我输入无效数据时,它会将其插入到数据库中,而不是抛出我在CheckAlNum函数中定义的用户错误。
的functions.php
function checkAlNum($whichField)
{
if (preg_match('/[A-Za-z0-9]+/', $_POST[$whichField])){
if ( (!count(strlen($whichField) >= 6)) OR (!count(strlen($whichField) <= 15 ))) {
$message1 = '<p> Username and password must be between 6 and 15 characters </p>';
return user_error($message1);
}
else{
return true;
}
}
else {
$message = '<p>Username and password can only be numbers or letters</p>';
return user_error($message);
}
}
form.php的
if (count($_POST) > 0) {
//Validate the inputs
$errorMessages = array();
//Validate the username
$item5 = checkAlNum('username');
if($item5 !== true) {
$errorMessages[] = $item5;
}
//Validate the password
$item6 = checkAlNum('password');
if($item6 !== true) {
$errorMessages[] = $item6;
}
//Validate the firstName and lastName
$item1 = checkNameChars('firstName');
if ($item1 !== true) {
$errorMessages[] = $item1;
}
$item2 = checkNameChars('lastName');
if ($item2 !== true) {
$errorMessages[] = $item2;
}
//Validate the office name
$item3 = checkOfficeChars('office');
if ($item3 !== true) {
$errorMessages[] = $item3;
}
//Validate the phone number
$item4 = validate_phone_number('phoneNumber');
if($item4 !== true) {
$errorMessages[] = $item4;
}
//Check to see if anything failed
if (count($errorMessages) == 0) {
$newEmployee = new Person;
$newEmployee -> insert();
}
else { //Else, reprint the form along with some error messages
echo "<h2><span>Error</span>: </h2>";
foreach($errorMessages as $msg) {
echo "<p>" . $msg . "</p>";
}
}
}
?>
我已经尝试过使用checkAlNum函数的if-else语句和正则表达式的嵌套(虽然我很确定正则表达式是正确的)。也许我只是错过了一些非常愚蠢的东西?
答案 0 :(得分:1)
function checkAlNum($whichField)
{
if (preg_match('/^[a-z0-9]{6,15}$/i', $_POST[$whichField])) {
return true;
}
else {
$message = '<p>Username and password can only be numbers or letters, 6-15 characters long</p>';
return user_error($message);
}
}
如果没有^
和$
锚点,您的正则表达式只会检查字段中是否有字母数字,而不是整个字母是否为字母数字。将+
更改为{6,15}
会在此处执行长度检查,因此您可以删除代码中的额外检查。
答案 1 :(得分:1)
我认为第二个if语句不正确。它应该是这样的:
if ( !( (!count(strlen($whichField) >= 6)) OR (!count(strlen($whichField) <= 15 )) ) ) {
// ... do something
}
这是由于De Morgan Rule声明
A AND B =!(!A OR!B)
在任何情况下,我都不会以这种方式进行检查,结果你会得到太多嵌套的if语句,这些语句难以维护并且使代码看起来不合适。尝试避免代码中的嵌套条件。
答案 2 :(得分:1)
Barmar的答案是最好的。但是,如果要保留if语句以检查字符串长度,则需要删除count()
,因为您已使用strlen()
检查长度。
if ( (!(strlen($whichField) >= 6)) OR (!(strlen($whichField) <= 15 ))) {