将MySQL代码与PHP代码分离是一种标准的常见做法吗?

时间:2013-11-22 04:14:11

标签: php mysql

我被告知将MySQL代码与PHP代码分开是一种常见做法,这是真的吗?这是一个新的编码标准吗?这样做有什么好处吗?

在为群众写作时,有人可以指导我最好的编码实践(PHP/MySQL)吗(例如开源脚本)。

谢谢!

4 个答案:

答案 0 :(得分:5)

好问题!

  • 我被告知将MySQL代码与PHP代码分开是一种常见做法,这是真的吗?
    • 绝对正确!
  • 这是一个新的编码标准吗?
    • 和旧的概念。没有标准,但存在事实
  • 这样做有什么好处吗?
    • 许多好处
    • 从图层之间的分离中获益。
    • 当业务逻辑与表示逻辑解耦时,如果需求发生变化,您可以轻松更改它。
    • 所以不仅要从php中分离sql,还要将HTML代码与php逻辑分开

使用sqlMap

在Java世界中有MyBatis SqlMapper。这是非常常用的,如果你是Java程序员,这就是你想要的。

但在PHP中,很难找到像MyBatis这样的东西,我发现的唯一内容是PRADO http://www.pradosoft.com/

使用ORM

ORM =对象关系图。 http://en.wikipedia.org/wiki/Object-relational_mapping 这也是使用的。但我不知道有PHP的ORM框架。如果有人知道,请告诉我。 @jszobody建议 http://www.doctrine-project.org/projects/orm.html(谢谢)

感谢。

答案 1 :(得分:2)

  

我被告知将MySQL代码与...分开是一种常见的做法   PHP代码,这是真的吗?

我认为,您正在谈论Loose coupling,将您的应用程序逻辑分开(构建一个良好的架构),这样您就可以保持组织有序,可维护。实际上,这是一个过于广泛的讨论,我可能无法正确描述所有内容,只能回答你的问题,,这是一个很好的(推荐的)实践和软件开发的设计原则。

在应用程序中,最重要的部分是域/业务逻辑,它为应用程序提供服务,应该与其他逻辑分开,例如表示逻辑(UI)。例如,如果您的应用程序处理用户,产品的创建,那么您可以将它们保存在一个单独的位置,每个位置作为应用程序的实体。例如

用户管理

class User {

    public function createUser()
    {
        // ...
    }

}

产品管理

class Product {

    public function addProduct()
    {
        // ...
    }

}

这是您的业务逻辑,您可以从单独的类/地点(如

)使用/调用这些逻辑
$user = new User;
$user->create();

现在,想想数据存储机制,如果你创建一个新用户,你可能需要将所有信息放在一个地方,它可能是一个数据库,一个平面文件或者应该是一个xml文件,所以,应该是什么在createUser()函数中,您应该在数据存储和业务逻辑之间使用数据访问层,这意味着,无论您使用何种数据存储,都不应在createUser()函数中使用任何代码(业务逻辑),而不是通过另一层(DAL)访问数据存储,例如,您的createUser()函数可能看起来像这样

class User {

    protected $storage = null;

    public function __construct($storage)
    {
       $this->storage = $storage;
    }

    public function createUser()
    {
        $userData = $_POST['first_name'];
        $userData = $_POST['user_name'];
        // more fields...

        // data validation

        $this->storage->save($userData);
    }
}

现在,要创建用户并将其保存在数据库中,您可以像

一样使用它
$storage = new DbStorage();
$user = new User($storage);

也许,您想使用平面文件来存储数据而不是数据库,没问题,只需更改数据存储,即

$storage = new FileStorage();
$user = new User($storage);

现在,看看差异,你的保存方法不知道存储机制,只是调用storage->save(),每个存储都有自己的保存机制,事情有条理,干净,易于维护,更改存储机制,而不对代码进行任何更改。所以,就像

  

业务逻辑 - >数据访问层 - >数据存储

在数据访问层,你应该根据你的存储机制编写代码,如果你有一个数据库作为存储,那么你根据它编写代码,在这种情况下,你的DbStorage可能拥有它自己的{ {1}}(不同数据库的不同驱动程序,即abstract database layermysql等),此处oracle正在运行。

因此,主要的是保留ORM,这有助于您构建一个干净且可维护的应用程序。这只是一个小小的想法。这些链接可以帮助您

  1. Separation of concerns
  2. SOLID
  3. Software design pattern
  4. PHP - The Right Way
  5. Data access layer
  6. ORM
  7. 更新:我想我应该补充一点关于数据库抽象层的例子

    因此,当您使用数据库存储机制时,可以使用

    loosely coupled

    但是,此$storage = new DbStorage(); $user = new User($storage); 应包含不同类型数据库的另一个图层,即DbStoragemyaql等。在这种情况下,您的oracle可能如下所示< / p>

    DbStorage

    要使用它,您可以使用这样的代码

    class DbStorage{
    
        protected $db = null;
    
        public function __construct($database)
        {
            $this->db = $database;
        }
    
        public function save($data)
        {
            $this->db->insert($data);
        }
    
    }
    

    或者对于其他数据库引擎,您可以使用

    $config = array('hostname' =>'localhost', 'username'=>'root', 'password'=>'123456', 'database'=>'myDatabase');
    $storage = new DbStorage(new MySqlDriver($config));
    $user = new User($storage);
    

    现在,您的不同数据库驱动程序可能看起来像这样

    $config = array('hostname', 'username', 'password');
    $storage = new DbStorage(new OracleDriver($config));
    $user = new User($storage);
    

    对于class MySqlDriver(){ public $connection; public $database; public function __construct($config) { $this->connection = mysql_connect($config['hostname'], $config['username'], $config['password'], $config['database']); mysql_select_db($db); } public function insert($data) { // code for insert (mysql) } } ,您可以将另一个班级设为oracle

    OracleDriver

    这只是数据库抽象层的一个概念,在大多数情况下,每个数据库(class OracleDriver(){ // ... public function __construct($config) { // ... } public function insert($data) { // code for insert (oracle) } } MySqlDriver)的配置可能包含在配置文件中,即OracleDriver,我的包含数组如

    database.php

    这只是一个粗略的想法,您可以在网上找到更好的示例,并且有很多开源库可以在实时项目中使用。

答案 2 :(得分:0)

是的,这是许多编程语言的标准。通常,您会编写存储过程并让您的PHP代码利用这些来执行数据库工作。这种分离使您可以更轻松地管理代码库,并有助于维护和扩展。

答案 3 :(得分:0)

不要太过于字面意思 因为没有办法遵循它。

如您所见,没有人为您提供示例脚本。这个网站存在很大问题。我称之为太多的知识。缺乏练习

所以,它不能用作经验法则​​。使用存储过程,您可以在其中执行单个基于主键的查找,这只是一种过度杀伤力。并且ORM无法为您创建任何复杂的查询。所以,它比“编码标准”更符合善意

然而,您可以轻松遵循的经验法则:永远不要让您的SQL和 HTML 在同一个文件中相遇。这一个很容易理解,而且更多实用,因为你必须比数据库后端更频繁地改变外观。