PHP OOP数据库连接

问题描述 投票:8回答:6

我刚刚开始学习面向对象编程的概念,并用函数编写了此类。

正常,但是我有兴趣知道我是否正确完成了此操作...

这是我的代码:

class Database{
    const DB_HOSTNAME = 'localhost';
    const DB_USERNAME = 'root';
    const DB_PASSWORD = 'password';
    const DB_NAME = 'shop';
    protected $_db_connect;
    protected $_sql;
    protected $_result;
    protected $_row;

    function db_connect(){
        $this->_db_connect = mysql_connect(self::DB_HOSTNAME,self::DB_USERNAME,self::DB_PASSWORD) or die(mysql_error());
    }

    function slect_db(){
        mysql_select_db(self::DB_NAME) or die(mysql_error());
    }

    function sql(){
        $this->_sql = 'SELECT * FROM users';
    }

    function query(){
        $this->_result = mysql_query($this->_sql);
    }

    function fetch_array(){
        while($this->_row = mysql_fetch_array($this->_result)){
            $username = $this->_row['user_USERNAME'];

            echo "<ul>";
                echo "<li>".$username."</li>";
            echo "</ul>";
        }
    }

    function db_close(){
        mysql_close($this->_db_connect);
    }
}

$database = new Database();
$database->db_connect();
$database->slect_db();
$database->sql();
$database->query();
$database->fetch_array();
$database->db_close();
php mysql database class oop
6个回答
14
投票

请使用PDO或MySQLi,因为它更加安全,并且如上所述不建议使用mysql_ *函数,我提供了一些使用PDO的通用代码来帮助您进行这项新的尝试。如评论中所述,如果您正在寻找一个面向对象的设计,那么您实际上不应该回显数据,您应该做的是在执行查询之后,返回获取的行并从那里使用一些东西。例如foreach循环,然后显示您的数据。以这种方式执行数据库类还将确保不会一次打开多个数据库连接!请注意,此代码仅供您参考,应在用于生产或任何现场使用之前进行测试。

config.php:

<?php
    //Enter your database connection details here.
    $host = 'localhost'; //HOST NAME.
    $db_name = 'databasename'; //Database Name
    $db_username = 'root'; //Database Username
    $db_password = ''; //Database Password

    try
    {
        $pdo = new PDO('mysql:host='. $host .';dbname='.$db_name, $db_username, $db_password);
    }
    catch (PDOException $e)
    {
        exit('Error Connecting To DataBase');
    }
?>

database.class.php:

<?php
    class database
    {
        function __construct($pdo)
        {
            $this->pdo = $pdo;
        }

        function getData()
        {
            $query = $this->pdo->prepare('SELECT * FROM database');
            $query->execute();
            return $query->fetchAll();
        }
    }
?>

index.php:

<?php
    require_once 'config.php';
    require_once 'database.class.php';
    $db = new database($pdo);
    $rows = $db->getData();
?>

4
投票

可以使用自动加载和依赖项注入容器来改进连接数据库的方式。这是一种使用Auryn连接到数据库的方法,同时确保只打开一个连接,而不必在整个应用程序中手动要求文件。

我在这里只介绍PDO和Auryn。还有其他依赖项注入容器,尤其是mysqli扩展名可以连接到数据库,但是如果您愿意的话,内容应该可以帮助您使用其他容器。

数据库类

拥有数据库类是多余的。 \PDO类已经提供了查询数据库的所有必要方法。当您想要根据特定方法的需要使用多种不同的访存样式时,拥有数据库类使您可以重复提供的功能并限制操作(或创建许多功能)。

依赖项注入

如果还没有,请输入read on dependency injection。关键是,当类需要访问数据库时,不必麻烦构造\PDO对象,而应使用它来构造它:

class Mapper {
    private $pdo;
    public function __construct(\PDO $pdo) {
        $this->pdo = $pdo;
    }
    public function createFromId($id) {
        $stmt = $this->pdo->prepare("SELECT name FROM foo WHERE id=:id");
        $stmt->execute([
            ":id" => $id,
        ]);
        return $stmt->fetchObject();
    }
}

注意,我直接传递了\PDO对象,而不是包装类。这样,我始终可以访问其所有功能,而不仅是用户定义功能的子集。

依赖项注入容器

