MySQL / Apache Ошибка в PHP MySQL запрос - PullRequest
25 голосов
/ 06 августа 2008

Я получаю следующую ошибку:

Доступ запрещен для пользователя 'apache' @ 'localhost' (с использованием пароля: НЕТ)

При использовании следующего кода:

<?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, не имеет разрешения. Я проверил оба. Я все еще могу выполнять свои другие запросы в другом месте программного обеспечения, и я убедился, что учетная запись имеет правильные разрешения.

Ответы [ 11 ]

11 голосов
/ 06 августа 2008

И если это вообще имеет значение, apache @ localhost - это не имя учетной записи пользователя, которую я использую для входа в базу данных. У меня нет никаких учетных записей с именем apache в них вообще.

Если он говорит «apache @ localhost», имя пользователя неправильно передается в соединение MySQL. 'apache' - обычно пользователь, который запускает процесс httpd (по крайней мере, в системах на основе Redhat), и если имя пользователя не передается во время соединения, MySQL использует тот, кто вызывает соединение.

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

4 голосов
/ 21 октября 2008

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

2 голосов
/ 02 марта 2009

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

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

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

2 голосов
/ 21 октября 2008

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

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

2 голосов
/ 21 октября 2008

Не забудьте проверить журналы ошибок базы данных. Вы должны быть в состоянии увидеть, если вы даже попали в БД. Если вы этого не сделаете, вы должны проверить свои правила брандмауэра на коробке. В окне linux вы можете запустить iptables -L, чтобы получить правила списка брандмауэров.

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

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

1 голос
/ 19 сентября 2013

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

flush privileges;

Если пользователь не настроен, он выдаст ошибку «apache» @ «localhost».

1 голос
/ 22 июня 2009

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

  • Добавьте пользователя «apache» и настройте его привилегии из phpmyadmin или используя mysql на оболочке
  • Скажите php, чтобы он запускал mysql_connect как другой пользователь, тот, у кого уже есть необходимые привилегии (но, возможно, не root), найдите mysql.default_user в вашем файле php.ini.
1 голос
/ 06 августа 2008

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

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

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

Вот что находится в файле 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.

1 голос
/ 06 августа 2008

Если вы действительно можете вставить, используя те же вызовы подключения, ваша проблема, скорее всего, заключается в том, что пользователь «apache» не имеет разрешений SELECT для базы данных. Если у вас установлен phpMyAdmin, вы можете посмотреть разрешения для пользователя на панели привилегий. phpMyAdmin также позволяет очень легко изменять разрешения.

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

Вам, вероятно, нужно сделать что-то вроде:

GRANT SELECT ON myDatabase.myTable TO 'apache' @ 'localhost';

1 голос
/ 06 августа 2008

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

Если, однако, пользователю apache не требуется пароль, может быть хорошей проверкой двойная проверка разрешений (которую вы упомянули, вы уже проверили). Тем не менее, может быть полезно выполнить что-то вроде этого в приглашении mysql:

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

Этот синтаксис должен быть правильным.

Кроме этого, я такой же тупой, как и ты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...