PHP表单验证提交问题?

时间:2010-04-09 02:57:46

标签: php mysql

我的代码假设将一年如1999保存到mysql数据库,但它不会。它将检查用户是否只输入了数字并且至少有4个数字,或者是否没有正确输入但是它不会保存正确的年份?我该如何解决这个问题。

这是PHP代码。

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
    echo '<p class="error">year is not correct!</p>';
}  else if($_POST['year'] == NULL) {
  // do something
}

以下是代码的用途。

    if (mysqli_num_rows($dbc) == 0) {
            $mysqli = mysqli_connect("localhost", "root", "", "sitename");
            $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
                                         VALUES ('$user_id', '$year')");
    }

    if ($dbc == TRUE) {
            $dbc = mysqli_query($mysqli,"UPDATE users 
                                         SET year = '$year' 
                                         WHERE user_id = '$user_id'");

            echo '<p class="changes-saved">Your changes have been saved!</p>';

    }

    if (!$dbc) {
            print mysqli_error($mysqli);
            return;
    }

以下是代码。

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

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
    echo '<p class="error">year is not correct!</p>';
}  else if($_POST['year'] == NULL) {


    if (mysqli_num_rows($dbc) == 0) {
            $mysqli = mysqli_connect("localhost", "root", "", "sitename");
            $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
                                         VALUES ('$user_id', '$year')");
    }

    if ($dbc == TRUE) {
            $dbc = mysqli_query($mysqli,"UPDATE users 
                                         SET year = '$year' 
                                         WHERE user_id = '$user_id'");

            echo '<p class="changes-saved">Your changes have been saved!</p>';

    }

    if (!$dbc) {
            print mysqli_error($mysqli);
            return;
    }


    }

}

问题必须放在这一行上。

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));

5 个答案:

答案 0 :(得分:1)

首先,检查$_POST['year']中发送的内容是否在您的逻辑陈述之上的某个位置error_log($_POST['year']);echo $_POST['year'];

其次,你实际上没有在该代码中写入任何查询,只是一个$year变量,我猜你正在尝试消毒。

第三,看起来你的if / else语句链中存在逻辑错误。

试试这个。

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

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
    echo '<p class="error">year is not correct!</p>';
}  else if($_POST['year'] == NULL) {

} else {
    if (mysqli_num_rows($dbc) == 0) {
            $mysqli = mysqli_connect("localhost", "root", "", "sitename");
            $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
                                         VALUES ('$user_id', '$year')");
    }

    if ($dbc == TRUE) {
            $dbc = mysqli_query($mysqli,"UPDATE users 
                                         SET year = '$year' 
                                         WHERE user_id = '$user_id'");

            echo '<p class="changes-saved">Your changes have been saved!</p>';

    }

    if (!$dbc) {
            print mysqli_error($mysqli);
            return;
    }


    }

}

答案 1 :(得分:1)

如果$ _POST [“year”] == NULL,则只运行查询。你确定那是你想要做的吗?

可能会将第一个块更改为:

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
    $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
    echo '<p class="error">year is not correct!</p>';
}  

if (isset($year)) {

答案 2 :(得分:0)

您似乎从表单元素中将$ year的转义字符串值传入$ year,但您似乎没有对它执行任何操作(至少这是您展示的所有内容)?

将数据放入数据库的代码在哪里?

类似的东西:

  

$ mysqli-&gt;查询(“插入表格   (ColumnName)值('$ year')“;

更新您的代码示例后编辑:

如果您的年份为空,则仅在DB中运行代码。改变你的代码,如David / Josh所示。 : - )

答案 3 :(得分:0)

我认为大卫是对的。尝试将您在上面提供的整个代码更改为:

if (isset($_POST['submit'])) 
{ 
    if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
        $year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
    } else if($_POST['year'] && strlen($_POST['year']) < 4) {
        echo '<p class="error">year is not correct!</p>';
    } else {
        // echo 'Year is blank' or whatever you like here
    }

    // if $_POST['year'] was entered correctly, $year will now
    // have an assigned value and the mysql query will exit
    if (isset($year)) {
        if (mysqli_num_rows($dbc) == 0) {
                $mysqli = mysqli_connect("localhost", "root", "", "sitename");
                $dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year) 
                                             VALUES ('$user_id', '$year')");
                // uncomment below to see the query
                // echo "INSERT INTO users (user_id, year) VALUES ('$user_id', '$year')";
        }
        // I'd suggest changing this if ($dbc) { to:
        else {
                $dbc = mysqli_query($mysqli,"UPDATE users 
                                             SET year = '$year' 
                                             WHERE user_id = '$user_id'");
                // uncomment below to see the query
                // echo "UPDATE users SET year = '$year' WHERE user_id = '$user_id'";
                echo '<p class="changes-saved">Your changes have been saved!</p>';
        }
        if (!$dbc) {
                print mysqli_error($mysqli);
                return;
        }


        }
    }
}

另外,考虑到你的两个原始查询都是单独的if块而不是if-else语句,不管怎么说,这两个查询都没有被执行。上面的代码将其更改为if-else语句,因此至少会执行一个查询。我相信这是原始代码的意图,无论如何。

如果仍然不起作用,请取消注释这些行以回显查询并查看实际发送到数据库的内容。

答案 4 :(得分:0)

您确实在努力清理数据:

if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {

精细。很高兴看到该值是否实际存在于提交的数据中,以及字段中是否存在某种数值,但是...

$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));

如果所有这一切的效果都是为了确保那里没有非数字,那么为什么不简单地执行以下操作:

$year = null;
if (isset($_POST['year'])) {
    $year = preg_replace('/\D/', '', $_POST['year']) // replace anything non-numeric with nothing
    if ($year < 1000) {
        $year = null;
    )
}

这消除了任何尝试的html或sql或javascript注入,确保你有纯数字数据,并且还确保你至少有一个4位数的年份,以及y10k,y100k等。 ..合规。

经过一年的消毒后,您可以将其粘贴到数据库中,如下所示:

if (!isnull($year)) {
    $sql = <<<EOF
INSERT INTO users (user_id, year) 
VALUES ($user_id, $year)
ON DUPLICATE KEY UPDATE
    year=VALUES(year);
EOF;
    $stmt = mysqli_query($sql) or die("Query error: " . mysqli_error()):
}