【问题标题】:PHP form validation functionPHP表单验证功能
【发布时间】:2012-12-06 10:02:51
【问题描述】:

我目前正在编写一些 PHP 表单验证(我已经验证了客户端)并且有一些重复的代码,我认为这些代码可以很好地用于一个不错的 PHP 小函数。但是我无法让它工作。我确定这只是语法问题,但我无法确定。

任何帮助表示赞赏。

//Validate phone number field to ensure 8 digits, no spaces.
if(0 === preg_match("/^[0-9]{8}$/",$_POST['Phone']) {
    $errors['Phone'] = "Incorrect format for 'Phone'";
}

if(!$errors) {
    //Do some stuff here....
}

我发现我写了很多验证代码,我可以通过创建一个函数来节省一些时间和几行代码。

//Validate Function
function validate($regex,$index,$message) {
    if(0 === preg_match($regex,$_POST[$index])) {
        $errors[$index] = $message;
    }

然后这样称呼它......

validate("/^[0-9]{8}$/","Phone","Incorrect format for Phone");

谁能明白为什么这不起作用?

请注意,我在处理此问题以尝试触发错误时已禁用客户端验证,因此我为“电话”发送的值无效。

【问题讨论】:

  • 我相信如果包含在单引号之间,您将需要花括号让 php 评估变量索引。像这样,$_POST['{$index}']
  • @Matt:不需要。如果参数是一个字符串,它可以正常使用 $_POST[$index]
  • 这不起作用的原因有很多,其中最重要的是您的示例没有任何意义。如果这是一个函数,那么你会想要返回一个值,而你不想。如果您还想将数组设置为错误消息值,则该参数必须通过引用传递给函数。

标签: php regex validation function


【解决方案1】:

让我们尝试一些更深思熟虑的东西。

你想这样使用它:

if (validate(...)) {
    // It's ok
}

那么我建议这样做:

function validate($regex, $index, $message, &$errors) {     
    if (isset($_POST[$index]) && 1 === preg_match($regex, $_POST[$index])) {
        return true;            
    }
    $errors[$index] = $message; 
    return false;        
}

现在您有机会在出错时从验证中转储,或者您可以将这些传递链接到 $errors 并用验证错误填充它。没有使用全局变量。

【讨论】:

  • 嗨,gview,谢谢,这看起来很有希望。我想在 $errors 数组为空时处理表单。如果数组包含错误消息,我现在只想向用户显示错误。如果我只是检查 validate 是否返回 true,我是否必须为每个函数调用执行此检查?我想我可以检查每个需要验证的字段,然后在进入数据库之前检查表单是否作为一个组验证(通过简单地检查 $errors 数组)。还是我误会了什么?
【解决方案2】:

这里有一个修复:

//Validate Function
function validate($regex,$index,$message) {
    global $errors;
    if(0 === preg_match($regex,$_POST[$index])) {
        $errors[$index] = $message;
    }
}

问题来了:

if(0 === preg_match($regex,$_POST[$index],$message)

$message,一个字符串,是一个匹配数组应该去的地方。你不需要它。

从手册: int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

http://php.net/manual/en/function.preg-match.php

【讨论】:

  • 从功能上讲,这可以完成这项工作,但我不喜欢使用 global,尽管我知道您只是试图根据原始代码 sn-p 回答问题。跨度>
  • 是的,我也不喜欢使用 global。但话又说回来,我也不是一刀切的验证功能的忠实粉丝。
  • 同意。还有很多选择(symfony2 验证组件,ZF2 验证类。
【解决方案3】:

您的 validate 函数的 if 缺少右括号 改变这个

if(0 === preg_match($regex,$_POST[$index],$message)

到这里

if(0 === preg_match($regex,$_POST[$index],$message))

【讨论】:

  • 谢谢。当我在这里复制该功能时出现错字。固定在顶部。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多