我真的需要一个MySQL查询类吗?

时间:2014-03-02 13:37:48

标签: php mysql class

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

我已经完成了本教程(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","this@wasinsert.ed<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;
    }

}

3 个答案:

答案 0 :(得分: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使用Active Record Pattern,您的实体类也用于处理查询和持久性。例如:

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

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

答案 1 :(得分:0)

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

您可以在PHP中使用mysqli_fetch_assoc()mysqli_query()来插入和检索表中的数据。在任何一种情况下都没有性能问题。

答案 2 :(得分:0)

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

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

让我们试试。

但在我们编写之前,我们必须了解一些基本概念或一些基本术语 关于ORM相关科目。在这个例子中,我们将:

  1. ORM库 - 有了所有好东西,ORM库负责处理服务器连接和服务器连接抽象。 (ORM的主要目标是将类映射到实际表,但稍后我们将返回到此。)

  2. 数据层 - 这是ORM的实际部分,在本例中我们将它与O​​RM分开以查看它的作用。该部分负责将类映射到表。 例如,数据访问层知道如何将特定类对象保存到实际表以及如何将特定表加载到特定类对象。 (注意:几乎任何最近的ORM都可以避开这一层。例如http://dbphp.net或Doctrine将支持该层的各个方面以及关系甚至自动表生成。

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

  4. 让我们从业务层或模型开始我们的示例。我们非常简单的保存和加载用户的项目将有一个类业务层:

    <?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 而非用户。 'user'类对象表示用户的单个实体,而'users'类对象表示用户类的处理程序。

    <?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. 最后让我们初始化$ database object
    2. 建立一些sql server链接。
    3. 将用户类处理程序添加到数据库。
    4. 使用它。
    5. 这是在工作中:

      <?
      $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. Doctrine - http://www.doctrine-project.org/ - 全功能复杂的php ORM框架
      2. db.php - http://dbphp.net/ - 功能齐全但非常简单的php ORM框架。
      3. 请参阅? ORMs不吃开发者:P

        如果您希望轻松入手 - 请从http://github.com/hazardland/db.php

        开始