29

次のエラーが発生します。

ユーザー'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にログインしているユーザーに権限がないことに関連しているようです。両方チェックしました。ソフトウェアの他の場所でも他のクエリを実行でき、アカウントに正しい権限があることを確認しました。

4

11 に答える 11

12

それが問題だとしても、apache@localhost は、データベースにアクセスするために使用するユーザー アカウントの名前ではありません。そのため、apache という名前のユーザー アカウントはまったくありません。

「apache@localhost」と表示されている場合、ユーザー名が MySQL 接続に正しく渡されていません。'apache' は通常、(少なくとも Redhat ベースのシステムでは) httpd プロセスを実行するユーザーであり、接続中にユーザー名が渡されない場合、MySQL は接続を要求しているユーザーを使用します。

呼び出されたファイルではなくスクリプトで接続を行うと、同じエラーが発生しますか?

于 2008-08-06T00:05:34.790 に答える
4

include() を require() に変更します。「connect.php」ファイルを require() できない場合、スクリプトは致命的なエラーで失敗しますが、include() は警告のみを生成します。mysql_connect() に渡すユーザー名が「apache」でない場合、接続スクリプトへのパスが正しくないことが、このタイプのエラーを発生させる最も一般的な方法です。

于 2008-10-21T18:30:18.767 に答える
2

おい、答えは大きなDUHです!残念ながら、私も理解するのに時間がかかりました。おそらく dbconnect() のような関数があり、インクルード ファイルの変数を使用して接続を確立しています。$conn = mysql_connect($dbhost、$dbuser、$dbpass)。

これは関数内にあるため、インクルード ファイルの変数を関数に渡す必要があります。そうしないと、関数は $dbhost、$dbuser、および $dbpass が何であるかを認識できません。これを修正する方法は、これらの変数をグローバルにして、関数がそれらを取得できるようにすることです。あまり安全ではない別の解決策は、ホスト、ユーザーを書き出して、mysql_connect 関数に渡すことです。

これが役立つことを願っていますが、私は同じ問題を抱えていました。

于 2009-03-02T19:47:10.743 に答える
2

データベースのエラー ログを確認することを忘れないでください。DB にアクセスしているかどうかも確認できるはずです。そうでない場合は、ボックスのファイアウォール ルールを確認する必要があります。Linux ボックスでは、iptables -L を実行して、ファイアウォール リスト ルールを取得できます。

そうしないと、純粋なアクセスの問題になります。「select * from mysql.user」を実行して、Apache ユーザーが設定されているかどうかを確認します。さらに、apache を使用するのではなく、アプリ専用のアカウントを作成することをお勧めします。これは、作成した他のアプリはデフォルトで apache として実行され、データベースへの不正アクセスを取得する可能性があるためです。

詳細については、ドキュメント @ dev.mysql.com で「GRANT」を検索してください。データベースに関してより具体的な質問がある場合は、質問を編集してください。確認します。

于 2008-10-21T17:53:03.850 に答える
2

connect.php スクリプトは実際に接続を確立しますか? それとも、接続を作成するために呼び出す必要がある関数を定義するだけですか? 発生しているエラーは、以前に確立された接続がまったくないことを示しています。

ETA: また、include を require に変更します。実際にはファイルがまったく含まれていないと思われます。しかし、include は黙って失敗する可能性があります。

于 2008-10-21T17:57:06.150 に答える
1

確認するだけですが、この部分だけを使用するとエラーが発生しますか?

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

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

もしそうなら、それらの挿入物の1つをコピーしてこのページに貼り付けてもエラーが発生しますか?私はそれがページまたはその実際の行にローカルであるかどうかを確認しようとしています。

また、挿入がこの例とまったく同じ構文を使用していない限り、接続呼び出しのコピー(パスワードを差し引いたもの)を投稿できますか。

于 2008-08-05T21:52:44.123 に答える
1

apacheユーザーはデータベースに接続するためにパスワードを必要としますか?もしそうなら、それが「パスワードを使用している:いいえ」と言っているという事実は、コードがパスワードなしで接続しようとしていると私に信じさせるでしょう。

ただし、apacheユーザーがパスワードを必要としない場合は、アクセス許可を再確認することをお勧めします(既に確認済みであると述べました)。mysqlプロンプトで次のようなものを実行してみるとまだ有益な場合があります。

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

その構文は正しいはずです。

それ以外は、私はあなたと同じように困惑しています。

于 2008-08-05T21:56:20.607 に答える
1

次のいずれかを実行できます。

  • ユーザー「apache」を追加し、phpmyadmin から、またはシェルで mysql を使用してその権限を設定します
  • mysql_connectphp.ini ファイルで mysql.default_user を探して、必要な権限を既に持っている別のユーザー (ただし root ではない可能性があります) としてphp を実行するように指示します。
于 2009-06-21T21:06:26.357 に答える
1

実際に同じ接続呼び出しを使用して挿入できる場合、問題はおそらくユーザー「apache」がデータベースに対する SELECT 権限を持っていないことにあります。phpMyAdmin がインストールされている場合は、[権限] ペインでユーザーの権限を確認できます。phpMyAdmin を使用すると、パーミッションの変更も非常に簡単になります。

コマンド ラインにしかアクセスできない場合は、mysql データベースからアクセス許可を確認できます。

おそらく次のようなことをする必要があります:

GRANT SELECT ON myDatabase.myTable TO 'apache'@'localhost';
于 2008-08-05T22:02:23.777 に答える
1

念のために言っておきますが、この部分だけを使用するとエラーが発生しますか?

その場合、これらの挿入の 1 つをコピーしてこのページに貼り付けると、まだエラーが発生しますか? ページまたは実際の行に対してローカルかどうかを確認しようとしています。

また、挿入がこの例とまったく同じ構文を使用しない限り、接続呼び出しのコピー (パスワードを除く) を投稿できますか?

これが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 という名前のユーザー アカウントはまったくありません。

于 2008-08-05T22:40:40.720 に答える
1

あなたがすることを覚えていましたか:

flush privileges;

ユーザーが設定されていない場合、'apache'@'localhost' エラーが発生します。

于 2013-09-19T10:46:15.757 に答える