PHP MySQL クエリでの MySQL/Apache エラー
質問
次のエラーが発生します。
ユーザー '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()d できない場合、スクリプトは失敗します。 致命的なエラーが発生する場合、 include() は警告のみを生成します. 。mysql_connect() に渡すユーザー名が「apache」ではない場合、接続スクリプトへのパスが正しくないことが、このタイプのエラーを引き起こす最も一般的な方法です。
データベースのエラー ログを確認することを忘れないでください。DB に到達しているかどうかも確認できるはずです。そうでない場合は、ボックスにあるファイアウォール ルールを確認する必要があります。Linux ボックスでは、iptables -L を実行してファイアウォール リスト ルールを取得できます。
それ以外の場合は、純粋なアクセスの問題になります。「select * from mysql.user」を実行して、Apache ユーザーがそこに設定されているかどうかを確認します。さらに、作成した他のアプリはデフォルトで Apache として実行され、データベースに不正アクセスされる可能性があるため、Apache を使用するのではなく、アプリ専用のアカウントを作成することをお勧めします。
詳細については、ドキュメント @ dev.mysql.com で「GRANT」を検索してください。db に関してより具体的な質問がある場合は、質問を編集してください。確認させていただきます。
connect.php スクリプトは実際に接続を行っているのでしょうか、それとも接続を作成するために呼び出す必要がある関数を定義しているだけなのでしょうか?発生しているエラーは、以前に確立された接続がまったくないことを示しています。
到着予定時刻:また、 include を require に変更します。実際にはファイルがまったく含まれていないのではないかと思います。ただし、include はサイレントに失敗する可能性があります。
おい、答えは当然だ!残念ながら、私もそれを理解するのに時間がかかりました。おそらく dbconnect() のような関数があり、インクルード ファイルの変数を使用して接続を行っていると思われます。$conn = mysql_connect($dbhost, $dbuser, $dbpass)。
これは関数内にあるため、インクルード ファイルの変数を関数に渡す必要があります。そうしないと、関数は $dbhost、$dbuser、$dbpass が何であるかを認識できません。これを修正する方法は、これらの変数をグローバルにして、関数がそれらを取得できるようにすることです。あまり安全ではないもう 1 つの解決策は、ホスト、ユーザー、および mysql_connect 関数にパスを書き出すことです。
これが役立つことを願っていますが、私も同じ問題を抱えていました。
実際に同じ接続呼び出しを使用して挿入できる場合は、ユーザー「apache」にデータベースに対する SELECT 権限がないことが問題であると考えられます。phpMyAdmin がインストールされている場合は、[権限] ペインでユーザーの権限を確認できます。phpMyAdmin を使用すると、権限の変更も非常に簡単になります。
コマンドラインにのみアクセスできる場合は、mysql データベースから権限を確認できます。
おそらく次のようなことを行う必要があるでしょう:
GRANT SELECT ON 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());
その場合、これらの挿入の 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 という名前のユーザー アカウントはまったくありません。
次のいずれかを実行できます。
- ユーザー「apache」を追加し、phpmyadmin から、またはシェルで mysql を使用してその権限を設定します。
- php に実行するよう指示する
mysql_connect
必要な権限をすでに持っている別のユーザー (ただし root ではない可能性があります) として、php.ini ファイルで mysql.default_user を探します。
Apache ユーザーはデータベースに接続するためにパスワードが必要ですか?そうであれば、「パスワードを使用しています:」という事実が表示されます。NO」と表示されると、コードがパスワードなしで接続しようとしていると考えられます。
ただし、Apache ユーザーがパスワードを必要としない場合は、アクセス許可を再確認することをお勧めします (すでに確認済みだと言いました)。mysql プロンプトで次のようなものを実行してみるのも有益かもしれません。
GRANT ALL PRIVILEGES ON `*databasename*`.* to 'apache'@'localhost';
その構文は正しいはずです。
それ以外では、私もあなたと同じように困惑しています。