2014-03-02 14 views
1

我有一个简单的登录和注册表单,有一些额外的插入和选择查询各种不同的东西。我真的需要MySQL查询的类吗?

我已经完成了本教程(http://code.tutsplus.com/tutorials/real-world-oop-with-php-and-mysql--net-1918),该教程创建了一个PHP类,该类很容易选择,插入,断开连接,更新到MySQL服务器。

事情是,现在我已经完成了教程,并开始实施一些从静态选择和插入查询到引用类内函数的新查询的更改,我看到新代码更长,更复杂,我觉得这是课堂的目标。

有什么想法和建议吗?

例如,一般插入查询云:

mysqli_query("INSERT INTO statuses(User_ID, Status)VALUES('$userid', '$statusupdate')") or die(myself_error()); 

然而,上面提到的教程所需的以下:

$db->insert('mysqlcrud',array(3,"Name 4","[email protected]<script type="text/javascript"> 
/* <![CDATA[ */ 
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})(); 
/* ]]> */ 
</script>")); 

类文件表示:

<?php 
/** 
* Created by PhpStorm. 
* User: marshall 
* Date: 01/03/14 
* Time: 21:34 
*/ 

namespace MySQL\lib; 


class Database { 


     private $db_host = 'localhost'; 
     private $db_user = 'root'; 
     private $db_pass = 'pass'; 
     private $db_name = 'database'; 


    public function connect() { 
     if(!$this->con) { 
      $myconn = mysql_connect($this->db_host, $this->db_user, $this->db_pass); 
      if(myconn) { 
       $seldb = mysql_select_db($this->db_name,$myconn); 
       if($seldb) { 
        $this->con = true; 
        return true; 
       } else { 
        return false; 
       } 
      } else { 
       return false; 
      } 
     } else { 
      return true; 
     } 
     } 

    public function disconnect() { 
     if($this->con) 
     { 
      if(mysql_close()) 
      { 
       $this->con = false; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 

    private $result = array(); 

    private function tableExists($table) 
    { 
     $tablesInDb = mysql_query('SHOW TABLES FROM '.$this->db_name.' LIKE "'.$table.'"'); 
     if($tablesInDb) 
     { 
      if(mysql_num_rows($tablesInDb)==1) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 


    public function select($table, $rows = '*', $where = null, $order = null) 
    { 
     $q = 'SELECT '.$rows.' FROM '.$table; 
     if($where != null) 
      $q .= ' WHERE '.$where; 
     if($order != null) 
      $q .= ' ORDER BY '.$order; 
     if($this->tableExists($table)) 
     { 
     $query = mysql_query($q); 
     if($query) 
     { 
      $this->numResults = mysql_num_rows($query); 
      for($i = 0; $i < $this->numResults; $i++) 
      { 
       $r = mysql_fetch_array($query); 
       $key = array_keys($r); 
       for($x = 0; $x < count($key); $x++) 
       { 
        // Sanitizes keys so only alphavalues are allowed 
        if(!is_int($key[$x])) 
        { 
         if(mysql_num_rows($query) > 1) 
          $this->result[$i][$key[$x]] = $r[$key[$x]]; 
         else if(mysql_num_rows($query) < 1) 
          $this->result = null; 
         else 
          $this->result[$key[$x]] = $r[$key[$x]]; 
        } 
} 
} 
return true; 
} 
else 
    { 
     return false; 
    } 
} 
else 
return false; 
} 
    public function insert($table,$values,$rows = null) 
    { 
     if($this->tableExists($table)) 
     { 
      $insert = 'INSERT INTO '.$table; 
      if($rows != null) 
      { 
       $insert .= ' ('.$rows.')'; 
      } 

      for($i = 0; $i < count($values); $i++) 
      { 
       if(is_string($values[$i])) 
        $values[$i] = '"'.$values[$i].'"'; 
      } 
      $values = implode(',',$values); 
      $insert .= ' VALUES ('.$values.')'; 
      $ins = mysql_query($insert); 
      if($ins) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 



    public function delete($table,$where = null) 
    { 
     if($this->tableExists($table)) 
     { 
      if($where == null) 
      { 
       $delete = 'DELETE '.$table; 
      } 
      else 
      { 
       $delete = 'DELETE FROM '.$table.' WHERE '.$where; 
      } 
      $del = mysql_query($delete); 

      if($del) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     } 
    } 


    public function update($table,$rows,$where) 
    { 
     if($this->tableExists($table)) 
     { 
      // Parse the where values 
      // even values (including 0) contain the where rows 
      // odd values contain the clauses for the row 
      for($i = 0; $i < count($where); $i++) 
      { 
       if($i%2 != 0) 
       { 
        if(is_string($where[$i])) 
        { 
         if(($i+1) != null) 
          $where[$i] = '"'.$where[$i].'" AND '; 
         else 
          $where[$i] = '"'.$where[$i].'"'; 
        } 
       } 
      } 
      $where = implode('=',$where); 


      $update = 'UPDATE '.$table.' SET '; 
      $keys = array_keys($rows); 
      for($i = 0; $i < count($rows); $i++) 
      { 
       if(is_string($rows[$keys[$i]])) 
       { 
        $update .= $keys[$i].'="'.$rows[$keys[$i]].'"'; 
       } 
       else 
       { 
        $update .= $keys[$i].'='.$rows[$keys[$i]]; 
       } 

       // Parse to add commas 
       if($i != count($rows)-1) 
       { 
        $update .= ','; 
       } 
      } 
      $update .= ' WHERE '.$where; 
      $query = mysql_query($update); 
      if($query) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public function getResult() 
    { 
     return $this->result; 
    } 

} 
+0

开始类的代码可能会更长,复杂但肯定会简化这个过程,当你真正开始使用的类对象您的代码 – anurupr

+0

请分享您的代码。也许你需要在现有的类中创建新的方法......而且,是的,面向对象的方法应该在更复杂的事情中展示它的优点... – sinisake

+0

你的第二个片段中的JavaScript是什么?它是否意外? –

回答

2

这一切都取决于您的应用程序的大小:如果它很简单,不需要抽象数据库查询,您可以使用PDO或类似的库来访问您的数据库。

但是,如果代码库变大,则可能需要一个ORM来处理记录及其关系。

一个着名的PHP ORM是Doctrine。它遵循仓库模式,这意味着你的记录只不过是getter和setter的集合,而所有的逻辑(查询,插入等)都是使用另一个对象完成的。例如:

$user = new User(); 
$user 
    ->setName('John Doe') 
    ->setUsername('j.doe') 
    ->setPassword('random123') 
; 

$em = $doctrine->getEntityManager(); 

$em->persist($user); 
$em->flush(); 

Propel,在另一方面,使用活动记录模式,你的实体类也被用来处理查询和持久性。例如:

$user = new User(); 
$user 
    ->setName('John Doe') 
    ->setUsername('j.doe') 
    ->setPassword('random123') 
; 
$user->save(); 

要选择哪种模式主要是主观偏好问题。

+0

嗨,感谢您的回答,我编辑了我原来的问题。正如你可以看到代码中的差异,我仍然很好奇,如果我最初遵循的教程是MySQL查询类的一个很好的例子。 – Marshiewooooooo

+1

为了完整起见,可能值得在这里添加一条语言,Doctrine只是一个ORM的例子。在PHP中,Propel是另一个,许多框架(如Cake和Laravel)都提供了自己的集成ORM。 – halfer

+1

@halfer:谢谢,我已经更新了我的答案。 –

0

使用数据库的类将减少额外的编写代码以从表中获取记录,但它不是使用类函数插入和从表中检索数据是必要的。

您可以在PHP中使用mysqli_fetch_assoc()mysqli_query()从表中插入和检索数据。这两种情况都没有性能问题。

+3

** mysql **扩展是旧的,从PHP 5.5开始已被弃用。新的应用程序不应该依赖它。 –

0

为什么不简单地使用一些简单的ORM库?

您知道ORM的概念非常简单,我可以在此答案中随时编写ORM库。 :D

所以让我们试试。

但是在写它之前,我们必须知道一些关于ORM相关主题的基本概念或一些基本术语 。在这个例子中,我们将有:

  1. ORM库 - 与所有的好东西ORM库需要有责任采取有关服务器连接和服务器连接抽象照顾。 (ORM的主要目标是将类映射到实际表,但我们稍后会回到这个表)。数据层 - 在这个例子中,这是ORM的实际部分,我们将它与O​​RM区分开来,看看它有什么作用。这部分负责将类映射到表。 例如,数据访问层知道如何将特定的类对象保存到实际的表以及如何将特定的表加载到特定的类对象。 (注意:几乎任何最近的ORM都可以避免你从这个层次中获得,例如http://dbphp.net或Doctrine将支持这个层次的每个方面加上关系,甚至自动生成表格)。

  2. 业务层 - 此层包含您的实际工作类业务层通常代表模型或模型包含业务层。但是在现实世界中,如果您正在使用ORM库业务,您需要开发其他功能的唯一层已经捆绑在ORM中。

让我们从业务层或模型开始我们的例子。我们非常非常简单的项目,保存和载入的用户都会有一类业务层:

<?php 
class user 
{ 
    public $id; 
    public $name 
    public function __construct ($name=null) 
    { 
     $this->name = $name; 
    } 
} 
?> 

当你看到你的业务层或模型一无所知哪里以及它是如何保存或加载。它只是处理项目相关的业务。这就是图层名称的来源。

其次,让我们做一个简单的ORM库:

<?php 

//The connection link which can be changed any time 
class link 
{ 
    public $link; 
    public function __construct ($hostname, $database, $username, $password) 
    { 
     $this->link = new \PDO ('mysql:host='.$hostname.';dbname='.$database, $username, $password); 
     $this->link->query('use '.$database); 
    } 
    public function fetch ($query) 
    { 
     $result = $this->link->query($query)->fetch(); 
    } 
    public function query ($query) 
    { 
     return $this->link->query($query); 
    } 
    public function error() 
    { 
     return $this->link->errorInfo(); 
    } 
} 

//A structure which collects all link(s) and table/class handlers togather 
class database 
{ 
    public $link; 
    public $tables = array(); 
    public function __construct ($link) 
    { 
     $this->link = $link; 
     table::$database = $this; 
    } 
} 

//A basic table handler class 
//Note: Every modern ORM automatically maps your classes to tables 
class table 
{ 
    public static $database; 
} 
?> 

正如你在我们的ORM注意到我们的表类看起来很可怜​​。但是,如果这是一个复杂的ORM库,它将支持数据层,并具有与任何表一起使用的所有功能。

但是由于我们需要知道ORM如何在这种情况下工作,我们将为业务层中的每个类创建数据层 处理程序。

所以这是你的数据层。它是如此自我描述性,我认为它不需要任何文档:

请注意,以下类名称是用户s而不是用户。 '用户'类对象表示用户的单个实体,而'用户'类对象表示用户类的处理器。

<?php 
class users extends table 
{ 
    public function create ($row) 
    { 
     $return = new user(); 
     $return->id = $row[0]; 
     $return->name = $row[1]; 
     var_export($row); 
     return $return; 
    } 
    public function load ($id=null) 
    { 
     if ($id==null) 
     { 
      $result = self::$database->link->fetch("select * from users"); 
      if ($result) 
      { 
       $return = array(); 
       foreach ($result as $row) 
       { 
        $return[$row[0]] = $this->create($row); 
       } 
       return $return; 
      } 
     } 
     else 
     { 
      $result = self::$database->link->fetch("select * from users where id='".$id."'"); 
      if ($result) 
      { 
       return $this->create(reset($result)); 
      } 
      else 
      { 
       echo ("no result"); 
      } 
     } 
    } 
    public function save ($user) 
    { 
     if (is_array($save)) 
     { 
      foreach ($save as $item) $this->save ($item); 
     } 
     if ($user->id==null) 
     { 
      return self::$database->link->query("insert into users set 
               name='".$user->name."'"); 
     } 
     else 
     { 
      return self::$database->link->query("update users set name='".$user->name."' 
               where id='".$user->id."'"); 
     } 
    } 
    public function delete ($user) 
    { 
     self::$database->link->query ("delete from users where id='".$user->id."'"); 
    } 
} 
?> 
  1. 最后,让我们的init $数据库对象
  2. 建立一些对某些SQL Server链接。
  3. 将用户类处理程序添加到数据库。
  4. 使用它。

下面是它的工作:

<? 
$database = new database (new link('127.0.0.1', 'system_db', 'root', '1234')); 
$database->tables['users'] = new users(); 

if (!$database->tables['users']->save (new user('Admin'))) 
{ 
    var_export($database->link->error()); 
} 

var_export($database->tables['users']->load(2)); 
?> 

如果您需要在PHP ORM的其他概念潜水的随时访问

  1. 主义 - http://www.doctrine-project.org/ - 全功能复杂的PHP ORM框架
  2. db.php - http://dbphp.net/ - 全功能但很容易的PHP ORM框架。

请参阅?奥姆斯不吃开发商:P

如果您寻找易启动 - 与http://github.com/hazardland/db.php