Ошибка MySQL / Apache в запросе PHP MySQL

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

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

Ответов (11)

Решение

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

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

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

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

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

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

flush privileges;

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

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

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

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

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

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

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

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

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

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

В остальном я в таком же тупике, как и вы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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