PHPを使用してデータベースに接続する場合、 connect()関数( mysqli_connect()やPDO接続など)は正常に戻ります。つまり、データベースサーバーは接続要求を正常に受け入れました。ただし、接続が成功したとしても、アクセス許可が不十分なため、特定のデータベーステーブルにアクセスできない可能性があります。これは、データベースの許可の問題をデバッグする際の多くの開発者にとって一般的な混乱です。
この記事では、この状況の原因を詳細に分析し、許可不足の問題をトラブルシューティングと解決する方法に関するアイデアを提供します。
connect()関数は、データベースサーバーへの接続を確立する責任のみを担当します。ユーザーのユーザー名とパスワードが正しいかどうか、サーバーにアクセスできるかどうかを確認します。
しかし、データベースアクセスの許可制御は、以下を含むよりきめの状態です
このユーザーはデータベースにアクセスする許可を持っていますか?
テーブルを読み、書き、または変更する許可はありますか
特定の操作を実行する許可はありますか(ストアドプロシージャなど)
したがって、接続の成功は最初のステップにすぎず、データベーステーブルでのその後の操作には、対応する許可サポートが必要です。
<?php
$mysqli = new mysqli("m66.net", "username", "password", "database");
// 接続に正常に
if ($mysqli->connect_errno) {
echo "接続に失敗しました: " . $mysqli->connect_error;
exit();
}
// テーブルにアクセスしてみてください
$result = $mysqli->query("SELECT * FROM sensitive_table");
if (!$result) {
echo "クエリに失敗しました,エラーメッセージ:" . $mysqli->error;
}
?>
上記のコードでは、 connect()はエラーを報告しませんが、クエリを実行するときに表示される場合があります。
クエリに失敗しました,エラーメッセージ:Access denied for user 'username'@'host' to database 'database'
または:
クエリに失敗しました,エラーメッセージ:SELECT command denied to user 'username'@'host' for table 'sensitive_table'
データベースユーザー許可が不十分で<br> 接続に使用されるユーザーアカウント権限は不完全です。アカウントは、サーバーに接続するか、一部のデータベースにアクセスすることのみが許可されている可能性がありますが、特定のテーブルにアクセスしたり、クエリを実行することは許可されていない可能性があります。
データベースの許可設定は高粒度<br>です データベースの権限は通常、データベース、テーブル、列、さらには操作レベルに割り当てられます。接続の成功は、IDを確認するためだけです。実際の操作は、特定のオブジェクト上のユーザーの許可によって異なります。
ユーザーを接続することは、オペレーティングユーザーと矛盾しています<BR> データベースへの接続が成功する場合がありますが、クエリの実際のIDは現在のユーザーではなく、ストアドプロシージャやトリガーなどの内部呼び出しにより許可の問題を引き起こす可能性があります。
データベース管理ツールまたはコマンドラインを使用して、ユーザーの許可を表示します。
SHOW GRANTS FOR 'username'@'host';
ユーザーがターゲットデータベースとテーブルに正しい権限を持っていることを確認します。
GRANT SELECT, INSERT, UPDATE ON database.sensitive_table TO 'username'@'host';
FLUSH PRIVILEGES;
接続に使用されるユーザー名、パスワード、およびホストが正しいかどうかを確認して、間違ったアカウントまたはデータベースに接続しないようにします。
ニーズに応じて、ユーザーは、過度の許可を回避するために、通常のアクセスを確保するために対応するアクセス許可を割り当てられます。
データベース管理ツールで同じアカウントテスト許可を使用して、テーブルにアクセスできるかどうかを確認します。
MySQLIを使用してPHPを使用してデータベースに接続し、許可エラーに対処する例を次に示します。