PHP e MySQL no Mac OS X: Acesso negado para o usuário da GUI

4

Esta questão foi postada primeiro no Stack Overflow, mas como é talvez um problema no servidor, eu acho que pode ser muito bom postar aqui também.

Acabei de instalar e configurar o Apache, MySQL, PHP e phpMyAdmin no meu Macbook para ter um ambiente de desenvolvimento local. Mas depois que mudei um dos meus projetos para o servidor local, recebi um erro estranho no MySQL de uma das minhas chamadas para mysql_query ():

Access denied for user '_securityagent'@'localhost' (using password: NO)

Antes de mais nada, a consulta que estou enviando para o MySQL é válida, e até testei o phpMyAdmin com um resultado perfeito. Em segundo lugar, a mensagem de erro só acontece aqui enquanto eu tenho pelo menos 4 outras conexões e consultas mysql por página. Esta chamada para mysql_query () acontece no final de uma função realmente longa que manipula dados para artigos recém-criados ou modificados. Isso basicamente o que faz:

  1. Colete todos os dados do formulário do artigo (título, conteúdo, datas, etc.)
  2. Validar dados coletados
  3. Conectar-se ao banco de dados
  4. Crie dinamicamente a consulta SQL com base em dados de artigos validados
  5. Enviar consulta ao banco de dados antes de fechar a conexão

Bastante básico, eu sei. Eu não reconheci o nome de usuário "_securityagent", então depois de uma pesquisa rápida me deparei com isso e artigo no Developer Connection da Apple falando sobre algum erro aleatório:

Mac OS X's security infrastructure gets around this problem by running its GUI code as a special user, "_securityagent".

Então eu tentei colocar um var_dump () em todas as variáveis usadas na chamada mysql_connect (), e toda vez que ele retorna os valores corretos (onde o nome de usuário não é "_agente de segurança", é claro). Portanto, estou me perguntando se alguém tem alguma ideia de por que 'securityagent' está tentando se conectar ao meu banco de dados - e como posso evitar que esse erro ocorra quando eu chamar mysql_query ().

Atualização: aqui está o código exato que estou usando para conectar ao banco de dados. Mas uma pequena explicação deve seguir:

  1. O erro de conexão acontece em uma chamada para mysql_query () na função X em class_1
  2. class_1 usa class_2 para se conectar ao banco de dados
  3. class_2 lê um arquivo de configuração com as variáveis de conexão do banco de dados (host, user, pass, db)
  4. class_2 conecta-se ao banco de dados por meio da seguinte função:

var $SYSTEM_DB_HOST = "";

function connect_db() {

// Reads the config file
include('system_config.php');

if (!($SYSTEM_DB_HOST == "")) {
    mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
    @mysql_select_db($SYSTEM_DB);

    return true;
} else {
    return false;
}
}

    
por o01 30.07.2009 / 17:39

5 respostas

1

Como você está chamando mysql_query() ? Percebi que você não salva o identificador de conexão da chamada mysql_connect() . Parece-me que a falha na chamada mysql_query() não está usando a conexão que você está fazendo.

Eu recomendo que você revise seu código para fazer algo assim:

function connect_db() {
    // Reads the config file
    include('system_config.php');

    if ($SYSTEM_DB_HOST == "") {
        return false;
    }

    $dbhandle = mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
    if ($dbhandle) {
        @mysql_select_db($SYSTEM_DB, $dbhandle);

        return $dbhandle;
    } else {
        return false;
    }
}

// ... invoke like this:
$dbhanle = connect_db();
if (!$dbhandle) {
    // handle failed DB connection
}

// later, whenever you need to run queries:
$result = mysql_query($querysql, $dbhandle);

Isso garantirá que a conexão que você faz com mysql_connect seja, de fato, aquela que é usada para a consulta. Veja se isso muda alguma coisa; mesmo que isso não aconteça, pessoalmente, eu acho que é uma boa prática informar explicitamente ao MySQL qual conexão de banco de dados você deseja usar.

    
por 27.10.2009 / 15:09
0

Você deve estar passando suas credenciais em mysql_connect .

    
por 30.07.2009 / 17:45
0

A chamada para mysql_query() pode estar captando a conexão errada ou tentando abrir uma nova conexão; tente salvar o recurso de conexão do mysql_connect() e passe explicitamente para mysql_query() . Melhor ainda, considere atualizar para um driver mais moderno, como mysqli ou PDO. Como um teste separado (e em outro script), tente emitir um mysql_connect() e mysql_query() sem credenciais e veja se você obtém o mesmo erro.

    
por 30.09.2009 / 14:26
0

Você verificou que esse usuário pode realizar consultas? Se você pode entrar no phpmyadmin como um usuário root, então verifique se o usuário _sercurityagent tem os direitos para realizar consultas em:

  • localhost
  • endereço IP da caixa
  • loopback

Depois, certifique-se de que, em cada um dos listados, você conceda ao usuário direitos sobre o que acha que eles precisarão.

Você deve ser capaz de realizar uma consulta.

    
por 22.10.2009 / 17:45
0

Tente algo como:

var $SYSTEM_DB_HOST = "";

function connect_db() {

    // Reads the config file
    include('system_config.php');

    if (!($SYSTEM_DB_HOST == "")) {
        $handle = mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
        @mysql_select_db($SYSTEM_DB,$handle);

        return true;
    } else {
        return false;
    }
}
$handle = connect_db();
mysql_query("QUERY",$handle);
.....
mysql_close($handle);
    
por 31.01.2010 / 08:50