【问题标题】:Quick PHP Variable guidance快速 PHP 变量指导
【发布时间】:2015-01-25 00:18:51
【问题描述】:

我是 PHP 新手。我正在尝试为项目创建登录/注册系统,因此我使用的是我发现的登录系统源代码,它具有许多功能和特性,例如加盐密码。系统本身工作正常,但我正在尝试向我的 MySQL 表添加更多字段。系统有一个用于额外列的数组,但我认为它导致了错误的 mysql 语法,所以我决定自己使用变量写出查询,但我不确定如何让函数访问变量。变量在register.php文件中,这里是代码(所有的register.php):

        if( isset($_POST['submit']) ){
            $firstname = $_POST['firstname'];
            $lastname = $_POST['lastname'];
            $user    = $_POST['username'];
            $sex = $_POST['sex'];
            $country = $_POST['strCountryChoice'];
            $email = $_POST['email'];
            $pass    = $_POST['pass'];
            $pass2 = $_POST['pass2'];
            $birthdate = $_POST['birthdate'];
            $created = date("Y-m-d H:i:s");
            //need to add a lot more validation functions.. AKA Check if email exists and username. Password > 5 chars
            if( $user=="" || $email=="" || $pass=='' || $pass2=='' || $firstname=='' || $lastname='' || $sex='' || $country='' || $birthdate='' ){
                echo "Fields Left Blank","Some Fields were left blank. Please fill up all fields.";
                exit;
            }
            if( !$LS->validEmail($email) ){
                echo "E-Mail Is Not Valid", "The E-Mail you gave is not valid";
                exit;
            }
            if( !ctype_alnum($user) ){
                echo "Invalid Username", "The Username is not valid. Only ALPHANUMERIC characters are allowed and shouldn't exceed 10 characters.";
                exit;
            }
            if($pass != $pass2){
                echo "Passwords Don't Match","The Passwords you entered didn't match";
                exit;
            }
        $createAccount = $LS->register($user, $pass,
                array(
                    "email"      => $email,
                    "name"   => $firstname,
                    "lastname" => $lastname,
                    "gender" => $sex,
                    "country" => $country,
                    "DOB" => $birthdate,
                    "created" => date("Y-m-d H:i:s") // Just for testing

                )
            );
            if($createAccount === "exists"){
                echo "User Exists.";
            }elseif($createAccount === true){
                echo "Success. Created account.";
            }
    }

整个系统发生在另一个具有该类的文件中。这里是注册函数:

public function register( $id, $password, $other = array() ){
    if( $this->userExists($id) && (isset($other['email']) && $this->userExists($other['email'])) ){
        return "exists";
    }else{
        $randomSalt = $this->rand_string(20);
        $saltedPass = hash('sha256', "{$password}{$this->passwordSalt}{$randomSalt}");

        if( count($other) == 0 ){
            /* If there is no other fields mentioned, make the default query */
            //old query: ("INSERT INTO `{$this->dbtable}` (`username`, `password`, `password_salt`) VALUES(:username, :password, :passwordSalt)");
            //new query: ("INSERT INTO `{$this->dbtable}` (`username`, 'email' , `password`, `password_salt` , 'name' , 'lastname' , 'gender' , 'country' , 'DOB') VALUES(:username, :email, :pass, :passwordSalt, :firstname, :lastname, :gender, :country, :DOB)");
            $sql = $this->dbh->prepare("INSERT INTO `{$this->dbtable}` (`username`, `password`, `password_salt`) VALUES(:username, :password, :passwordSalt)");
        }else{
            /* if there are other fields to add value to, make the query and bind values according to it */
            //old query: ("INSERT INTO `{$this->dbtable}` (`username`, `password`, `password_salt`, $columns) VALUES(:username, :password, :passwordSalt, :$colVals)");
            //new query: ("INSERT INTO `{$this->dbtable}` (`username`, 'email' , `password`, `password_salt` , 'name' , 'lastname' , 'gender' , 'country' , 'DOB') VALUES(:username, :email, :pass, :passwordSalt, :firstname, :lastname, :gender, :country, :DOB)");
            $keys    = array_keys($other);
            $columns = implode(",", $keys);
            $colVals = implode(",:", $keys);
        //l= $this->dbh->prepare("INSERT INTO `{$this->dbtable}` (`username`, `password`, `password_salt`, $columns) VALUES(:username, :password, :passwordSalt, :$colVals)");
            //INSERT INTO MyGuests (firstname, lastname, email)cLUES ('John', 'Doe', 'john@example.com')
            $sql = $this->dbh->prepare("INSERT INTO `{$this->dbtable}` (username,email,password,password_salt,name,lastname,created,gender,country,DOB) VALUES ('$username','$email','$pass','$saltedPass','$firstname','$lastname','$created','$gender','$country','$birthdate')");
            print($sql);
            foreach($other as $key => $value){
                $value = htmlspecialchars($value);
                $sql->bindValue(":$key", $value);
            }
        }
        /* Bind the default values */
        $sql->bindValue(":username", $id);
        $sql->bindValue(":password", $saltedPass);
        $sql->bindValue(":passwordSalt", $randomSalt);
        $sql->execute();
        return true;
    }
}

