2008-08-05 38 views
24

Tôi nhận được lỗi sau:MySQL/Apache Lỗi trong truy vấn PHP MySQL

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

Khi sử dụng đoạn mã sau:

<?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."; 
} 
?> 

File connect.php chứa của tôi MySQL kết nối cuộc gọi đang làm việc tốt với các truy vấn INSERT của tôi ở một phần khác của phần mềm. Nếu tôi nhận xét ra dòng $result = mysql_query, thì nó sẽ chuyển sang câu lệnh khác. Vì vậy, đó là dòng hoặc nội dung trong if.

Tôi đã tìm kiếm trên mạng bất kỳ giải pháp nào và dường như có liên quan đến quá nhiều kết nối MySQL hoặc người dùng tôi đang đăng nhập vào MySQL không có quyền. Tôi đã kiểm tra cả hai. Tôi vẫn có thể thực hiện các truy vấn khác của mình ở nơi khác trong phần mềm và tôi đã xác minh rằng tài khoản có quyền chính xác.

Trả lời

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.

Nếu người dùng nói 'apache @ localhost' tên người dùng không được chuyển chính xác đến kết nối MySQL. 'apache' thường là người dùng chạy quy trình httpd (ít nhất là trên các hệ thống dựa trên Redhat) và nếu không có tên người dùng nào được truyền trong khi kết nối MySQL sử dụng thì ai đó đang gọi cho kết nối.

Nếu bạn thực hiện kết nối ngay trong tập lệnh, không phải trong tệp được gọi, bạn có gặp lỗi tương tự không?

2

Chỉ cần kiểm tra, nếu bạn sử dụng chỉ phần này bạn gặp lỗi?

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

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

Nếu vậy, bạn vẫn gặp lỗi nếu bạn sao chép và dán một trong các Phụ trang đó vào trang này, tôi đang cố gắng xem địa chỉ đó là trang địa phương hay dòng thực tế đó.

Ngoài ra, bạn có thể đăng bản sao của cuộc gọi kết nối (trừ mật khẩu), trừ khi chèn sử dụng chính xác cú pháp giống như ví dụ này.

2

Người dùng apache có yêu cầu mật khẩu để kết nối với cơ sở dữ liệu không? Nếu vậy, sau đó thực tế là nó nói "sử dụng mật khẩu: NO" sẽ dẫn tôi tin rằng mã đang cố gắng kết nối mà không cần mật khẩu.

Nếu, tuy nhiên, người dùng apache không yêu cầu mật khẩu, việc kiểm tra lại các quyền có thể là một ý tưởng hay (bạn đã đề cập đến bạn đã kiểm tra). Nó vẫn có thể có ích để thử thực hiện một cái gì đó như thế này tại dấu nhắc mysql:

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

Cú pháp đó phải chính xác.

Khác với điều đó, tôi cũng giống như bạn bị mắc kẹt.

+0

Tôi không nghĩ đó thực sự là một giải pháp tốt. Nó giống như nói rằng nếu bạn xây dựng một chiếc xe nơi tay lái rơi xuống và mọi người đang đâm vào cây, giải pháp sẽ là để loại bỏ các cây. Điều này chắc chắn là một vấn đề với kết nối không khởi tạo đúng. – nickf

1

Nếu thực sự bạn có thể chèn bằng cách sử dụng cùng một cuộc gọi kết nối, vấn đề của bạn rất có thể nằm trong người dùng "apache" không có quyền SELECT trên cơ sở dữ liệu. Nếu bạn đã cài đặt phpMyAdmin, bạn có thể xem các quyền cho người dùng trong cửa sổ Privileges. phpMyAdmin cũng làm cho nó rất dễ dàng để sửa đổi các điều khoản.

Nếu bạn chỉ có quyền truy cập vào dòng lệnh, bạn có thể kiểm tra các quyền từ cơ sở dữ liệu mysql.

Có thể bạn sẽ cần phải làm một cái gì đó như:

GRANT SELECT ON myDatabase.myTable ĐẾN 'apache' @ '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.

Đây là những gì có trong tệp connection.php. Tôi liên kết với tập tin thông qua một bao gồm trong cùng một thời trang như là nơi tôi thực hiện các truy vấn INSERT ở nơi khác trong mã.

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

Tôi sẽ thử truy vấn INSERT đang hoạt động trong khu vực này để kiểm tra.

