用于表单清理/检查空值的关联数组

时间:2014-07-23 20:22:37

标签: php

我已成功设置了自己的PHP / MySQL登录系统,但希望改进注册过程。基本上,我希望检查提交的所有值是否为空值(如果为true则返回错误),但我也希望在某些时候对它们进行消毒。我的代码如下,仅用于注册过程 - 我已经省略了其他所有内容,但这应该是所有人都需要参考的。

<?php session_start();
include "connect.php";

$reg = array(
"regEmail" => filter_var(($_POST["email"]), FILTER_SANITIZE_EMAIL),
"regForename" => filter_var(($_POST["forename"]), FILTER_SANITIZE_SPECIAL_CHARS),
"regSurname" => filter_var(($_POST["surname"]), FILTER_SANITIZE_SPECIAL_CHARS),
"regPassword" => filter_var(($_POST["password"]), FILTER_SANITIZE_SPECIAL_CHARS),
);

foreach($reg as $value) {
    if (empty($value)) {
        header("location: error.php");
    }
    else {
        $regUser = "INSERT INTO users (email,password,forename,surname) VALUES ('$reg['regEmail'], $reg['regPassword'], $reg['regForename'], $reg['surename']')";
        if (isset($_POST["submit"])) {
            if (mysqli_query($MySQL,$regUser)) {
                header("location: registration-confirmation.php");
            }
            else {
                header("location: error.php");
            }
        };
        $MySQL->close;
    };
};
?>

有人可以协助吗?我可以为每个表单数据使用一些简单的if / else条件,但这看起来有点麻烦而且效率不高。

我完全希望被告知我的代码是一场灾难,但作为初学者,对我来说更重要的是我正在思考正确的逻辑思维。

我是初学者,所以尽可能多地学习!

感谢您的光临。

2 个答案:

答案 0 :(得分:0)

就个人而言,我就是按照你说的去做。我为每个字段都有一个if语句,如果有任何错误,则添加到$ errors数组。如果有任何错误,请将其显示给用户。

        (!is_numeric($adjustmentInputs[$i]['StartYear']) ? $errors['adjustmentInputs']="Start Year must be a numeric value. Please return to the input page and input only numbers and decimal points." : '');

答案 1 :(得分:0)

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');

$data = array(
    'email'    => $_POST["email"],
    'forename' => $_POST["forename"],
    'surname'  => $_POST["surname"],
    'password' => $_POST["password"],
);

foreach ($data as $key => $value) {
    if (empty($value)) {
        // Creates an array of the missing values so you can let the user know which
        // fields they have missed out
        $errors[] = $key;
    }

    if (isset($errors) && !empty($errors)) {
        return 'You have missed the following fields ' . implode(',', $errors);
    }
}

$stmt = $db->prepare("
    INSERT INTO users (email, password, forename, surname)
    VALUES (:email, :password, :forename, :surname)"
);

$stmt->bindValue(':email', $data['email'], PDO::PARAM_STR);
$stmt->bindValue(':password', $data['forename'], PDO::PARAM_STR);
$stmt->bindValue(':forename', $data['surname'], PDO::PARAM_STR);
$stmt->bindValue(':surname', $data['password'], PDO::PARAM_STR);

if (true === $stmt->execute()) {
    header("location: registration-confirmation.php");
} else {
    header("location: error.php");
}

这样的东西可能会起作用(我还没有测试过)。你真的需要看看哈希密码,将它们保存为纯文本真的不是一个好主意。

此外,您可能希望查看更好的错误处理。如果您知道查询失败的原因而不是重定向到通用错误页面,则更容易调试。