Php 简单表单验证中的多个IF语句

Php 简单表单验证中的多个IF语句,php,Php,我是一个新手,在阅读后尝试实现一个简单的验证脚本,但我不知道如何拥有多个Ifs,这些Ifs只在满足所有必需字段的情况下执行sql插入。与使用多个else语句不同,将所有表单验证if放在一起的语法方法是什么?如果其中一个失败,则会显示正确的错误,并且不会执行sql if(isset($_POST ['submit'])){ $user_ID = get_current_user_id(); $catErr = $ratingErr = $titleErr = $textErr = ""; i

我是一个新手,在阅读后尝试实现一个简单的验证脚本,但我不知道如何拥有多个Ifs,这些Ifs只在满足所有必需字段的情况下执行sql插入。与使用多个else语句不同,将所有表单验证if放在一起的语法方法是什么?如果其中一个失败,则会显示正确的错误,并且不会执行sql

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

$user_ID = get_current_user_id();

$catErr = $ratingErr = $titleErr = $textErr = "";

if (empty($_POST["category"])) {
$catErr = "Category is required";
} else {
//DO THE INSERT BELOW!
}

if (empty($_POST["rating"])) {
$ratingErr = "Rating is required";
} else {
//DO THE INSERT BELOW!
}

if (empty($_POST["post_name"])) {
$postErr = "Title is required";
} else {
//DO THE INSERT BELOW!
}

if (empty($_POST["text"])) {
$textErr = "Text is required";
} else {
//DO THE INSERT BELOW!
}


//PDO query begins here...

$sql = "INSERT INTO forum(ID,
category,
rating,
post_name,
text

在页面被处理成帖子之前,应该使用javascript验证页面。当他们点击提交时,这个脚本将在客户端运行,并在他们离开页面之前捕获错误

下面是关于如何执行类似操作的教程:


每个字段都可以有自己的验证参数和方法,这也会使页面的代码看起来更漂亮。

您的问题有很多解决方案。以下是解决问题的3种方法。

您可以将所有if语句组合在一起,如下所示:

if (empty($_POST['rating']) || empty($_POST'rating']) || ... ) { ... }
用两根管子把它们分开

您还可以检查整个阵列:

if (empty($_POST)) $error = "There was an error!";
您可以设置一个通用错误变量,然后输出它

第三种解决方案可以保留当前语法,但减少行数。您可以通过不使用括号来保存行。您可以创建一个数组并将错误推送到该数组中

注意:您可以使用
empty()
isset()

一旦有一个充满错误的数组,您可以像这样检查它们:

// if the array is not empty (then there are errors! don't insert!)
if (count($errors_array) > 0) {
    // loop through and echo out the errors to the page
    for ($i = 0; $i < count($errors_array); $i++) {
        echo $errors_array[i];
    }
} else {
    // success! run your query!
}
//如果数组不是空的(那么会有错误!不要插入!)
如果(计数($errors\u array)>0){
//循环浏览并将错误回显到页面
对于($i=0;$i
对所有错误消息使用一个变量,并在分支中连接到该变量,因此最后如果该变量仍然是空字符串,则不会执行插入操作。(您不需要任何只包含注释的空else块。)

$err=”“;
如果(空($_POST[“category”])){
$err.=“
类别是必需的”; } 如果(空($_POST[“rating”])){ $err.=“
需要评级”; } if(空($\u POST[“POST\u name”])){ $err.=“
需要标题”; } 如果(空($_POST[“text”])){ $err.=“
需要文本”; } //PDO查询从这里开始。。。 如果($err=='') { $sql=“插入论坛(ID, 类别 评级 ..."; ... }
在showdev让我这么想之后,我就采用了这种方法。它可能不是很优雅,但确实起到了作用,尽管如果出现错误,所有用户都会被带到一个空白页上,并且简单地说:缺少类别(或其他)。不知道我是否可以从那里回显一个链接或其他内容到带有表单的页面,这样用户就可以选择“返回并重新提交”。否则,我将不得不在表单旁边处理和显示错误,这将需要完全不同的方法

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

$errors = false;
if(empty($_POST['category'])) {
echo 'Missing category.<br>';
$errors = true;
}

if(empty($_POST['rating'])) {
echo 'Missing rating.<br>';
$errors = true;
}

if(empty($_POST['post_name'])) {
echo 'Missing title.<br>';
$errors = true;
}

if(empty($_POST['text'])) {
echo 'Missing text.<br>';
$errors = true;
}

if($errors) {
exit;
}
if(isset($\u POST['submit'])){
$errors=false;
if(空($_POST['category'])){
回音“缺少类别。
”; $errors=true; } 如果(空($_POST['rating'])){ 回音“缺少评级。
”; $errors=true; } if(空($\u POST['POST\u name'])){ 回音“缺少标题。
”; $errors=true; } if(空($_POST['text'])){ 回显“缺少文本,
”; $errors=true; } 如果($errors){ 出口 }

//然后在这里添加代码。但是,如果用户出错,并且在页面上看到的只是错误消息(这就是它现在的工作方式)

通常,如果您发现自己反复编写非常类似的语句,使用某种循环可能是更好的方法。我想您所说的“在表单旁边处理和显示错误”确实是您需要做的事情,如果您想让流程对用户友好。如果您将验证脚本放在包含表单的文件的顶部,那么您可以让表单提交到自身(
action=“
)。如果提交成功,您可以将用户重定向到其他位置,否则,他们将再次看到表单,并在有用的位置显示错误消息

if (isset($_POST['submit'])) {
    // define your required fields and create an array to hold errors
    $required = array('category', 'rating', 'post_name', 'text');
    $errors = array();
    // loop over the required fields array and verify their non-emptiness
    foreach ($required as $field) {
        // Use empty rather than isset here. isset only checks that the 
        // variable exists and is not null, so blank entries can pass.
        if (empty($_POST[$field])) {
            $errors[$field] = "$field is required";
        }
    }
    if (empty($errors)) {
        // insert the record; redirect to a success page (or wherever)
    }
}

// Display the form, showing errors from the $errors array next to the
// corresponding inputs

一种方法是设置错误标志(
$errors=true
)然后仅在以下情况下执行SQL,例如,
$errors==false
。这将不允许他回显所需的错误状态。@您这并不是建议OP删除特定的错误消息。如果用户禁用了javascript怎么办?他们将能够绕过客户端的任何验证。恶意用户可能会还要构造自己的表单,直接发布到服务器脚本,而不进行任何验证。客户端验证不是服务器端验证的替代品。我正在考虑实现第三个解决方案。如果(!isset)正如在NOT set for each variable中一样,然后显示错误代码?然后我会将查询放在所有if语句末尾的else语句中(也会被括起来?)是的,你是对的!编辑我的帖子。但是,你仍然可以使用
empty()
如果您愿意。是的,您可以将查询放在显示
//成功!插入数据!
的位置。
isset()不需要使用else
if语句。如果这样做,则需要在前面的所有语句中包含括号。这将增加行数,并且没有必要,因为它是在
count()中处理的
if语句。我喜欢这种方法,但到目前为止,当我点击“提交”时,表单只是提交并向数据库中添加了一行所有空白值,因此出于某种原因,验证没有生效……您需要进行一些调试。您可能需要稍微更改我的代码。如果您了解我的方法,您应该能够调试到指出它停止工作的地方。我将对我的代码进行注释,以便更好地解释发生了什么。我喜欢这样,但是每个else语句中都有什么内容?我不想要
if(isset($_POST ['submit'])){

$errors = false;
if(empty($_POST['category'])) {
echo 'Missing category.<br>';
$errors = true;
}

if(empty($_POST['rating'])) {
echo 'Missing rating.<br>';
$errors = true;
}

if(empty($_POST['post_name'])) {
echo 'Missing title.<br>';
$errors = true;
}

if(empty($_POST['text'])) {
echo 'Missing text.<br>';
$errors = true;
}

if($errors) {
exit;
}
if (isset($_POST['submit'])) {
    // define your required fields and create an array to hold errors
    $required = array('category', 'rating', 'post_name', 'text');
    $errors = array();
    // loop over the required fields array and verify their non-emptiness
    foreach ($required as $field) {
        // Use empty rather than isset here. isset only checks that the 
        // variable exists and is not null, so blank entries can pass.
        if (empty($_POST[$field])) {
            $errors[$field] = "$field is required";
        }
    }
    if (empty($errors)) {
        // insert the record; redirect to a success page (or wherever)
    }
}

// Display the form, showing errors from the $errors array next to the
// corresponding inputs