【问题标题】:Pass variables to a PHP Class Constructor through a class's function通过类的函数将变量传递给 PHP 类构造函数
【发布时间】:2016-05-23 01:09:39
【问题描述】:

所以我有一个用于连接数据库的帮助类,但现在我希望能够使用同一个类在同一个代码块中连接到不同的数据库。

助手类:

<?php
require_once 'config.php'; // Database setting constants [DB_HOST,  DB_NAME, DB_USERNAME, DB_PASSWORD]

class dbHelper {
    private $db;
    private $err;
    function __construct() {
        $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8';
        try {
            $this->db = new PDO($dsn, DB_USERNAME, DB_PASSWORD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        } catch (PDOException $e) {
            $response["status"] = "error";
            $response["message"] = 'Connection failed: ' . $e->getMessage();
            $response["data"] = null;
            exit;
        }
    }

    function select($table, $where){
        try{
            $a = array();
            $w = "";
            foreach ($where as $key => $value) {
                $w .= " and " .$key. " like :".$key;
                $a[":".$key] = $value;
            }
            $stmt = $this->db->prepare("select * from ".$table." where 1=1 ". $w);
            $stmt->execute($a);
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
            if(count($rows)<=0){
                $response["status"] = "warning";
                $response["message"] = "No data found.";
            }else{
                $response["status"] = "success";
                $response["message"] = "Data selected from database";
            }
                $response["data"] = $rows;
        }catch(PDOException $e){
            $response["status"] = "error";
            $response["message"] = 'Select Failed: ' .$e->getMessage();
            $response["data"] = null;
        }
        return $response;
    }
}

所以你可以通过设置常量然后调用函数来调用上面的代码:

dbconfig.php

<?php
     /**
     * Database configuration
 */
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('DB_NAME', 'database1');

?>

page.php

<?php
require_once 'dbHelper.php';
$db = new dbHelper();

$rows = $db->select("customers_php",array());
print_r(json_encode($rows,JSON_NUMERIC_CHECK));
?>

我想放弃对 config.php 文件的需求,并将 DB_HOST、DB_NAME 等移动到类内部的函数中,并将数据库名称与 $table 和 $where 信息一起传递。

if($db_name == 'database1')
{
    //#----------open database connection --------------------> TESTING
    $db_host = "localhost";
    $db_user = "root";
    $db_password = "";
    $db_name = "database1";
}

if($db_name == 'database2')
{
    //#----------open database connection --------------------> TESTING
    $db_host = "localhost";
    $db_user = "root";
    $db_password = "";
    $db_name = "database2";
}

newpage.php

<?php
require_once 'dbHelper.php';
$db = new dbHelper();

//function select($dbname, $table, $where)......................

$rows = $db->select("database1","customers_php",array());
print_r(json_encode($rows,JSON_NUMERIC_CHECK));
?>

那么,我应该/可以将“if($dbname)”部分放在哪里?

【问题讨论】:

  • 哪些数据库,即 mysql - 其他?数据库是否在同一台服务器上?你想query them against each other吗?我只是好奇,因为您已经接受了您认为有用的答案。
  • 数据库在同一台服务器上,现在无论如何。如果一个变得相当大,我们可能会考虑将它移到它自己的服务器上。
  • 不,此时不需要相互查询。
  • 感谢您的澄清 - 它有帮助。

标签: php function class pdo


【解决方案1】:

您可以将您的if($dbname) 部分放入config.php,然后以这种方式修改您的dbHelperclass:

class dbHelper
{
    public function __construct( $db_host, $db_user, $db_password, $db_name )
    {
        (...)
    }
    (...)
}

并以这种方式调用它:

$db = new dbHelper( $db_host, $db_user, $db_password, $db_name );

编辑:

我认为为每个连接维护一个实例可能会更好,但是 - 如果您想动态更改它 - 您可以将您的类修改为:

class dbHelper 
{
    function __construct( $db_host, $db_user, $db_password, $db_name )
    {
        $this->connect( $db_host, $db_user, $db_password, $db_name );
    }

    function dbSelect( $db_host, $db_user, $db_password, $db_name )
    {
        if( $this->db ) $this->db = Null;
        $dsn = 'mysql:host='.$db_host.';dbname='.$db_name.';charset=utf8';
        try {
            $this->db = new PDO($dsn, $db_user, $db_password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        } catch (PDOException $e) {
            $response["status"] = "error";
            $response["message"] = 'Connection failed: ' . $e->getMessage();
            $response["data"] = null;
            exit;
        }
    }

    (...)

}

然后通过dbHelper-&gt;dbSelect()更改数据库连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2020-03-18
    • 2018-02-13
    • 2013-08-16
    相关资源
    最近更新 更多