Erreur MySQL / Apache dans la requête PHP MySQL

Translate

Je reçois l'erreur suivante:

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

Lors de l'utilisation du 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.";
}
?>

leconnect.phpfichier contient mes appels de connexion MySQL qui fonctionnent correctement avec monINSERTrequêtes dans une autre partie du logiciel. Si je commente le$result = mysql_queryligne, puis il passe à l'instruction else. Donc, c'est cette ligne ou le contenu du if.

J'ai cherché sur le net des solutions, et la plupart semblent être liées à un trop grand nombre de connexions MySQL ou au fait que l'utilisateur que je me connecte à MySQL n'a pas la permission. 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.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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. Je n'ai pas du tout de compte utilisateur avec le nom apache.

S'il dit «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 passé pendant la connexion, MySQL utilise celui qui appelle pour la connexion.

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

La source
Translate

Remplacez include () par require ().Si le fichier "connect.php" ne peut pas être require () d, le script échoueraavec une erreur fatale, alors queinclude () ne génère qu'un avertissement. Si le nom d'utilisateur que vous passez à 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.

La source
Zak
Translate

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 touchez même la DB. Si ce n'est pas le cas, vous devriez 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 de pare-feu.

Sinon, ce sera un problème d'accès pur. Faites un "select * from mysql.user" pour voir si l'utilisateur apache y est même configuré. 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 en tant qu'apache par défaut 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 db, modifiez simplement votre question et je vais y jeter un œil.

La source
Translate

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 établie précédemment.

ETA: modifiez également l'inclusion en une requête. Je soupçonne que cela n'inclut pas du tout le fichier. Mais l'inclusion peut échouer silencieusement.

La source
Cedric Lee
Translate

Mec, la réponse est un gros DUH! qui, 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 passées à la fonction, sinon la fonction ne saura pas ce que sont $ dbhost, $ dbuser et $ dbpass. Une façon de résoudre ce problème est de 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 passer la fonction mysql_connect.

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

La source
Translate

Si en effet vous êtes capable d'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 permissions 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 facilite également la modification des permissions.

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

Vous devrez probablement faire quelque chose comme:

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

La source
Translate

Avez-vous pensé à faire:

flush privileges;

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

La source
Translate

Juste pour vérifier, si vous utilisezjustecette 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'une de ces insertions dans cette page, j'essaie de voir si elle est locale à la page ou à cette ligne réelle.

Vous pouvez é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.

La source
Translate

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 insertions dans cette page>, j'essaie de voir si elle est locale à la page ou à cette ligne réelle.

Aussi, pouvez-vous 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 que contient le fichier connection.php. J'ai lié au 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 de travail dans cette zone pour vérifier cela.

Quant aux autres postant sur l'accès par mot de passe. J'ai vérifié, comme indiqué dans ma première publication, 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. Je n'ai pas du tout de compte utilisateur avec le nom apache.

La source
Newman Lee
Translate

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 d'exécutermysql_connecten tant qu'autre utilisateur, quelqu'un qui a déjà les privilèges nécessaires (mais peut-être pas root), recherchez mysql.default_user dans votre fichier php.ini.
La source
Translate

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, le fait qu'il dise «en utilisant le mot de passe: NON» me conduirait à croire que le code essaie de se connecter sans mot de passe.

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

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

Cette syntaxe devrait être correcte.

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

La source