2008-08-05 2 views
24

: 다음 코드를 사용하는 경우의 MySQL/아파치 오류가 나는 다음과 같은 오류가 점점 오전

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 프로세스 (적어도 레드햇 기반 시스템에서)를 실행하는 사용자이며, 연결 중에 사용자 이름이 전달되지 않으면 MySQL은 연결을 요청하는 사람을 사용합니다.

호출 된 파일이 아닌 스크립트에서 연결을 올바르게 수행하면 동일한 오류가 발생합니까?

2

그냥을 사용하면이 실수가 있습니까?

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

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

그렇다면, 당신은 여전히 ​​당신이 복사하면 오류가 발생하고이 페이지에 그 삽입 중 하나를 붙여 않는다, 나는 페이지 또는 실제 라인 지방의 있는지 확인하기 위해 노력하고 있습니다.

또한 삽입이이 예제와 완전히 동일한 구문을 사용하지 않는 한 연결 호출 사본 (암호 빼기)을 게시 할 수 있습니까?

2

아파치 사용자가 데이터베이스에 연결하려면 암호가 필요합니까? 그렇다면 "password : NO"를 사용한다는 사실로 인해 코드가 암호없이 연결하려고한다고 생각하게됩니다.

그러나 apache 사용자가 암호가 필요하지 않은 경우 사용 권한을 다시 한 번 확인하는 것이 좋습니다. mysql 프롬프트에서 다음과 같이 실행하는 것이 여전히 도움이 될 수 있습니다.

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

구문이 정확해야합니다.

그 외에도, 나는 당신처럼 당황 스럽습니다.

+0

정말 좋은 솔루션이라고 생각하지 않습니다. 스티어링 휠이 떨어지고 사람들이 나무에 부서지는 자동차를 만든다면 해결책은 나무를 제거하는 것입니다. 이 문제는 연결 초기화가 올바르게 초기화되지 않는 문제입니다. – nickf

1

실제로 동일한 연결 호출을 사용하여 삽입 할 수있는 경우 문제는 데이터베이스에 대한 SELECT 권한이없는 "apache"사용자에 있습니다. phpMyAdmin을 설치했다면 권한 창에서 해당 사용자의 권한을 볼 수 있습니다. phpMyAdmin을 사용하면 권한을 쉽게 수정할 수 있습니다.

명령 줄에만 액세스 할 수있는 경우 mysql 데이터베이스에서 사용 권한을 확인할 수 있습니다.

당신은 아마 같은 것을 수행해야합니다

:

GRANT SELECT가 ON myDatabase.myTable는 '아파치'@ '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 쿼리를 실행하는 것과 같은 방식으로 include를 통해 파일에 연결했습니다.

$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는 데이터베이스에 들어가기 위해 사용하는 사용자 계정의 이름이 아닙니다. 그 문제에 관해서는 아파치라는 이름의 사용자 계정이 전혀 없습니다.

2

데이터베이스 오류 로그를 반드시 확인하십시오. 당신은 심지어 DB를 치는 경우 볼 수 있어야합니다. 그렇지 않은 경우 상자의 방화벽 규칙을 확인해야합니다. 리눅스 박스에서는 iptables -L을 실행하여 방화벽 목록 규칙을 얻을 수 있습니다.

그렇지 않으면 순수한 액세스 문제가됩니다. "select * from mysql.user"를 실행하여 아파치 사용자가 설정되어 있는지 확인하십시오. 또한, 귀하가 만든 다른 응용 프로그램이 기본적으로 아파치로 실행되고 DB에 무단으로 액세스 할 수 있기 때문에 아파치를 사용하는 것과는 대조적으로 응용 프로그램 용 계정을 만드는 것이 좋습니다.

자세한 정보를 얻으려면 @ dev.mysql.com 설명서에서 "GRANT"를 찾아보십시오. DB에 관한보다 구체적인 질문이 있다면 질문을 수정하면됩니다.

2

connect.php 스크립트가 실제로 연결을 설정합니까 아니면 연결을 만들기 위해 호출해야하는 함수를 정의합니까? 당신이 얻는 오류는 이전에 확립 된 연결이 전혀 없다는 것에 대한 증상입니다.

ETA : 또한 include를 require로 변경하십시오. 나는 그것이 파일을 실제로 포함하고 있지 않다고 의심한다. 그러나 include는 자동으로 실패 할 수 있습니다.

4

include()를 require()로 변경하십시오. "connect.php"파일이 require() d 일 수없는 경우은 치명적인 오류로 스크립트를 실패하지만 include()는 경고 만 생성합니다. mysql_connect()에 전달하는 사용자 이름이 "apache"가 아닌 경우 연결 스크립트에 대한 잘못된 경로가 이러한 유형의 오류를 가져 오는 가장 일반적인 방법입니다.

2

답답함이 큰 DUH입니다! 불행하게도 그것은 잘 이해하기 위해 나에게 어느 정도 걸렸다. 아마도 dbconnect()와 같은 함수를 가지고 있으며, 인클루드 파일의 변수를 사용하여 연결을하고있을 것이다. $ conn = mysql_connect ($ dbhost, $ dbuser, $ dbpass).

이것은 함수 안에 있기 때문에 포함 파일의 변수를 함수에 전달해야합니다. 그렇지 않으면 함수는 $ dbhost, $ dbuser 및 $ dbpass가 무엇인지 알 수 없습니다. 이 문제를 해결하는 방법은 전역 변수를 전역 함수로 만들 수 있도록하는 것입니다. 매우 안전하지 않은 또 다른 솔루션은 호스트, 사용자를 작성하고 mysql_connect 함수를 전달하는 것입니다.

희망이 도움이되지만 같은 문제가있었습니다.

+0

고마워요! 나는 마침내 물건을 알아 냈고, 나중에 거대한 바보처럼 느꼈다. 도! 가끔, 나는 내가 생각하는 나의 순간을 가지고있다. 다시 한번 감사드립니다. – Mesidin

1

당신은 다음 중 하나를 수행 할 수 있습니다

  • 쉘에 phpMyAdmin을하거나 MySQL을 사용로부터 권한을
  • 다른 사용자로 mysql_connect를 실행하는 PHP에게 사용자 "아파치"및 설정을 추가, 사람을 사람 이미 root 권한이 아니라면 필요한 권한을 가지고 있습니다. php.ini 파일에서 mysql.default_user를 찾으십시오.
1

는 당신이 기억나요 : 사용자가 다음 설정되어 있지 않습니다

flush privileges; 

경우는 '아파치'을 줄 것이다 @ 오류 '로컬 호스트'.

+0

아마도 답은 의견으로는 더 낫습니다. – boisvert

관련 문제