所以我需要在类文件中使用 register.php 中的变量。我可以将它包含在顶部还是我需要针对该功能做一些特定的事情?

谢谢。 else 之后我将重点放在 $sql 行上。

【问题讨论】:

  • "我是 PHP 新手,我正在编写一个登录系统。" 不要。请。停在那儿。这些很难做到正确,如果做错了会对安全产生相反的影响。现代 PHP 开发鼓励使用development framework,例如Laravel,它附带一个开箱即用的authentication layer。除非您尝试了所有其他方法并发现它们不够用,否则绝对没有理由自己编写。
  • 感谢您的信息。好吧,我对 PHP 并不是很陌生,但我认为这个问题是一个基本问题。此外,我正在使用某人的源代码,因为我知道自己无法编写完全安全的登录系统。我实际上正在尝试创建一个基于 PHP 的游戏,它使用数据库中的配置文件和许多其他东西。我只是打算用这个创建登录系统,然后用 PHP 自己编写登录页面和所有方面,你会推荐我这样做还是使用开发框架?这不是任务,只是我想在空闲时间从事的爱好。
  • 我从很多人那里听说,作为一个例子,Laravel 真的很容易上手并且使用起来非常愉快。如果您将此作为一种爱好,并且您不想陷入低级 PHP 的困境,那么框架就是您的最佳选择。大多数人都有一个大型的社区代码库,您可以直接添加,而不必自己编写。使用好的框架比没有框架的效率要高得多。

标签: php mysql function variables include


【解决方案1】:

是的,您可以在类文件中包含/要求 register.php 文件以使用所有变量。

另一方面,我想提一下,出于安全考虑,您应该始终过滤掉 POST 数据,然后再将其添加到查询中。

【讨论】:

  • 您好,我在类文件中添加了包含“register.php”,但现在出现内存不足错误?致命错误:第 20 行的 C:\xampp\htdocs\ls\register.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 65488 字节)我不确定为什么会收到错误,因为我相信 register.php 不是t 覆盖任何变量。再次感谢。
  • register.php文件中除了变量还有其他代码吗?
  • 有一些 HTML,假设你不需要它。我在顶部有一些 PHP 代码,其中包括启动系统类的另一个文件 config.php。我将在主帖中添加其余的注册。
  • 条件检查对于 $firstname 之后的所有变量都不正确。您需要使用双等号 (==) 而不是单等号=进行比较,首先更新您的条件 if( $user=="" || $email=="" || $pass=='' || $pass2 =='' || $firstname=='' || $lastname=='' || $sex=='' || $country=='' || $birthdate=='' ){
  • 好的,我更正了,我仍然收到内存错误:(再次感谢。
猜你喜欢
  • 2015-03-01
  • 2014-05-29
  • 2017-09-07
  • 2011-09-03
  • 2017-01-10
  • 2017-12-15
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多