Mysql
 sql >> Base de données >  >> RDS >> Mysql

Attention :mysql_query() :3 n'est pas une ressource MySQL-Link valide

PHP utilise les ressources comme une variable spéciale pour contenir des liens vers des objets externes, tels que des fichiers et des connexions à des bases de données. Chaque ressource reçoit un identifiant entier. (Documentation )

Échec des connexions

Si la connexion à la base de données échoue, vous obtiendrez probablement une erreur "La variable spécifiée n'est pas une ressource MySQL-Link valide", comme l'a mentionné Dan Breen, car la variable censée contenir la ressource est nulle.

$link = mysql_connect('localsoth','baduser','badpass'); // failed connection
$result = mysql_query("SELECT 1", $link); // throws error

Étant donné que vous obtenez un ID de ressource spécifique dans le message d'erreur, la connexion à la base de données s'est probablement fermée de manière inattendue pour une raison quelconque. Votre programme a toujours une variable avec un ID de ressource, mais l'objet externe n'existe plus. Cela peut être dû à un mysql_close() appeler quelque part avant l'appel à mysql_query , ou une erreur de base de données externe qui a fermé la connexion.

$link = mysql_connect();
mysql_close($link);
// $link may still contain a resource identifier, but the external object is gone
mysql_query("SELECT 1", $link);

Réutiliser les connexions

Un problème avec l'extension mysql et mysql_connect() est que par défaut si vous passez les mêmes paramètres dans des appels successifs, il réutilisera la connexion existante plutôt que d'en créer une nouvelle (Documentation ). Cela peut être corrigé en passant true au $new_link paramètre.
J'ai rencontré cela moi-même sur un système de test où les données de deux bases de données distinctes en production étaient combinées sur un serveur de test, et en testant le mysql_xxx() les appels de fonction se sont écrasés et ont cassé le système.

$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

Utiliser $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

Modifier :
En aparté, je recommanderais d'utiliser MySQLi extension ou PDO à la place, si possible. L'extension MySQL devient assez ancienne et ne peut plus tirer parti des fonctionnalités de la version 4.1.3 de MySQL. Regardez http://www.php.net/manual/en/mysqli .overview.php pour quelques détails sur les différences entre les trois interfaces.