依赖项注入容器有助于构建您的类,为他们提供所需的对象,并为您提供如何实际构建这些对象的极大灵活性。在这里,我仅专注于通过使用Auryn来配置和[[sharing \PDO对象。

我假设您已经安装了必需的Auryn类,更简单的方法是使用composer。这超出了此答案的范围,关于如何使用它有多种资源。

  • 创建注射器

    $injector = new \Auryn\Injector();

  • 定义\PDO类参数

    $injector->define("PDO", [ ":dsn" => "mysql:host=localhost;charset=utf8;dbname=dbname", ":username" => "user", ":passwd" => "passwd", ":options" => [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ], ]);

    您可以直接在此处编写配置参数,也可以从配置文件中获取它们。我喜欢拥有config.ini文件并使用parse_ini_file()获取配置选项,因为我可以通过编辑配置文件轻松地切换数据库。
  • 共享parse_ini_file()对象

    \PDO

    这部分是

    真的

  • 重要。这行代码使注入器每次负责构造需要连接的类时,都赋予相同的$injector->share("PDO"); 对象。请注意,各行的顺序并不重要,您可以在定义它之前共享类,只需确保在写完这两行后就创建需要类的数据库。
  • 创建您的对象

    \PDO

    就是这样。注入器将创建您的映射器对象,如果尚未创建$mapper = $injector->make("Mapper");
    对象,则将其传递给现有实例。
  • 自动加载

    假设您已经使用过作曲家,则可以使用其强大的自动装带器。否则,您也可以滚动自己的\PDO

    这里的目的是停止在代码中的任何地方都使用autoloader,特别是如果您具有复杂的类层次结构,而在require()兼容的类系统中应该具有这种结构。

    包装

    通过此设置,您现在可以在类中使用single responsibility对象,同时确保每个请求仅一个实例,无需到处都需要文件,并且无需使用单例反模式。

    -1
    投票
    \PDO

    -3
    投票
    $ objConn =新的mysqlconnect();$ Conn = $ objConn-> setobjConnect(“ localhost”,“ root”,“ P @ ssw0rd”);

    -3
    投票
    $database = new Connection(); class Connection { function __construct() { switch($_SERVER['DOCUMENT_ROOT']) { case 'path': $this->host = 'hostname'; $this->user = 'username'; $this->passwd = 'password'; $this->database = 'dbname'; break; default : $this->host = 'localhost'; $this->user = 'root'; $this->passwd = 'root'; $this->database = 'dbname'; break; } $this->clink = @mysql_connect($this->host,$this->user,$this->passwd); @mysql_select_db($this->database,$this->clink); } }

    -6
    投票
    class Database{ var $last_query; //Saved result of the last query made var $last_result; //Results of the last query made var $func_call; //A textual description of the last query/get_row/get_var call var $link; //database link var $lastquery; //last query var $result; //query result // Connect to MySQL database function database() { $this->link=mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('Server connexion not possible.'); //Set All Charsets to UTF8 mysql_query("SET character_set_results=utf8 , character_set_client=utf8 , character_set_connection=utf8 , character_set_database=utf8 , character_set_server=utf8"); mysql_select_db(DB_NAME) or die('Database connection not possible.'); } /** Query the database. * @param $query The query. * @return The result of the query into $lastquery, to use with fetchNextObject(). */ function query( $query ){ $this->lastquery=$query; $this->result=@mysql_query( $query, $this->link ); return $this->result; } /** Do the same as query() but do not return nor store result. * Should be used for INSERT, UPDATE, DELETE... * @param $query The query. * @param $debug If true, it output the query and the resulting table. */ function execute($query) { @mysql_query($query); } /** Convenient method for mysql_fetch_object(). * @param $result The ressource returned by query(). * @return An ARRAY representing a data row. */ function fetchArray($result){ if ($result == NULL) $result = $this->result; if ($result == NULL || mysql_num_rows($result) < 1) return NULL; else return mysql_fetch_assoc($result); } /** Close the connecion with the database server. * It's usually unneeded since PHP do it automatically at script end. */ function close() { mysql_close($this->link); } /** Get the number of rows of a query. * @param $result The ressource returned by query(). If NULL, the last result returned by query() will be used. * @return The number of rows of the query (0 or more). */ function numRows($result = NULL) { if ($result == NULL) return @mysql_num_rows($this->result); else return mysql_num_rows($result); } }
    ![<?php
    class mysqlconnect{
    private $server=null;private $user=null;private $password=null;private $objConnect=null;
    function setobjConnect($s,$u,$p){
    $this->server = $s;
    $this->user = $u;
    $this->password = $p;
    return $this->objConnect = mysql_connect($this->server,$this->user,$this->password);
    }
    }
    $objConn = new mysqlconnect();
    $Conn = $objConn->setobjConnect("localhost","root","P@ssw0rd");
    if($Conn)
        {
            echo "Database Connect";
        }
        else
        {
            echo "Database Connect Failed.";
        }
    mysql_close($Conn); 
    
    ?>]
    
    热门问题
    推荐问题
    最新问题