2010-02-07 122 views
3

我想我的PHP代碼與下面的代碼安全地連接到MySQL:PHP MySQL連接失敗

<html> 
    <?php 
     $con = mysql_connect("localhost:3306","root","password"); 
     if(!$con) 
     { 
      die('Could not connect: ' . mysql_error()); 
     } 
     else 
     { 
      echo "Connection established!"; 
     } 
     mysql_close($con); 
    ?> 
</html> 

但我不斷收到以下錯誤信息:

警告:mysql_connect()函數[function.mysql-connect]:無法連接到第5行的C:\ xampp \ htdocs \ database_connect.php中的'localhost'(10061)上的MySQL服務器 無法連接:無法連接到' localhost'(10061)

下面是我的故障排除步驟:

  • 檢查是否mysqld的在Windows任務管理器進程運行 - 它是否MySQL的是通過在Windows命令提示符下鍵入主機上運行
  • 經過:「遠程登錄192.0.0.1 3306「,並收到消息」無法打開與主機的連接,端口3306:連接失敗「
  • 檢查Windows防火牆是否阻止MySQL - MySQL是例外。

如何讓此代碼安全地工作?我如何查看關於我的MySQL的基本有用信息,如用戶名?

+1

我建議你移動到mysqli,如果可以的話。它是mysql擴展的更新和更好的版本。 – waiwai933 2010-02-08 03:38:57

+0

感謝您的回覆waiwai!由於我是PHP,PDO和mysqli的新手,我對你的建議(mysqli)做了一些研究,發現連接到MySQL有三個主要的API選項:PHP的MySQL擴展,PHP的mysqli和PHP數據對象(PDO - 目前現在學習)。 PHP的MySQL擴展只能用於4.1.3以前的MySQL版本。 (我想這就是我使用的),強烈建議使用mysqli(與MySQL擴展相比,它有很多優點),PDO允許您在對PHP代碼進行微小更改的情況下切換數據庫類型。這一切都有道理! – Anthony 2010-02-08 19:28:05

回答

5

您可以使用tcpview檢查MySQL服務器是否綁定到端口3306。更簡單地說,從主機說明符中刪除端口。然後驅動程序應該嘗試使用命名管道,而不是TCP套接字。

在一個不相關的說明中,我強烈建議您切換到PDO MySQL驅動程序。你正在使用的是非常過時的。 PDO的一大優勢是支持prepared statements,可提供安全性和效率優勢。

編輯:

這不回答你的主要問題,但在評論發佈此信息將是一個爛攤子。

比W3Schools的相反,檢查出建議的資源:

+0

感謝您的回覆和推薦tcpview(Netstat是我的 列表中的東西學習)。我跑了它,並沒有看到當地的 地址3306。也感謝您推薦PDO - 我是新手,並且遵循w3schools示例。我會做一些研究。 現在我該如何使MySQL通過3306網絡連接到代碼? – Anthony 2010-02-08 00:58:26

+0

絕對正確的PDO;令我驚訝的是,我看到有多少人仍然開始使用mysql_ *命令。那裏有很多可怕的,過時的教程! PDO要好得多,而且從一開始就不難。 – JAL 2010-02-08 01:36:07

+0

@ 01010011:不要打擾有MySQL支持TCP;它不太安全,不應該在開發服務器上完成。使用'localhost'作爲主機名並完成它。至於設置的位置,請參閱我對Mr-sk的回答的第一條評論。 – outis 2010-02-08 01:36:07

1

也許你沒有在MySQL安裝上設置遠程連接。您正嘗試通過端口進行連接,這與遠程連接相同。它已經有一段時間,因爲我已經做了MySQL,但是這是一個大破綻:

檢查是否MySQL的是通過在Windows命令輸入 提示在主機上運行 :「遠程登錄192.0.0.1 3306」和 得到的消息「無法打開 連接到主機,端口3306: 連接失敗」

它行不通。你確定它配置爲3306端口而不是另一個端口嗎?仔細檢查一下。

