Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

ПРЕДОСТАВИТЬ ВЫБОР НА myDatabase.myTable TO 'apache'@'localhost';

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

flush privileges;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В остальном я так же озадачен, как и вы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top