2014-01-10 83 views
5

我想用PDO連接到外部數據庫。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'); 

這工作馬上。

所以我的問題是,爲什麼添加端口時,這會導致它無法連接到數據庫。只有這個特定的服務器存在這個問題。

很多感謝您的時間。

更新

給出的錯誤簡直是 「無法連接到MySQL服務器上xxx.xxx.xxx.xxx」。

我現在已經稍微進一步了。代碼現在正在工作提供我有一個防火牆規則,允許傳入3306到服務器使用3306.所以,即使我已指定一個端口,它似乎忽略這一點,並迫使它走出3306.

+0

是否有可能*客戶端*機器阻止端口3309上有*出站*防火牆規則? –

+1

它做什麼而不是工作(它產生了什麼錯誤)?連接用戶是否有權從連接主機遠程連接? MySQL正在偵聽TCP連接(my.cnf中未啓用'skip-networking') –

+0

@MichaelBerkowski我更新了我的問題。另外'skip-networking'被禁用。連接用戶具有我已經證明的權限,在其他服務器上成功使用相同的代碼以及檢查mysql表並確保允許的主機是通配符'%'。它似乎好像我有麻煩的服務器只是完全忽略端口,只使用3306.它是一個與cpanel託管的服務器。 –

回答

0

問題最終歸結於主機。無論代碼中指定的端口是什麼,所有流量都在3306上被強制輸出。

5

您可能使用localhost作爲主機名。切換到127.0.0.1應該解決端口無知問題。

+1

這解決了我的問題(通過ssh進行代理連接)。有關爲什麼本地主機忽略端口而127.0.0.1表現「正常」的任何見解? – seanoc5

+0

@sea MySQL最終使用unix套接字而不是TCP。在命令行上,我看到了同樣的問題。你可以通過強制TCP協議來解決它:--protocol = TCP –

+0

這個答案描述了PDO發生了什麼(使用「localhost」意味着隱式地使用套接字)http://stackoverflow.com/questions/1819592/錯誤時,連接到用mysql-的PHP-PDO –