PHP类最佳实践和类结构

时间:2011-12-29 14:16:44

标签: php html web

我目前正在为PHP5中的小型网站创建一个简单的CMS。这是我在PHP中的第一个“更大”的项目。首先,我正在创建所需的类,这将简化我的工作,并且我被卡住了。我需要你对UserInfo类中的以下函数的看法:

public function setUser($id) {
        if(!isset($id)) {
            return false;
        }

        session_start();
        $conn = new mysql($_SESSION['DBCONNINFO']);
        $sql = "SELECT
                usr.ID,
                usr.USERNAME as TUSERNAME,
                usr.FIRST_NAME,
                usr.LAST_NAME,
                usr.PHONE,
                usr.MOBILE,
                usr.EMAIL,
                usr.ADDITIONAL_INFO,
                usr.LAST_LOGIN_DATE,
                usr.USER_GROUP_ID
                FROM cms_users usr
                WHERE usr.id = " . $id;

        $result = $conn->query_cust($sql);
        $conn=null;

        foreach ($result as $row) {
            $this->id = $row['usr']['ID'];
            $this->username = $row['usr']['TUSERNAME'];
            $this->firstname = $row['usr']['FIRST_NAME'];
            $this->lastname = $row['usr']['LAST_NAME'];
            $this->phone = $row['usr']['PHONE'];
            $this->mobile = $row['usr']['MOBILE'];
            $this->email = $row['usr']['EMAIL'];
            $this->additional_info = $row['usr']['ADDITIONAL_INFO'];
            $this->last_login_date = $row['usr']['LAST_LOGIN_DATE'];
            $this->user_group = $row['usr']['USER_GROUP_ID'];
        }

        return true;
    }  

我是以正确的方式做的,我不是在谈论语法,因为现在我专注于课程结构,设计和最佳实践 - 任何意见都会受到赞赏。

我可以在类构造函数中调用session_start()并使用其中的变量而不是每次都在函数中调用它吗?

我应该通过close()功能关闭数据库连接还是$conn=null可接受的?

将数据库信息存储在会话类中是不好的做法!如果是,将它存储为“全局”变量 - $ _GLOBAL!?

如果有一个'PHP bes练习课程结构在5分钟内为傻瓜'请通知我:))

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用define定义所有常量 例如:

define('DBCONNINFO', "something");

此外,您只需拨打session_start()一次,就可以在脚本的任何位置完成。

答案 1 :(得分:0)

如果你正在使用会话,那么从每个请求获取数据库的数据都没有多大意义。在这种情况下,为什么在setUser()方法中调用session_start()?

当你只提供一种方法时,我们无法真正评论类结构。

此外,由于离开PHP的数据的表示应该适合于数据传输的基板(为了防止SQL注入,电子邮件头注入,CSS ......),因此推迟对表示形式的更改是一种好的做法。数据直到它离开PHP之前。 e.g。

$sql = "SELECT
       ....
            WHERE usr.id = " . mysql_real_escape_string($id);

(或使用绑定参数)

然而,由于用户通常通过用户名而不是用户ID来识别自己,因此它暗示$ id来自用户提供的数据之外的某个地方 - 在这种情况下?当你已经获得会话的标识符(这个数据应该存储在哪里)时,你为什么要用它作为标识符。

或者您是否希望使用此类处理与当前会话用户以外的用户相关的数据 - 在这种情况下无法那里应该有session_start()

抱歉 - 但这不是一个经过深思熟虑的代码,也不是一个很好的问题。

顺便说一句,将连接设置为null不会关闭数据库连接。