代碼本身看起來不錯,而不是問題。港口顯然是問題。

+0

感謝您的回覆Mr-sk。如何檢查安裝後是否爲端口3306配置了MySQL?我用什麼命令來獲取這些信息?我安裝MySQL時可能已禁用它。 – Anthony 2010-02-08 00:03:10

+0

使用IP 127.0.0.1怎麼樣? – 2010-02-08 00:05:29

+0

感謝您的回覆喬爾。你什麼意思?如何檢查服務器名稱和用戶名以確保我輸入了正確的名稱? usernamemysql_connect(服務器,用戶名,密碼); – Anthony 2010-02-08 00:27:07

1

注:這是解決不了問題的任擇議定書的問題,但我會繼續我的回答對歷史的原因,也因爲它可能是一些其他人的問題。

你在Windows Vista/7上運行PHP 5.3.1嗎?

PHP中的MySQL庫最近發生的一個變化(現在使用mysqlnd)在連接到localhost時導致問題。一個錯誤已被填補,但在此之前,請確保您的hosts文件包含localhost的條目。

hosts文件localhost條目必須像這樣:

127.0.0.1 localhost 
#::1  localhost 

正如你所看到的,IPv6條目被註釋掉和IPv4項不是。

hosts文件位於:

%WINDIR%\System32\drivers\etc\hosts 

Source

+0

感謝您的回覆Andrew和非常有用的源代碼鏈接。 即時通訊使用XP和XAMPP。 XAMPP閱讀我的文檔,其中包括:「PHP 5.3.0」,「Apache 2.2.12(啓用IPV6)」 我檢查了主機文件,「127.0.0.1本地主機」是唯一的入口。您提供的鏈接指出應刪除「#:: 1本地主機」這一行,但我沒有該行。我也沒有在這個文件中看到有關IPv4或IPv6的任何信息。那麼我現在該做什麼? – Anthony 2010-02-08 01:19:25

+0

@ 01010011:在這種情況下,這不是你的問題。檢查上面的答案以確保MySQL正在3306上進行偵聽。 – 2010-02-08 03:34:15

+0

Marc B提供了一個很好的方法來找出這個問題。我可以更改MySQL命令行中的端口和skip_networking值嗎? – Anthony 2010-02-08 18:14:57

1

無法恢復密碼,但您可以創建一個新的。關閉MySQL服務並執行:

cd c:\mypathtomysql\bin 
mysqladmin -u root password NEWPASSWORD 
+0

是的,謝謝你。我仍然不知道爲什麼我的密碼在登錄到MySQL命令行客戶端的一天無法工作,這非常令人沮喪!突然它在第二天開始工作,這是第二次發生這種情況。所以我改變了根希望,這就停止了這個問題 – Anthony 2010-02-08 01:30:23

+0

我的密碼再次停止工作。但是,我啓動了服務器實例配置嚮導並對其進行了更改,並且工作正常,我又回來了。 – Anthony 2010-02-09 15:47:45

1

如果你可以訪問MySQL外殼中,你可以檢查服務器的網絡配置是這樣的:

mysql> show variable like 'port'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| port   | 3306 | 
+---------------+-------+ 
mysql> show variables like 'skip_networking'; 
+-----------------+-------+ 
| Variable_name | Value | 
+-----------------+-------+ 
| skip_networking | OFF | 
+-----------------+-------+ 
1 row in set (0.00 sec) 

如果「skip_networking」設置爲「ON」 ,那麼你的MySQL服務器已經被配置爲不允許通過網絡訪問,並且只能通過本地套接字運行。否則,它將監聽'port'配置變量中指定的端口。

+0

不錯,馬克,謝謝您的回覆!我的端口值是0,我的skip_networking值是'ON'。如何從MySQL命令行更改這些值? – Anthony 2010-02-08 17:26:26

+0

