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;”在我滚动鼠标时被隐藏了。