Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

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

flush privileges;

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