我不知道他們是否可以從MySQL內更改。我的理解是,如果mysql啓動skip_networking = on,它不會加載網絡代碼,並且不能強制在之後加載它。 您很可能必須修改服務器的my.ini(或my.cnf,或者您在特定安裝中調用的任何內容)。在[mysqld]部分設置skip-networking,在[client]和[mysqld]部分都設置端口號。 – 2010-02-08 22:50:35

+0

我第三次遇到密碼問題,這次我啓動了服務器實例配置嚮導,並將其更改並運行。無論如何,在進行配置步驟時,我注意到網絡默認開啓,但端口3306的防火牆例外未被檢查。所以我檢查了它,當配置完成後,我嘗試了下面的命令:show variables like'port';並顯示像'skip_networking'這樣的變量;這次結果是3306和關閉。 – Anthony 2010-02-09 15:52:04

1

好吧,大家好,這是我第一次嘗試用Outis建議的使用PDO連接MySQL和PHP。有效。

<?php 
$user = root; 
$pass = password; 
try 
{ 
    $dbh = new PDO('mysql:host = localhost; dbname=databaseName', $user,$pass); 
    if($dbh) 
    { 
     print "Connected successfully"; 
    } 
} 
catch (PDOException $e) 
{ 
    print "Error: " . $e->getMessage(). "<br/>"; 
    die(); 
} 
?> 

這裏是我的第二次嘗試 - 這一次我試圖做一個查詢

<?php 
$user = root; 
$pass = password; 
try 
{ 
    $dbh = new PDO('mysql:host = localhost; dbname=databaseName', $user,$pass); 
    foreach($dbh->query('SELECT * FROM tableName') as $row) 
{ 
    print_r($row); 
} 
$dbh = null; 
} 
catch (PDOException $e) 
{ 
    print "Error: " . $e->getMessage(). "<br/>"; 
    die(); 
} 
?> 

運行此代碼後,我得到如下結果:

陣列([exo_flowers_ID ] => 1 [0] => 1 [名稱] => Dendroseris Neriifolia [1] => Dendroseris Neriifolia [國家] =>智利[2] =>智利[env_workers_id] => 1 [3] => 1) ([exo_flowers_ID] => 2 [0] => 2 [name] => Snowdonia Hawkweed [1] => Snowdonia Hawkweed [country] =>北威爾士[2] =>北威爾士[env_workers_id] => 1 [3] => 1)

所有我想要的是,顯示的行或列的內容,而是我把所有的內容加上所有這些括號。如何僅顯示錶格行或列的內容?最後,我該如何查詢如下:SELECT * FROM tableName WHERE'columnName1'='somename'AND'columnName2'='someothername'; ?

+0

我解決了上述問題。感謝所有幫助的人 – Anthony 2010-02-13 11:46:01

0

我解決了同樣的問題「無法連接到'localhost'上的MySQL服務器」(Windows 7,XAMPP v.3.2.1安裝,php連接到MySQL不起作用):

  1. 打開XAMPP控制面板(我的版本是v.3.2.1)。按面板右側的「Shell」按鈕。

  2. 窗口用一個標題打開: 「管理員:XAMP的Windows - MySQL的-u根」,並與以下文本:

Setting environment for using XAMPP for Windows 
[email protected] c:\xampp 
  • 輸入:#mysql
  • 獲得答案:Welcome to the MySQL monitor…

    然後輸入:mysql>create database mdb;

    答案:ERROR 1044 (42000): Access denied for user ‘’@’localhost’ to database ‘drawdb’

    輸入:#mysql –u root

    答案:Welcome to the MySQL monitor…

    輸入:mysql>create database mdb;

    答案:Query OK, 1 row affected (0.00 sec)

    輸入:mysql>grant all on mdb.* to [email protected] identified by ‘password’;

    答:Query OK, 0 rows affected (0.06 sec)

    即我允許訪問手動創建的數據庫到指定的用戶。之後,與用戶「用戶」和密碼「密碼」MySQL的PHP​​連接可以成功創建:

    > $servername = "localhost"; 
    > $username = "user"; 
    > $password = "password"; 
    > // Create connection 
    > $conn = new mysqli($servername, $username, $password);