2008-08-05 3 views
24

Я получаю следующее сообщение об ошибке:MySQL/Apache Ошибка в запросе PHP 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 (по крайней мере, на системах Redhat), и если ни одно имя не передается во время соединения, MySQL использует кого-то, кто вызывает соединение.

Если вы используете соединение прямо в своем скрипте, а не в вызываемом файле, вы получаете ту же ошибку?

2

Просто, чтобы проверить, используете ли вы только этой части вы получаете сообщение об ошибке?

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

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

Если да, то вы все равно получите ошибку, если скопировать и вставить одну из этих вставок в эту страницу, я пытаюсь увидеть, если это локальная на странице или той фактической линии.

Также вы можете отправить копию вызовов соединения (минус пароли), если только вставки не используют точно такой же синтаксис, как в этом примере.

2

Требуется ли пользователю apache пароль для подключения к базе данных? Если это так, то тот факт, что он говорит «using password: NO», заставит меня поверить, что код пытается подключиться без пароля.

Если, однако, пользователь 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 'Апач' @ 'локальный';

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. Я связан с файлом с помощью include так же, как и где я выполняю запросы 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, чтобы получить правила списка брандмауэров.

В противном случае это будет проблема с чистым доступом. Сделайте «select * from mysql.user», чтобы узнать, настроен ли пользователь apache. Кроме того, я бы рекомендовал создать учетную запись специально для вашего приложения, а не использовать apache, поскольку любое другое приложение, которое вы создаете, будет запускаться как apache по умолчанию и может получить неавторизованный доступ к вашему db.

Просто посмотрите «GRANT» в документации @ dev.mysql.com, чтобы получить дополнительную информацию. Если у вас есть более конкретные задачи относительно db, просто отредактируйте свой вопрос, и я посмотрю.

2

Действительно ли сценарий connect.php делает соединение или он просто определяет функцию, которую необходимо вызвать для создания соединения? Ошибка, которую вы получаете, является симптомом отсутствия ранее установленного соединения.

ETA: Также измените требование к требованию. Я подозреваю, что это вообще не файл. Но включение может терпеть неудачу молча.

4

Измените include() на require(). Если файл «connect.php» не может потребоваться() d, сценарий завершится с ошибкой с фатальной ошибкой, тогда как include() генерирует предупреждение. Если имя пользователя, которое вы передаете в mysql_connect(), не является «apache», неправильный путь к скрипту подключения является наиболее распространенным способом получения этого типа ошибки.

2

Чувак, ответ большой DUH! к сожалению, мне понадобилось время, чтобы понять. Вероятно, у вас есть функция типа dbconnect(), и вы используете переменные из файла include для соединения. $ conn = mysql_connect ($ dbhost, $ dbuser, $ dbpass).

Ну, так как это внутри функции, переменные из файла include должны быть переданы функции, иначе функция не будет знать, что такое $ dbhost, $ dbuser и $ dbpass. Способ исправить это - сделать эти переменные глобальными, чтобы ваши функции могли их подбирать. Еще одно решение, которое не очень безопасно, - это выписать хост, пользователя и передать функцию mysql_connect.

Надеюсь, это поможет, но у меня была та же проблема.

+0

Спасибо! Я наконец-то сообразил, и позже почувствовал себя огромным идиотом. Doh! Иногда у меня есть свои моменты, я думаю. Еще раз спасибо! – Mesidin 2009-03-17 21:26:12

1

Вы можете сделать одно из следующих действий:

  • Добавьте пользователя «Апач» и настройка его привилегии от PHPMyAdmin или с использованием MySQL на оболочке
  • Назови PHP для запуска mysql_connect как другой пользователь, кто уже имеет необходимые привилегии (но, возможно, не root), найдите mysql.default_user в файле php.ini.
1

Вы не забыли сделать:

flush privileges; 

Если пользователь не установлен, то это даст «Апач» @ «локальный» ошибка.

+0

Наверное, ваш ответ лучше дать в качестве комментария. – boisvert 2013-09-19 11:03:58

Смежные вопросы