Frage

Ich erhalte die folgende Fehlermeldung:

Zugriff für Benutzer „Apache“@„localhost“ verweigert (mit Passwort:NEIN)

Bei Verwendung des folgenden Codes:

<?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.";
}
?>

Der connect.php Die Datei enthält meine MySQL-Connect-Aufrufe, die mit meinem einwandfrei funktionieren INSERT Abfragen in einem anderen Teil der Software.Wenn ich das auskommentiere $result = mysql_query Zeile, dann geht es weiter zur else-Anweisung.Es handelt sich also um diese Zeile oder den Inhalt im If.

Ich habe im Internet nach Lösungen gesucht und die meisten scheinen mit zu vielen MySQL-Verbindungen zu tun zu haben oder dass der Benutzer, mit dem ich mich bei MySQL anmelde, keine Berechtigung hat.Ich habe beides überprüft.Ich kann meine anderen Abfragen weiterhin an anderer Stelle in der Software durchführen und habe überprüft, ob das Konto über die richtigen Berechtigungen verfügt.

War es hilfreich?

Lösung

Und wenn es überhaupt wichtig ist, ist apache@localhost nicht der Name des Benutzerkontos, das ich verwende, um in die Datenbank zu gelangen.Ich habe übrigens überhaupt keine Benutzerkonten mit dem Namen Apache.

Wenn dort „Apache@localhost“ steht, wird der Benutzername nicht korrekt an die MySQL-Verbindung übergeben.„Apache“ ist normalerweise der Benutzer, der den httpd-Prozess ausführt (zumindest auf Redhat-basierten Systemen), und wenn während der Verbindung kein Benutzername übergeben wird, verwendet MySQL denjenigen, der die Verbindung anruft.

Erhalten Sie die gleiche Fehlermeldung, wenn Sie die Verbindung direkt in Ihrem Skript und nicht in einer aufgerufenen Datei herstellen?

Andere Tipps

Ändern Sie include() in require(). Wenn die Datei „connect.php“ nicht require()d sein kann, schlägt das Skript fehl mit einem fatalen Fehler, wohingegen include() generiert nur eine Warnung.Wenn der Benutzername, den Sie an mysql_connect() übergeben, nicht „Apache“ ist, ist ein falscher Pfad zum Verbindungsskript die häufigste Ursache für diese Art von Fehler.

Vergessen Sie nicht, die Fehlerprotokolle Ihrer Datenbank zu überprüfen.Sie sollten sehen können, ob Sie überhaupt die DB erreichen.Wenn dies nicht der Fall ist, sollten Sie Ihre Firewall-Regeln auf der Box überprüfen.Auf einem Linux-Rechner können Sie iptables -L ausführen, um die Firewall-Listenregeln abzurufen.

Andernfalls handelt es sich um ein reines Zugriffsproblem.Führen Sie „select * from mysql.user“ aus, um zu sehen, ob der Apache-Benutzer dort überhaupt eingerichtet ist.Darüber hinaus würde ich empfehlen, ein Konto speziell für Ihre App zu erstellen, anstatt Apache zu verwenden, da jede andere App, die Sie erstellen, standardmäßig als Apache ausgeführt wird und möglicherweise unbefugten Zugriff auf Ihre Datenbank erhält.

Suchen Sie einfach in der Dokumentation unter dev.mysql.com nach „GRANT“, um weitere Informationen zu erhalten.Wenn Sie spezifischere Fragen zu DB haben, bearbeiten Sie einfach Ihre Frage und ich werde einen Blick darauf werfen.

Stellt das Skript connect.php tatsächlich die Verbindung her oder definiert es nur eine Funktion, die Sie aufrufen müssen, um eine Verbindung herzustellen?Der Fehler, den Sie erhalten, ist symptomatisch dafür, dass zuvor überhaupt keine Verbindung hergestellt wurde.

voraussichtliche Ankunftszeit:Ändern Sie außerdem das Include in ein Require.Ich vermute, dass die Datei überhaupt nicht enthalten ist.Aber include kann stillschweigend fehlschlagen.

Alter, die Antwort ist ein großes DUH!Leider hat es auch bei mir eine Weile gedauert, bis ich es herausgefunden habe.Sie haben wahrscheinlich eine Funktion wie dbconnect() und verwenden Variablen aus einer Include-Datei, um die Verbindung herzustellen.$conn = mysql_connect($dbhost, $dbuser, $dbpass).

Da dies innerhalb einer Funktion geschieht, müssen die Variablen aus der Include-Datei an die Funktion übergeben werden, sonst weiß die Funktion nicht, was $dbhost, $dbuser und $dbpass sind.Eine Möglichkeit, dies zu beheben, besteht darin, diese Variablen global zu machen, damit Ihre Funktionen sie erfassen können.Eine andere Lösung, die nicht sehr sicher ist, wäre, Ihren Host und Benutzer auszugeben und die Funktion mysql_connect zu übergeben.

