Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Aviso:mysql_query():3 não é um recurso válido do MySQL-Link


O PHP usa recursos como uma variável especial para manter links para objetos externos, como arquivos e conexões de banco de dados. Cada recurso recebe um id inteiro. (Documentação )

Conexões com falha


Se a conexão com o banco de dados falhar, você provavelmente receberá um erro "Variável especificada não é um recurso válido do MySQL-Link", como Dan Breen mencionou, já que a variável que deveria conter o recurso é nula.
$link = mysql_connect('localsoth','baduser','badpass'); // failed connection
$result = mysql_query("SELECT 1", $link); // throws error

Como você está recebendo uma ID de recurso específica na mensagem de erro, a conexão do banco de dados provavelmente foi fechada inesperadamente por algum motivo. Seu programa ainda tem uma variável com um ID de recurso, mas o objeto externo não existe mais. Isso pode ser devido a um mysql_close() chame em algum lugar antes da chamada para mysql_query , ou um erro de banco de dados externo que encerrou a conexão.
$link = mysql_connect();
mysql_close($link);
// $link may still contain a resource identifier, but the external object is gone
mysql_query("SELECT 1", $link);

Reutilizando conexões


Um problema com a extensão mysql e mysql_connect() é que, por padrão, se você passar os mesmos parâmetros em chamadas sucessivas, ele reutilizará a conexão existente em vez de criar uma nova (Documentação ). Isso pode ser corrigido passando true para o $new_link parâmetro.
Eu mesmo encontrei isso em um sistema de teste onde os dados de dois bancos de dados separados em produção foram combinados em um servidor de teste, e ao testar o mysql_xxx() chamadas de função passaram por cima umas das outras e quebraram o sistema.
$link1 = mysql_connect('localhost','user','pass'); // resource id 1 is given
$link2 = mysql_connect('localhost','user','pass'); // resource id 1 is given again
mysql_close($link2); // the connection at resource id 1 is closed
mysql_query("SELECT 1", $link1); // will fail, since the connection was closed

Usando $new_link :
$link1 = mysql_connect('localhost','user','pass'); // resource id 1 is given
$link2 = mysql_connect('localhost','user','pass', true); // resource id 2 is given
mysql_close($link2); // the connection at resource id 2 is closed
mysql_query("SELECT 1", $link1); // the connection at resource id 1 is still open

Edit:
Como um aparte, eu recomendaria usar o MySQLi extensão ou PDO em vez disso, se possível. A extensão MySQL está ficando muito antiga e não pode tirar proveito de nenhum recurso anterior à versão 4.1.3 do MySQL. Veja http://www.php.net/manual/en/mysqli .overview.php para alguns detalhes sobre as diferenças entre as três interfaces.