2008-08-05 29 views
24

我收到以下錯誤:的MySQL/Apache的錯誤

Access denied for user 'apache'@'localhost' (using password: NO)

使用下面的代碼:

<?php 

include("../includes/connect.php"); 

$query = "SELECT * from story"; 

$result = mysql_query($query) or die(mysql_error()); 

echo "<h1>Delete Story</h1>"; 

if (mysql_num_rows($result) > 0) { 
    while($row = mysql_fetch_row($result)){ 
      echo '<b>'.$row[1].'</b><span align="right"><a href="../process/delete_story.php?id='.$row[0].'">Delete</a></span>'; 
     echo '<br /><i>'.$row[2].'</i>'; 
    } 
} 
else { 
    echo "No stories available."; 
} 
?> 

connect.php文件包含了我的MySQL連接是工作正常通話在我的INSERT查詢軟件的另一部分。如果我註釋掉$result = mysql_query行,那麼它會轉到else語句。所以,它就是那條線或者if的內容。

我一直在尋找網絡上的任何解決方案,而且大多數似乎與太多的MySQL連接有關,或者我登錄MySQL的用戶沒有權限。我已經檢查了兩個。我仍然可以在軟件的其他地方執行我的其他查詢,並且我已驗證該帳戶具有正確的權限。

回答

12

And if it matters at all, [email protected] is not the name of the user account that I use to get into the database. I don't have any user accounts with the name apache in them at all for that matter.

如果說'apache @ localhost',則用戶名不能正確傳遞給MySQL連接。 'apache'通常是運行httpd進程的用戶(至少在基於Redhat的系統上),並且如果在連接期間沒有傳遞用戶名,MySQL會使用任何呼叫該連接的用戶。

如果您在腳本中執行正確的連接,而不是在被調用的文件中,您是否得到相同的錯誤?

2

只是檢查,如果你使用只是這部分你會得到一個錯誤?

<?php 
include("../includes/connect.php"); 

$query = "SELECT * from story"; 
$result = mysql_query($query) or die(mysql_error()); 

如果是的話,你還,如果你複製得到一個錯誤並粘貼這些插入的一進這個頁面,我想看看它是否是本地的網頁或實際的路線。

另外,您是否可以發佈連接調用(減去密碼)的副本,除非插入的語法與此示例完全相同。

2

apache用戶是否需要密碼才能連接到數據庫?如果是這樣,那麼它說「使用密碼:否」的事實會導致我相信代碼嘗試連接時沒有密碼。

但是,如果apache用戶不需要密碼,那麼仔細檢查權限可能是一個好主意(您提到您已經選中)。在mysql提示符處嘗試執行如下操作可能仍然有好處:

GRANT ALL PRIVILEGES ON `*databasename*`.* to 'apache'@'localhost'; 

該語法應該是正確的。

除此之外,我就像你一樣難住。

+0

我不認爲這是一個很好的解決方案。這就像是說,如果你在方向盤掉落的地方建造了一輛汽車,而人們撞上樹木,解決辦法就是去除樹木。這是連接無法正確初始化的問題。 – nickf 2008-09-15 23:32:49

1

如果確實可以使用相同的連接調用插入,則問題很可能在於用戶「apache」對數據庫沒有SELECT權限。如果您安裝了phpMyAdmin,您可以在「權限」窗格中查看用戶的權限。 phpMyAdmin也使修改權限變得非常簡單。

如果您只能訪問命令行,則可以從mysql數據庫檢查權限。

你可能需要做一些事情,如:

GRANT SELECT ON myDatabase.myTable TO '阿帕奇' @ 'localhost' 的;

1

Just to check, if you use just this part you get an error?

If so, do you still get an error if you copy and paste one of those Inserts into this >page, I am trying to see if it's local to the page or that actual line.

Also, can you post a copy of the connection calls (minus passwords), unless the inserts >use exactly the same syntax as this example.

以下是connection.php文件中的內容。我通過一個包含文件的鏈接,就像我在代碼中執行INSERT查詢的地方一樣。

$conn = mysql_connect("localhost", ******, ******) or die("Could not connect"); 
mysql_select_db("adbay_com_-_cms") or die("Could not select database"); 

我會嘗試在這個領域工作INSERT查詢來檢查。

至於其他人張貼密碼訪問。正如我在第一篇文章中所述,我確實檢查了權限。我使用phpMyAdmin來驗證我使用的用戶帳戶的權限是否正確。如果它很重要,apache @ localhost不是我用來訪問數據庫的用戶帳戶的名稱。對於這個問題,我沒有任何名稱爲apache的用戶帳戶。

2

不要忘記檢查您的數據庫錯誤日誌。你應該能夠看到你是否擊中了數據庫。如果你不是,你應該檢查你的防火牆規則。在Linux機器上,您可以運行iptables -L來獲取防火牆列表規則。

否則,它將是一個純粹的訪問問題。做一個「從mysql.user中選擇*」來查看apache用戶是否被安裝在那裏。此外,我會建議創建一個專門爲您的應用程序的帳戶,而不是使用Apache,因爲您創建的任何其他應用程序默認情況下將運行爲Apache,並可能未經授權訪問您的數據庫。

只需在文檔@ dev.mysql.com中查找「GRANT」即可獲取更多信息。如果你有關於db的更具體的questiosn,只需編輯你的問題,我會看看。

2

connect.php腳本實際上是建立連接還是隻是定義一個你需要調用來創建連接的函數?你得到的錯誤是沒有先前建立的連接的症狀。

ETA:同時將include改爲require。我懷疑它實際上並不包括文件。但包括可以默默地失敗。

4

將include()更改爲require()。 如果「connect.php」文件不能爲require()d,那麼腳本將失敗,並帶有致命錯誤,而包含()僅會生成警告。如果傳遞給mysql_connect()的用戶名不是「apache」,則連接腳本的錯誤路徑是獲取此類錯誤的最常見方法。

2

夥計的答案是一個大DUH!不幸的是,我花了一段時間才弄清楚。您可能有一個像dbconnect()這樣的函數,並且您正在使用包含文件中的變量來建立連接。 $ conn = mysql_connect($ dbhost,$ dbuser,$ dbpass)。

那麼,因爲這是在一個函數中,來自include文件的變量需要傳遞給函數,否則函數將不知道$ dbhost,$ dbuser和$ dbpass是什麼。解決這個問題的一種方法是使這些變量成爲全局變量,這樣你的函數就可以把它們接收起另一個不太安全的解決方案是寫出你的主機,用戶並傳入mysql_connect函數。

希望這可以幫助,但我有同樣的問題。

+0

謝謝! 我終於搞清楚了,後來覺得自己像個白癡。衛生署!有時候,我想我有我的時刻。 再次感謝! – Mesidin 2009-03-17 21:26:12

1

您可以執行下列操作之一:

  • 添加用戶「阿帕奇」和設置其權限從phpMyAdmin的或用mysql的shell
  • 告訴PHP運行mysql_connect作爲另一個用戶,別人誰已經擁有所需的權限(但可能不是root),請在php.ini文件中查找mysql.default_user。
1

你記得的事:

flush privileges; 

如果沒有設置用戶了,然後它會給「阿帕奇」 @「localhost」的錯誤。

+0

或許你的回答最好作爲評論給出。 – boisvert 2013-09-19 11:03:58