Đối với những người khác đăng thông tin về quyền truy cập mật khẩu. Tôi đã làm, như đã nêu trong bài đăng đầu tiên của tôi, kiểm tra quyền. Tôi đã sử dụng phpMyAdmin để xác minh rằng các quyền cho tài khoản người dùng mà tôi đã sử dụng là chính xác. Và nếu nó quan trọng, apache @ localhost không phải là tên của tài khoản người dùng mà tôi sử dụng để vào cơ sở dữ liệu. Tôi không có bất kỳ tài khoản người dùng với tên apache trong họ ở tất cả cho rằng vấn đề.

2

Đừng quên kiểm tra nhật ký lỗi cơ sở dữ liệu của bạn. Bạn sẽ có thể nhìn thấy nếu bạn thậm chí đánh DB. Nếu không, bạn nên kiểm tra các quy tắc tường lửa của bạn trên hộp. Trên một hộp linux bạn có thể chạy iptables -L để có được các quy tắc danh sách tường lửa.

Nếu không, đó sẽ là vấn đề truy cập thuần túy. Thực hiện "select * from mysql.user" để xem người dùng apache có được thiết lập trong đó hay không. Hơn nữa, tôi khuyên bạn nên tạo một tài khoản cụ thể cho ứng dụng của bạn thay vì sử dụng apache, vì bất kỳ ứng dụng nào khác bạn tạo sẽ chạy như apache theo mặc định và có thể truy cập trái phép vào db của bạn.

Chỉ cần tra cứu "GRANT" trong tài liệu @ dev.mysql.com để biết thêm thông tin. Nếu bạn có yêu cầu cụ thể hơn về db, chỉ cần chỉnh sửa câu hỏi của bạn và tôi sẽ xem xét.

2

Tập lệnh connect.php có thực sự tạo kết nối hoặc thực hiện việc xác định hàm bạn cần gọi để tạo kết nối không? Lỗi bạn nhận được là có triệu chứng không có kết nối được thiết lập trước đó.

ETA: Cũng thay đổi bao gồm thành yêu cầu. Tôi nghi ngờ nó không thực sự bao gồm các tập tin cả. Nhưng bao gồm có thể không âm thầm.

4

Thay đổi bao gồm() thành require(). Nếu không thể yêu cầu tệp "connect.php"() d, tập lệnh sẽ thất bại với lỗi nghiêm trọng, trong khi bao gồm() chỉ tạo cảnh báo. Nếu tên người dùng bạn đang chuyển đến mysql_connect() không phải là "apache", thì đường dẫn không chính xác đến tập lệnh kết nối là cách phổ biến nhất để nhận loại lỗi này.

2

Dude câu trả lời là DUH lớn! không may là tôi mất một thời gian để tìm ra. Bạn có thể có một hàm như dbconnect() và bạn đang sử dụng các biến từ một tệp bao gồm để tạo kết nối. $ conn = mysql_connect ($ dbhost, $ dbuser, $ dbpass).

Vì đây là bên trong một hàm nên các biến từ tệp bao gồm cần được chuyển đến hàm hoặc hàm khác sẽ không biết $ dbhost, $ dbuser và $ dbpass là gì. Một cách để khắc phục điều này là làm cho các biến đó trở nên toàn cầu để các hàm của bạn có thể chọn chúng. Một giải pháp khác mà không phải là rất an toàn sẽ được viết ra bạn lưu trữ, người dùng và vượt qua trong các chức năng mysql_connect.

Hy vọng điều này sẽ giúp nhưng tôi có cùng một vấn đề.

+0

Cảm ơn! Cuối cùng tôi đã tìm ra được thứ gì đó, và cảm thấy như một tên ngốc lớn sau đó. Doh! Đôi khi, tôi có những khoảnh khắc tôi đoán. Cảm ơn bạn lần nữa! – Mesidin

1

Bạn có thể làm một trong các cách sau:

  • Thêm người dùng "apache" và thiết lập các đặc quyền từ phpmyadmin hoặc sử dụng mysql trên vỏ
  • Nói php để chạy mysql_connect như một người dùng khác, một người đã có các đặc quyền cần thiết (nhưng có thể không phải root), hãy tìm mysql.default_user trong tệp php.ini của bạn.
1

Bạn nhớ để làm:

flush privileges; 

Nếu người dùng không được thiết lập sau đó nó sẽ cung cấp cho các 'apache' @ 'localhost' lỗi.

+0

Có lẽ câu trả lời của bạn tốt hơn là nhận xét. – boisvert