Pergunta

Eu estou recebendo o seguinte erro:

Acesso negado ao usuário 'apache'@'localhost' (usando senha:NÃO)

Ao usar o seguinte código:

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

O connect.php contém minhas chamadas de conexão do MySQL que estão funcionando bem com meu INSERT consultas em outra parte do software.Se eu comentar o $result = mysql_query linha, então ele passa para a instrução else.Então, é essa linha ou o conteúdo do if.

Tenho pesquisado na rede por soluções, e a maioria parece estar relacionada a muitas conexões MySQL ou ao usuário com quem estou fazendo login no MySQL não ter permissão.Eu verifiquei ambos.Ainda posso realizar minhas outras consultas em outro lugar do software e verifiquei se a conta tem as permissões corretas.

Foi útil?

Solução

E se isso importa, apache@localhost não é o nome da conta de usuário que uso para entrar no banco de dados.Eu não tenho nenhuma conta de usuário com o nome apache.

Se estiver dizendo 'apache@localhost' o nome de usuário não está sendo passado corretamente para a conexão MySQL.'apache' normalmente é o usuário que executa o processo httpd (pelo menos em sistemas baseados em Redhat) e se nenhum nome de usuário for passado durante a conexão, o MySQL usa quem está solicitando a conexão.

Se você fizer a conexão diretamente no seu script, e não em um arquivo chamado, receberá o mesmo erro?

Outras dicas

Altere include() para require(). Se o arquivo "connect.php" não puder ser require()d, o script falhará com um erro fatal, enquanto include() apenas gera um aviso.Se o nome de usuário que você está passando para mysql_connect() não for "apache", um caminho incorreto para o script de conexão é a maneira mais comum de obter esse tipo de erro.

Não se esqueça de verificar os logs de erros do seu banco de dados.Você deve ser capaz de ver se está atingindo o banco de dados.Caso contrário, você deve verificar as regras do firewall na caixa.Em uma caixa Linux você pode executar iptables -L para obter as regras da lista de firewall.

Caso contrário, será um puro problema de acesso.Faça um "select * from mysql.user" para ver se o usuário do Apache está configurado lá.Além disso, eu recomendaria criar uma conta especificamente para o seu aplicativo, em vez de usar o Apache, já que qualquer outro aplicativo que você criar será executado como Apache por padrão e poderá obter acesso não autorizado ao seu banco de dados.

Basta procurar "GRANT" na documentação @ dev.mysql.com para obter mais informações.Se você tiver perguntas mais específicas sobre banco de dados, basta editar sua pergunta e eu darei uma olhada.

O script connect.php realmente faz a conexão ou apenas define uma função que você precisa chamar para criar uma conexão?O erro que você está recebendo é sintomático de não ter nenhuma conexão previamente estabelecida.

Hora prevista de chegada:Altere também o include para um require.Eu suspeito que na verdade não está incluindo o arquivo.Mas a inclusão pode falhar silenciosamente.

Cara, a resposta é um grande DUH!o que infelizmente demorei um pouco para descobrir também.Você provavelmente tem uma função como dbconnect() e está usando variáveis ​​de um arquivo include para fazer a conexão.$conn = mysql_connect($dbhost, $dbuser, $dbpass).

Bem, como isso está dentro de uma função, as variáveis ​​do arquivo de inclusão precisam ser passadas para a função, caso contrário a função não saberá o que é $dbhost, $dbuser e $dbpass.Uma maneira de corrigir isso é tornar essas variáveis ​​globais para que suas funções possam captá-las.Outra solução que não é muito segura seria escrever seu host, usuário e passar a função mysql_connect.

Espero que isso ajude, mas eu tive o mesmo problema.

Se de fato você consegue inserir usando as mesmas chamadas de conexão, seu problema provavelmente está no usuário "apache" não ter permissões SELECT no banco de dados.Se você tiver o phpMyAdmin instalado, poderá verificar as permissões do usuário no painel Privilégios.O phpMyAdmin também facilita muito a modificação das permissões.

Se você tiver acesso apenas à linha de comando, poderá verificar as permissões do banco de dados mysql.

Você provavelmente precisará fazer algo como:

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

Você se lembrou de fazer:

flush privileges;

Se o usuário não estiver configurado, ocorrerá o erro 'apache'@'localhost'.

Só para verificar, se você usa apenas esta parte você recebe um erro?

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

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

Nesse caso, você ainda receberá um erro se copiar e colar uma dessas inserções nesta página. Estou tentando ver se é local na página ou na linha real.

Além disso, você pode postar uma cópia das chamadas de conexão (menos as senhas), a menos que as inserções usem exatamente a mesma sintaxe deste exemplo.

Só para verificar, se você usar apenas esta parte você recebe um erro?

Nesse caso, você ainda receberá um erro se copiar e colar uma dessas inserções nesta página. Estou tentando ver se é local na página ou na linha real.

Além disso, você pode postar uma cópia das chamadas de conexão (menos as senhas), a menos que as inserções usem exatamente a mesma sintaxe deste exemplo.

Aqui está o que está no arquivo connection.php.Vinculei o arquivo por meio de um include da mesma maneira que executo as consultas INSERT em outras partes do código.

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

Vou tentar a consulta INSERT funcional nesta área para verificar isso.

Quanto aos demais postando sobre a senha de acesso.Eu fiz, como indicado na minha primeira postagem, verificar as permissões.Usei o phpMyAdmin para verificar se as permissões da conta de usuário que estava usando estavam corretas.E se isso importa, apache@localhost não é o nome da conta de usuário que uso para entrar no banco de dados.Eu não tenho nenhuma conta de usuário com o nome apache.

Você pode fazer o seguinte:

  • Adicione o usuário "apache" e configure seus privilégios no phpmyadmin ou usando mysql em um shell
  • Diga ao php para executar mysql_connect como outro usuário, alguém que já possui os privilégios necessários (mas talvez não seja root), procure mysql.default_user em seu arquivo php.ini.

O usuário apache exige uma senha para se conectar ao banco de dados?Se sim, então o fato de estar escrito "usando senha:NÃO" me levaria a acreditar que o código está tentando se conectar sem senha.

Se, no entanto, o usuário do Apache não exigir uma senha, uma verificação dupla das permissões pode ser uma boa ideia (que você mencionou que já verificou).Ainda pode ser benéfico tentar executar algo assim no prompt do mysql:

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

Essa sintaxe deve estar correta.

Fora isso, estou tão perplexo quanto você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top