Ich hoffe, das hilft, aber ich hatte das gleiche Problem.

Wenn Sie tatsächlich in der Lage sind, über dieselben Verbindungsaufrufe etwas einzufügen, liegt Ihr Problem höchstwahrscheinlich darin, dass der Benutzer „Apache“ keine SELECT-Berechtigungen für die Datenbank hat.Wenn Sie phpMyAdmin installiert haben, können Sie die Berechtigungen für den Benutzer im Bereich „Berechtigungen“ einsehen.Mit phpMyAdmin ist es außerdem sehr einfach, die Berechtigungen zu ändern.

Wenn Sie nur Zugriff auf die Befehlszeile haben, können Sie die Berechtigungen in der MySQL-Datenbank überprüfen.

Sie müssen wahrscheinlich Folgendes tun:

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

Haben Sie daran gedacht:

flush privileges;

Wenn der Benutzer nicht eingerichtet ist, wird der Fehler „Apache“@„localhost“ ausgegeben.

Nur um zu überprüfen, ob Sie es verwenden Nur Erhalten Sie in diesem Teil eine Fehlermeldung?

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

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

Wenn ja, erhalten Sie immer noch eine Fehlermeldung, wenn Sie eine dieser Einfügungen kopieren und in diese Seite einfügen? Ich versuche herauszufinden, ob sie lokal auf der Seite oder in dieser tatsächlichen Zeile ist.

Können Sie auch eine Kopie der Verbindungsaufrufe (ohne Passwörter) veröffentlichen, es sei denn, die Einfügungen verwenden genau dieselbe Syntax wie in diesem Beispiel?

Nur zur Kontrolle: Wenn Sie nur dieses Teil verwenden, erhalten Sie eine Fehlermeldung?

Wenn ja, erhalten Sie immer noch eine Fehlermeldung, wenn Sie eine dieser Einfügungen kopieren und in diese Seite einfügen? Ich versuche herauszufinden, ob sie lokal auf der Seite oder in dieser tatsächlichen Zeile ist.

Können Sie auch eine Kopie der Verbindungsaufrufe (ohne Passwörter) veröffentlichen, es sei denn, die Einfügungen verwenden genau dieselbe Syntax wie in diesem Beispiel?

Folgendes steht in der Datei „connection.php“.Ich habe die Datei über ein Include auf die gleiche Weise verknüpft, wie ich die INSERT-Abfragen an anderer Stelle im Code ausgeführt habe.

$conn = mysql_connect("localhost", ******, ******) or die("Could not connect");
mysql_select_db("adbay_com_-_cms") or die("Could not select database");

Ich werde die funktionierende INSERT-Abfrage in diesem Bereich ausprobieren, um das zu überprüfen.

Was die anderen Beiträge zum Passwortzugriff betrifft.Ich habe, wie in meinem ersten Beitrag angegeben, die Berechtigungen überprüft.Ich habe phpMyAdmin verwendet, um zu überprüfen, ob die Berechtigungen für das von mir verwendete Benutzerkonto korrekt waren.Und wenn es überhaupt wichtig ist, ist apache@localhost nicht der Name des Benutzerkontos, das ich verwende, um in die Datenbank zu gelangen.Ich habe übrigens überhaupt keine Benutzerkonten mit dem Namen Apache.

Sie können einen der folgenden Schritte ausführen:

  • Fügen Sie den Benutzer „Apache“ hinzu und richten Sie seine Berechtigungen über phpmyadmin oder mithilfe von MySQL in einer Shell ein
  • Sagen Sie PHP, dass es ausgeführt werden soll mysql_connect Suchen Sie als anderer Benutzer, also als jemand, der bereits über die erforderlichen Berechtigungen verfügt (aber möglicherweise nicht als Root), in Ihrer php.ini-Datei nach mysql.default_user.

Benötigt der Apache-Benutzer ein Passwort, um eine Verbindung zur Datenbank herzustellen?Wenn ja, dann die Tatsache, dass dort steht: „Passwort verwenden:NEIN“ würde mich vermuten lassen, dass der Code versucht, eine Verbindung ohne Passwort herzustellen.

Wenn der Apache-Benutzer jedoch kein Passwort benötigt, ist möglicherweise eine nochmalige Überprüfung der Berechtigungen eine gute Idee (die Sie bereits überprüft haben).Es kann dennoch von Vorteil sein, zu versuchen, so etwas an einer MySQL-Eingabeaufforderung auszuführen:

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

Diese Syntax sollte korrekt sein.

Ansonsten bin ich genauso ratlos wie du.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top