Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 服务器端验证不需要';行不通_Php_Server Side Validation - Fatal编程技术网

Php 服务器端验证不需要';行不通

Php 服务器端验证不需要';行不通,php,server-side-validation,Php,Server Side Validation,我有一个表单,通过jQuery进行客户端验证,效果很好。但现在出于安全原因,我还想为没有JavaScript的用户添加服务器端验证(php)。我创建了几个函数和数组“errors”,其中记录了错误。提交后,我想运行验证。如果未记录任何错误,请继续,如果有错误,请退出脚本。但那部分不起作用,它总是在继续。我的剧本: if (isset($_POST['submit'])) { require_once 'verify_form.php'; $errors = arr

我有一个表单,通过jQuery进行客户端验证,效果很好。但现在出于安全原因,我还想为没有JavaScript的用户添加服务器端验证(php)。我创建了几个函数和数组“errors”,其中记录了错误。提交后,我想运行验证。如果未记录任何错误,请继续,如果有错误,请退出脚本。但那部分不起作用,它总是在继续。我的剧本:

if (isset($_POST['submit'])) {
        require_once 'verify_form.php';
        $errors = array(
            'username' => null,
            'password1' => null,
            'password2' => null,
            'email1' => null,
            'email2' => null,
            'age' => null

        );
        validate_all($errors);
        if(empty($errors['username']) && empty($errors['password1']) && empty($errors['password2']) && empty($errors['email1']) && empty($errors['email2']) && empty($errors['age'])) {
//do something
        } else {
            $_SESSION['errorsArray'] = $errors;
            header('Location: /registracia');
            exit;
        }  
    } 
验证\u form.php

<?php

function validate_all($errors)
{
    validUsername($errors);
    validPassword1($errors);
    validPassword2($errors);
    validEmail1($errors);
    validEmail2($errors);
    validAge($errors);

}

function validUsername($errors)
{
    include 'config.php';
    $username=$_POST['usernameReg'];
    if (strlen($username) < 3 || strlen($username) > 16) {
        $errors['username'] = "Zadajte uživateľské meno v rozmedzí 3 - 16 znakov.";
    } 
        $query = "SELECT * FROM `users` WHERE `username` = '$username'";
        $result = mysqli_query($link, $query) or die(mysqli_error($link));
        if (mysqli_num_rows($result) > 1) {
            $errors['username'] = "Toto uživateľské meno už niekto používa.";

    }
}

function validPassword1($errors)
{
    $password1=$_POST['password1Reg'];
    $regex = '/^([a-zA-Z]|[0-9]|[-]|[_]|[/]|[.])+([a-zA-Z]|[0-9]|[-]|[_]|[/]|[.])+([a-zA-Z]|[0-9]|[-]|[_]|[/]|[.])$/';
    if (!preg_match($regex, $password1)) {
        $errors['password1'] = 'Vaše heslo obsahuje nepovolené znaky.';
    }
    if (strlen($password1) < 6) {
        $errors['password1'] = 'Heslo musí obsahovať minimálne 6 znakov.';
    }
}

function validPassword2($errors)
{
    $password2=$_POST['password2'];
    if ($password1 != $password2) {
        $errors['password2'] = 'Zadané heslá sa nezhodujú.';
    }

}

function validEmail1($errors)
{
    include 'config.php';
    $email1=$_POST['email1'];
    $regex = "/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/";
    if (!preg_match($regex, $email1)) {
        $errors['email1'] = 'Neplatná e-mailová adresa.';
    }
    $query = "SELECT * FROM `users` WHERE `email` = '$email1'";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    if (mysqli_num_rows($result) > 1) {
        $errors['email1'] = "Tento e-mail už niekto používa.";
    }

}

function validEmail2($errors)
{
    $email2=$_POST['email2'];
    if ($email1 != $email2) {
        $errors['email2'] = 'Zadané e-maily sa nezhodujú.';
    }

}

function validAge($errors)
{
    $age=$_POST['age'];
    $regex = "/^([0-9]|[0-9][0-9])$/";
    if (!preg_match($regex, $age)) {
        $errors['age'] = 'Vek musí byť číslo v rozsahu od 0-99.';
    }

}




?>

您正在将
$errors
数组传递到
validUsername()
函数中。函数实际上并不接收原始数组,而是获取其副本。您正在修改副本,但从未修改过原件。下面是一个较小的示例,向您展示了该方法的工作原理:

function addCheese(Array $arr)
{
    $arr[] = 'cheese';
}

$a = array();
addCheese($a);
var_dump($a);
// Outputs:
// array(0) {
// }
解决此问题的一种方法是修改每个验证函数以返回修改后的数组:

function validSomething($errors)
{
    // ... do validation checks
    return $errors;
}
。。。然后将更新版本分配给外部值:

function validate_all($errors)
{
    $errors = validUsername($errors);
    $errors = validPassword1($errors);
    $errors = validPassword2($errors);
    $errors = validEmail1($errors);
    $errors = validEmail2($errors);
    $errors = validAge($errors);
    return $errors;
}
或者,您可以返回错误的本地数组并将它们组合在一起,或者只是通过引用传递(尽管这可能会在以后导致其他问题)


我强烈建议使用某种框架来进行验证:从长远来看,这将为您节省大量时间。

您需要为$errors提供有效的函数指针。比如说


函数validUsername(&$errors)

函数validEmail2($errors)没有意义$email1未定义,并且将始终是!=$_POST['email2']

是的,我这样做了,但新的PHP版本不支持此功能,因此它会给我错误。这不是主要问题,但没有注意到,已修复,谢谢。您能否尝试不检查空($error['xyz])并尝试$error['xyz]!==这不管用。您不是在validate_all函数中一次又一次地重写$errors变量吗?您是否记得让每个“valid…”函数返回
$errors
数组?每次函数调用都会将更多错误数据添加到同一个错误数组中。。。您更改了调用
validate\u all($errors)的代码表示
$errors=validate\u all($errors)这样您就可以使用该函数调用返回的值了?