【问题标题】:Reusing a mysql connection in oop php [duplicate]在oop php中重用mysql连接[重复]
【发布时间】:2015-07-02 22:57:25
【问题描述】:

解决方案取自评论,因此我无法接受关闭此问题的答案。但我确实在下面发布了适合我的实际解决方案

我是 OOP 的新手,即使阅读了相当多的示例,我也无法弄清楚如何在不使用 $GLOBALS 的情况下使用相同的 mysql 连接。

如果有人可以像我两岁的孩子一样解释它,那将非常有帮助。

这是我的连接文件。

$hostname = 'hostname';
$username = 'db';
$password = 'password';

try {
$dbh = new PDO("mysql:host=$hostname;dbname=db", $username, $password);
}
 catch(PDOException $e)
    {
    echo $e->getMessage();
 }

但是要在类或函数中使用它,我会这样做:

class basic {

function simple($id) {

$query = $GLOBALS['dbh']->query("SELECT * FROM table WHERE id = $id");
$row = $query->fetch(PDO::FETCH_OBJ);
$thing = $row->partoftable;
echo $thing;
 }
}

$first = new basic();
$first->simple(12);

这当然会返回我正在寻找的 ID 为 12 的 $thing。但是如果没有 GLOBALS['dbh'] 连接到数据库,我该怎么做呢?

也可以随意撕开其他任何东西,但请记住,这是我所说的最简单的例子。

提前致谢。

根据下面的评论,这是适合我的解决方案。

class basic {

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

function simple($id) {

$query = $this->dbh->query("SELECT * FROM table WHERE id = $id");
$row = $query->fetch(PDO::FETCH_OBJ);
$thing = $row->partoftable;
echo $thing;
 }
}

$first = new basic($dbh);
$first->simple(12);

谢谢。希望这对其他人有帮助。

【问题讨论】:

  • 基本应该知道$dbh,通过__constructor阅读更多Dependecy Injection
  • @cske 谢谢!这太简单了,我一开始就无法理解它。我只需要在 $first = new basic($dbh) 中传递它,然后使用 __constructor 让它在课堂上发生。只是想更明确,以防其他人遇到这个问题。再次感谢!

标签: php mysql oop superglobals


【解决方案1】:
    <?php
define('DB_SERVER','localhost');
define('DB_USER','root');
define('DB_PASS' ,'');
define('DB_NAME', 'db');
class DB_con {
    function __construct()
    { 
            $conn = mysql_connect(DB_SERVER,DB_USER,DB_PASS) or die('localhost connection problem'.mysql_error());

                mysql_select_db(DB_NAME, $conn); 
    } 

    public function insert($fname,$lname,)
    { 
        $res = mysql_query("INSERT users(first_name,last_name,) VALUES('$fname','$lname')");
        return $res;
    }
    public function select($id)
    { 
        $res=mysql_query("SELECT * FROM users WHERE id = $id");
        return $res;
    }
} ?>

【讨论】:

    【解决方案2】:

    您可以为数据库连接创建一个类:

    class MysqlDB
    {
        private $conn;
        public function __construct($hostName, $userName, $passWord, $databaseName)
        {
            $this->conn = new PDO("mysql:host=$hostName;dbname=$databaseName", $userName, $passWord);
        }
    
        public function query($id)
        {
            //This is just a sample query
            $this->conn->query("SELECT * FROM table WHERE id = $id");
            return $query->fetch(PDO::FETCH_OBJ);
        }
    }
    

    然后你可以在另一个类中使用:

    class basic {
      private $dbConn;
      function __construct(){
          $dbConn = new MysqlDB('hostName', 'username', 'password', 'database')
      }
      function simple($id) {
    
         $row = $dbConn->query($id);
         $thing = $row->partoftable;
         echo $thing;
     }
    }
    

    您也可以在公共类中创建数据库连接并使用您的类扩展它

    【讨论】:

    • 每次实例化一个类时,您都在创建一个新实例。这与 OP 试图做的相反。
    【解决方案3】:

    我喜欢这个解决方案:

    class db_connection
    {
        public static $sql_object = NULL;
    
        public function __construct()
        {
            if ($sql_object === NULL)
            {
                // Initialize self::$sql_object
            }
        }
    }
    

    然后你可以使用它:

    $db = new db_connection();
    // Do something with $db->sql_object
    

    由于$sql_object是静态的,所以无论你使用多少次new db_connection(),它只会被初始化一次。

    【讨论】:

    • 拥有全局 db_connection 并不是真正的 OOP。
    • $db_connection 不是全局的。我想你可以认为$sql_object 是全局的,因为它是静态的,但我不认为使用静态成员违反 OOP。
    【解决方案4】:
    class basic {
    
    var $CONNECTION;
    
    function __construct($dbh) {
        $this->CONNECTION = $dbh;
      }
    
    function simple($id) {
    $conn = $this->CONNECTION;
    $query = $conn->prepare("SELECT * FROM table WHERE id = $id");
    $query->execute();
    $row = $query->fetch(PDO::FETCH_OBJ);
    $thing = $row->partoftable;
    echo $thing;
     }
    }
    
    //class ends you can use thae class like this
    
    $hostname = 'hostname';
    $username = 'db';
    $password = 'password';
    
    try {
    $dbh = new PDO("mysql:host=$hostname;dbname=db", $username, $password);
    }
     catch(PDOException $e)
        {
        echo $e->getMessage();
     }
    
    $first = new basic($dbh);
    $first->simple(12);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-24
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多