PHP OOP-连接到不同主机

PHP OOP-连接到不同主机,php,oop,Php,Oop,我无法连接到不同的主机 请查找下面的连接类 class Connection { protected static $connectDb; protected $dbHost; protected $dbUser; protected $dbPass; protected $dbName; protected $charSet; public function __construct ($dbHost, $dbUser, $dbPass,

我无法连接到不同的主机

请查找下面的连接类

class Connection
{
    protected static $connectDb;
    protected $dbHost;
    protected $dbUser;
    protected $dbPass;
    protected $dbName;
    protected $charSet;

    public function __construct ($dbHost, $dbUser, $dbPass, $dbName, $charSet){
        $this->dbHost = $dbHost;
        $this->dbUser = $dbUser;
        $this->dbPass = $dbPass;
        $this->dbName = $dbName;
        $this->charSet = $charSet;
    }

    /**
    * Connect to the database
    *
    * @return bool false on failure / mysqli MySQLi object instance on success
    */
    public function connect()
    {

        if (!isset(self::$connectDb)) {
                self::$connectDb = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);
        }

        if (self::$connectDb->connect_errno) {
          printf("Connection failed: %s\n", self::$connectDb->connect_error);
          exit();
        }

        if ($this->charSet) {
            if (!self::$connectDb->set_charset($this->charSet)) {
                printf("Error loading character set ".$this->charSet.": %s\n", self::$connectDb->error);
                exit();
            } else {
                // printf("Current character set: %s\n", self::$connectDb->character_set_name());
            } 
        }

        return self::$connectDb;
    }

    /**
    * Query the database
    *
    * @param $query The query string
    * @return mixed The result of the mysqli::query() function
    */
    public function query($query)
    {
        $conn = $this->connect();

        $result = $conn->query($query);

        return $result;
    }
}
我创建的连接如下所示:-

$conn1 = new Connection('localhost', '[user1]', '[password1]', '[db_name1]', 'utf8');

$conn2 = new Connection('xxx.xxx.xx.xx', '[user2]', '[password2]', '[db_name2]', 'utf8');
但当我在$conn2上运行query时,它仍然连接并在$conn1上运行

示例查询:-

$result = $conn1->query([select_query_from_db_name1]);

foreach($result as $value) {
    $conn2->query([insert_into_db_name2]);
}
希望任何人都能指出问题所在,因为我还在学习oop


提前感谢。

如注释中所述,在这种情况下,关键字意味着变量对于类的所有实例都将保持不变,因此删除它将允许两个不同的
连接
实例具有两个不同的连接

然而,对于静态来说,这是一个非常不直观的用例,因为静态属性更像类常量。例如,您可以将计算器类的税率定义为静态私有财产,并将其与
self::tax_rate
一起使用,而不考虑财产的“成本”


但是,如果可以的话,我相信您可以通过删除这个连接类来进一步改进代码。它实际上没有什么比基本的
\mysqli
对象更好的了,实际上维护起来会很麻烦

这里实现的
query()
功能非常糟糕:它阻止了的使用,使您对sql注入敞开了大门


执行的手动错误检查也没有用,在应用程序级别设置错误报告将允许连接告诉您是否无法连接,这比重写所有内容要好得多。

您应该直接在构造函数中使用此选项

self::$connectDb = new mysqli($this->dbHost, $this->dbUser,
 $this->dbPass, $this->dbName);
您也可以将其用于构造函数

if (!isset(self::$connectDb)) {             
   self::$connectDb = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);
        }
但在本例中,应在

$conn1 = new Connection('localhost', '[user1]', '[password1]', '[db_name1]', 'utf8', $newConn);
现在,您的构造函数签名应该是

public function __construct ($dbHost, $dbUser, $dbPass, $dbName, $charSet, $newCon = false){
        $this->dbHost = $dbHost;
        $this->dbUser = $dbUser;
        $this->dbPass = $dbPass;
        $this->dbName = $dbName;
        $this->charSet = $charSet;

 if (!isset(self::$connectDb) || $newConn) {
                 self::$connectDb = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);
         }


    }

self::$connectDb
是静态的,并且已经设置。您使用的静态属性与类的所有实例相同。两个连接都将具有完全相同的$connectDb,因此它们将始终使用相同的connectionHi。谢谢你们两位。现在,在删除静态属性后,我设法连接到另一台主机。再次感谢你。他们为什么要这样做?那怎么更好(不是)。另外,你还忽略了真正的问题:静态关键字…@FélixGagnon Grenier,谢谢你的注意,事实上,当我阅读任务时,“受保护的静态$connectDb;”在我滚动鼠标时被隐藏了。