不要马上看到这背后的重点(php,school)

Kdg*_*Dev 3 php mysql

我是第二年的ICT学生.我从来没有在今年之前做过PHP,我们的讲师给了我们基础知识,在学期结束时,给了我们一个项目,将我们在课程中学到的东西和数据库课程结合起来.我们在Windows上使用经典的AMP设置.

现在,我们的教练告诉我们根据我们在课堂上制作小型网站的方式制作个人资料网站.

我没有看到将用户输入数据库的有点奇怪的方法背后的重点.

首先,我们进行一些PHP表格检查,以确保输入的数据是安全的并且有些现实(例如,这里的邮政编码是4个数字,从不更多,没有字母或其他符号).

如果一切正常,我们会执行以下操作:

$sql = new SqlObject(); //from SqlObject.class.php
$newUser = new User(login,passw,mail,...,...,...); //from User.class.php
$sql->addUser($newUser);
Run Code Online (Sandbox Code Playgroud)

SqlObject类是一个包含我们需要更新,插入并通常更改数据库中数据的所有SQL命令的类.我们从不在普通页面中编写SQL .但那并不是我困惑的事情.这是User.class.php文件.

此文件仅包含构造函数和与需要输入数据库的字段数量完全相同的字段.例如:

<?php

  class User {
    // members
    var $id;
    var $name;
    var $password;

    // constructor
    function User($id=-1,$name='',$password='') {
        $this->id = $id;
        $this->name = $name;
        $this->password = $password;
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

而已.SqlObject.class.php文件需要第一行的User.class.php文件.

addUser($user)SqlObject.class.php文件中的函数如下所示:

function addUser($user) {
  $insQuery = 'INSERT INTO users(name,password)';
  $insQuery.= " VALUES ('".$user->name."', '".$user->password."')";
  @mysql_query($insQuery) or showError("user insert failed");
}
Run Code Online (Sandbox Code Playgroud)

为什么要通过User.class.php文件绕道而行呢?某种安全理由?

我再说一遍:这是我使用PHP的第一年,我还是学生.

编辑:人们抱怨在插入数据之前没有检查SQL注入.

在这篇文章的开头,我提到了"formchecking".该register.php文件执行所有转义和检查输入.这包括几个Regex测试,mysql_real_escape_string()和一些更简单的测试.一旦所有测试都通过并且所有输入都被转义,那么只有这样才会发生:

$sql = new SqlObject(); //from SqlObject.class.php
$newUser = new User(login,passw,mail,...,...,...); //from User.class.php
$sql->addUser($newUser);
Run Code Online (Sandbox Code Playgroud)

如果输入没有收到我看到有些人想要在SqlObject.class.php文件中提供它的处理,那么该代码永远不会被执行.

EDIT2:正如所承诺的那样,博客发布了

djn*_*jna 5

所以,你问为什么不直接传递用户和密码

 function addUser($name='',$password='') { etc
Run Code Online (Sandbox Code Playgroud)

我的猜测是你展示的代码是一个面向未来的例子,这个想法是User类可能在将来做更详细的事情,或从其他来源获取凭据,而不是通过名称和密码到它的构造函数.

这是一个关注点分离的想法,如果代码负责组装超级数据,addUer函数只是使用它需要的东西.在大型程序中,拥有这些类型的组织确实很有帮助 - 从表面上看,它似乎增加了复杂性,但是当你开始这样思考时,它可以限制你需要保留的部分数量.您也可以想象分解整个编程任务,以便一个人查看User类,另一个人查看addUser.他们可以独立工作.愚蠢在这个小小的情况下,但在现实世界中非常有益.