Question

Je reçois l'erreur suivante:

Accès refusé pour l'utilisateur 'apache'@'localhost' (avec le mot de passe :NON)

Lorsque vous utilisez le code suivant :

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

Le connect.php le fichier contient mes appels de connexion MySQL qui fonctionnent correctement avec mon INSERT requêtes dans une autre partie du logiciel.Si je commente le $result = mysql_query ligne, puis il passe à l'instruction else.Donc, c'est cette ligne ou le contenu du if.

J'ai recherché des solutions sur le net, et la plupart semblent être liées à un trop grand nombre de connexions MySQL ou au fait que l'utilisateur avec lequel je me connecte à MySQL n'a pas l'autorisation.J'ai vérifié les deux.Je peux toujours effectuer mes autres requêtes ailleurs dans le logiciel et j'ai vérifié que le compte dispose des autorisations appropriées.

Était-ce utile?

La solution

Et si cela compte, apache@localhost n'est pas le nom du compte utilisateur que j'utilise pour accéder à la base de données.D'ailleurs, je n'ai aucun compte d'utilisateur portant le nom Apache.

S'il indique « apache@localhost », le nom d'utilisateur n'est pas transmis correctement à la connexion MySQL.'apache' est normalement l'utilisateur qui exécute le processus httpd (au moins sur les systèmes basés sur Redhat) et si aucun nom d'utilisateur n'est transmis lors de la connexion, MySQL utilise celui qui appelle pour la connexion.

Si vous effectuez la connexion directement dans votre script, et non dans un fichier appelé, obtenez-vous la même erreur ?

Autres conseils

Remplacez include() par require(). Si le fichier "connect.php" ne peut pas être require(), le script échouera avec une erreur fatale, alors que include() génère uniquement un avertissement.Si le nom d'utilisateur que vous transmettez à mysql_connect() n'est pas "apache", un chemin incorrect vers le script de connexion est le moyen le plus courant d'obtenir ce type d'erreur.

N'oubliez pas de vérifier les journaux d'erreurs de votre base de données.Vous devriez être en mesure de voir si vous accédez même à la base de données.Si ce n'est pas le cas, vous devez vérifier vos règles de pare-feu sur la boîte.Sur une machine Linux, vous pouvez exécuter iptables -L pour obtenir les règles de la liste des pare-feu.

Sinon, ce sera un pur problème d’accès.Faites un "select * from mysql.user" pour voir si l'utilisateur Apache est même configuré là-dedans.De plus, je recommanderais de créer un compte spécifiquement pour votre application plutôt que d'utiliser Apache, car toute autre application que vous créez s'exécutera par défaut sous Apache et pourrait obtenir un accès non autorisé à votre base de données.

Recherchez simplement "GRANT" dans la documentation @ dev.mysql.com pour obtenir plus d'informations.Si vous avez des questions plus spécifiques concernant la base de données, modifiez simplement votre question et j'y jetterai un œil.

Le script connect.php établit-il réellement la connexion ou définit-il simplement une fonction que vous devez appeler pour créer une connexion ?L'erreur que vous obtenez est symptomatique de l'absence de connexion préalablement établie.

ETA :Modifiez également l'inclusion en require.Je soupçonne que cela n'inclut pas du tout le fichier.Mais l'inclusion peut échouer silencieusement.

Mec, la réponse est un gros DUH !ce que malheureusement il m'a fallu un certain temps pour comprendre aussi.Vous avez probablement une fonction comme dbconnect() et vous utilisez des variables d'un fichier d'inclusion pour établir la connexion.$conn = mysql_connect($dbhost, $dbuser, $dbpass).

Eh bien, puisque c'est à l'intérieur d'une fonction, les variables du fichier d'inclusion doivent être transmises à la fonction, sinon la fonction ne saura pas ce que sont $dbhost, $dbuser et $dbpass.Un moyen de résoudre ce problème consiste à rendre ces variables globales afin que vos fonctions puissent les récupérer.Une autre solution qui n'est pas très sécurisée serait d'écrire votre hôte, votre utilisateur et de transmettre la fonction mysql_connect.

J'espère que cela aide mais j'ai eu le même problème.

Si effectivement vous parvenez à insérer en utilisant les mêmes appels de connexion, votre problème réside probablement dans le fait que l'utilisateur "apache" n'a pas les autorisations SELECT sur la base de données.Si phpMyAdmin est installé, vous pouvez consulter les autorisations de l'utilisateur dans le volet Privilèges.phpMyAdmin permet également de modifier très facilement les autorisations.

Si vous n'avez accès qu'à la ligne de commande, vous pouvez vérifier les autorisations depuis la base de données mysql.

Vous devrez probablement faire quelque chose comme :

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

Avez-vous pensé à faire :

flush privileges;

Si l'utilisateur n'est pas configuré, l'erreur 'apache'@'localhost' sera générée.

Juste pour vérifier, si vous utilisez juste cette partie, vous obtenez une erreur?

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

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

Si tel est le cas, obtenez-vous toujours une erreur si vous copiez et collez l'un de ces inserts dans cette page, j'essaie de voir s'il est local sur la page ou sur cette ligne réelle.

Pouvez-vous également publier une copie des appels de connexion (moins les mots de passe), à ​​moins que les insertions n'utilisent exactement la même syntaxe que cet exemple.

Juste pour vérifier, si vous utilisez uniquement cette partie, vous obtenez une erreur ?

Si tel est le cas, obtenez-vous toujours une erreur si vous copiez et collez l'un de ces inserts dans cette >page, j'essaie de voir s'il est local à la page ou à cette ligne réelle.

Pouvez-vous également publier une copie des appels de connexion (moins les mots de passe), à ​​moins que les insertions >utilisent exactement la même syntaxe que cet exemple.

Voici ce qu’il y a dans le fichier connection.php.J'ai lié le fichier via une inclusion de la même manière que lorsque j'exécute les requêtes INSERT ailleurs dans le code.

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

Je vais essayer la requête INSERT fonctionnelle dans cette zone pour vérifier cela.

Quant aux autres publications sur l'accès par mot de passe.J'ai, comme indiqué dans mon premier message, vérifié les autorisations.J'ai utilisé phpMyAdmin pour vérifier que les autorisations du compte utilisateur que j'utilisais étaient correctes.Et si cela compte, apache@localhost n'est pas le nom du compte utilisateur que j'utilise pour accéder à la base de données.D'ailleurs, je n'ai aucun compte d'utilisateur portant le nom Apache.

Vous pouvez effectuer l'une des opérations suivantes :

  • Ajoutez l'utilisateur "apache" et configurez ses privilèges depuis phpmyadmin ou en utilisant mysql sur un shell
  • Dites à php de s'exécuter mysql_connect en tant qu'autre utilisateur, quelqu'un qui dispose déjà des privilèges nécessaires (mais peut-être pas root), recherchez mysql.default_user dans votre fichier php.ini.

L'utilisateur Apache a-t-il besoin d'un mot de passe pour se connecter à la base de données ?Si tel est le cas, alors le fait qu'il soit écrit "en utilisant un mot de passe :NON" me ferait croire que le code essaie de se connecter sans mot de passe.

Si, toutefois, l'utilisateur Apache n'a pas besoin de mot de passe, une double vérification des autorisations peut être une bonne idée (que vous avez déjà mentionné avoir vérifiée).Il peut toujours être avantageux d'essayer d'exécuter quelque chose comme ceci à l'invite MySQL :

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

Cette syntaxe devrait être correcte.

A part ça, je suis aussi perplexe que toi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top