我正在尝试使用 PDO 连接到外部数据库。
$dbh = new PDO('mysql:host=hotsname;port=3309;dbname=dbname', 'root', 'root');
但是这在我拥有的一台特定服务器上不起作用。
我以为可能只允许某个主机,但我检查了 mysql 规则,并在我个人拥有的服务器上尝试了此代码,并且连接有效。
所以我知道代码是有效的,并且它们在我这边没有被阻止,并且防火墙正在接受对端口 3309 的请求并将其传递到端口 3306 上的正确服务器。
所以问题仅出现在一台服务器上。作为测试,我想我应该打开端口 3306 来测试代码而不指定端口。
$dbh = new PDO('mysql:host=hotsname;dbname=dbname', 'root', 'root');
这立即奏效了。
所以我的问题是,为什么添加端口时会导致它无法连接到数据库。只有这个特定的服务器有这个问题。
非常感谢您的宝贵时间。
更新
给出的错误只是“无法连接到 xxx.xxx.xxx.xxx 上的 mysql 服务器”。
我现在已经更进一步了。代码现在可以工作,前提是我有一个防火墙规则,允许使用 3306 从 3306 传入服务器。因此,即使我指定了一个端口,它似乎会忽略这一点并强制它走出 3306。
您可能使用
localhost
作为主机名。将其切换为 127.0.0.1
应该可以解决端口忽略问题。
问题最终是由主机造成的。无论代码中指定的端口如何,所有流量都在 3306 上强制退出。
问题不是来自主机服务器,而是来自本地服务器,特别是如果您使用 WAMP 服务器。
在本地环境中配置数据库连接文件,
class Database{
// CHANGE THE DB INFO ACCORDING TO YOUR DATABASE
private $db_host = 'localhost';
private $db_name = 'database_api';
private $db_username = 'root';
private $port = "3308";
private $db_password = '';
public function dbConnection(){
try{
$conn = new PDO('mysql:host='.$this->db_host.'; port=3308; dbname='.$this->db_name,$this->db_username,$this->db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
}
catch(PDOException $e){
echo "Connection error ".$e->getMessage();
exit;
}
}
}
在实时或部署服务器上,就像这样。 @删除端口
类数据库{
// CHANGE THE DB INFO ACCORDING TO YOUR DATABASE
private $db_host = 'localhost';
private $db_name = 'database_api';
private $db_username = 'root';
private $db_password = '';
public function dbConnection(){
try{
$conn = new PDO('mysql:host='.$this->db_host.'; dbname='.$this->db_name,$this->db_username,$this->db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
}
catch(PDOException $e){
echo "Connection error ".$e->getMessage();
exit;
}
}
}
出于某种奇怪的原因,PDO 在内部将“localhost”翻译为使用套接字连接。这就是为什么当您使用 127.0.0.1 时它会起作用,因为在这种情况下,TCP/IP 是通过使用 IP 地址明确声明的。
这就是为什么它忽略端口参数,因为它甚至没有使用 TCP/IP。
当您必须管理许多服务器并且需要在所有服务器上保持相同的连接字符串时,这可能会成为一个问题。