Php 如何解决此登录脚本的问题?

Php 如何解决此登录脚本的问题?,php,Php,我被我的编码卡住了:我需要检查电子邮件是否合法,还要检查密码是否匹配 正如你所看到的,我试图确保它里面有“@”,但它不起作用 <?php error_reporting(1); include("../site/inc/config.php"); if (isset($_POST['submit'])) { $username = clean($_POST['username']); $password = clean($_POS

我被我的编码卡住了:我需要检查电子邮件是否合法,还要检查密码是否匹配

正如你所看到的,我试图确保它里面有“@”,但它不起作用

 <?php
    error_reporting(1);
    include("../site/inc/config.php");

    if (isset($_POST['submit'])) {
        $username = clean($_POST['username']);
        $password = clean($_POST['password']);
        $pass_conf = clean($_POST['password2']);
        $email = clean($_POST['email']);
        $ip = $_SERVER['REMOTE_ADDR'];
        $reg_date = date("F jS, Y - g:i a");
        $md5 = md5($password);

        if(!$username){
            header("Location: /site/register.php?error=1");
            //error
            die;
        }


        if(!$password){
            header("Location: /site/register.php?error=1");
            //error
            die;
        }


        if(!$pass_conf){
            header("Location: /site/register.php?error=1");
            //error
            die;
        }


        if(!$email){
            header("Location: /site/register.php?error=1");
            //error
            die;
        }

        $sign = '@';

        if (strpos($email,$sign) !== true) {
            header("Location: /site/register.php?error=122");
            //error
            die;
        }

        $check_user = mysql_query("SELECT `username` FROM `users` WHERE `username` = '".$username."'");

        if(mysql_num_rows($check_user) !== 0){
            header("Location: /site/register.php?error=2");
            //error
            die;
        }

        $check_email = mysql_query("SELECT `email` FROM `users` WHERE `email` = '".$email."'");

        if(mysql_num_rows($check_email) !== 0){
            header("Location: /site/register.php?error=3");
            //error
            die;
        }

        mysql_query("INSERT INTO `users` (`username`, `password`, `email`, `ip`, `rank`, `reg_date`) VALUES ('$username', '$md5', '$email', '$ip', '1', '$reg_date')");
        header("Location: /site/register.php?success=1");
    } else {
        header("Location: register.php?error=4");
    }

    ?>

这是正确的,因为strpos永远不会返回true。它返回false或整数。因此,如果strpos严格等于false,则在这种情况下会出现错误

要获得密码匹配,只需比较密码:

if ($password !== $pass_conf) {
    /* error ! */
}

注意:用
mysql\u real\u escape\u string($variable)
将查询中的$variables括起来。如果不是,你就要冒SQL注入的风险。

啊。首先,不要使用弃用的
mysql\uquot
切换到

其次,在未检查变量是否已设置的情况下,不要使用
$\u POST
$\u GET
$\u COOKIE
变量。而是:

$request_variables = array('password', 'password2', 'username', ...);
$data = array();
foreach( $request_variables as $k){
    if( !isset( $_POST[$k])){
        header( 'Location: http://...'); // Yes, use absolute url
        die();
    }

    $v = clean( $_POST[$k]);
    if( !$v){
        // header, die
    }

    $data[$k] = $v;
}
然后,确保在将数据推入查询之前正在转义数据。如果不与参数一起使用,则至少使用*sigh*和最后但并非最不重要的一点,用于电子邮件验证一段时间:

if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
    header("Location: http://.../site/register.php?error=122");
    die();
}
是的,密码匹配:

if( $data['password'] !== $data['password2']){
    header(...);
    die(...);
}

但我也会尝试验证密码是否匹配),这样密码只会发送一次,并且在禁用javascript的情况下也会同时发送到服务器)。

试试看!=而不是==是啊,哈哈。我想它起作用了,谢谢。那么j.s.这行吗?函数clean($str){//clean字符串并返回它return mysql\u real\u escape\u string(strip\u tags(stripslashes($str));//返回一个更干净的字符串。}我已经将它放在我的配置中,它将继续运行pages@ElizabethEdge这是可行的,但是,
stripslashes
调用是绝对不必要的。(当我的回答有帮助时,请接受。)
if( $data['password'] !== $data['password2']){
    header(...);
    die(...);
}