Insert into donne une erreur Ressource #4


#1

Bonjour,

J’obtiens systématiquement une erreur de MySQL (Ressource id #4) lorsque je tente d’insérer:

$sql = “INSERT INTO classement (num_jeu, j1, j2, j3, j4) VALUES (’$num_jeu’, ‘$j1’, ‘$j2’, ‘$j3’, $j4)”;

Un echo de ces variables ne pose pas de problème pour sa part. Je suppose qu’il s’agit d’un problème de syntaxe, mais je crois les avoir toutes essayées.

L’un d’entre-vous pourrait-il m’aider ?

Merci beaucoup par avance.
dl


#2

un echo de quoi ?
peux tu mettre un extrait plus complet du code qui pose problème stp ?


#3

Merci pour ton attention.

Dans du contenu stocké dans ma première table de ma BDD (MySQL), je récupère des textes afin de savoir combien de fois 4 joueurs sont cités

$requete = mysql_query("SELECT * FROM jeu_de_bois");

While($ligne = mysql_fetch_assoc($requete))

{ 
	$num_jeu = $ligne[num_jeu];
	$contenu_texte = $ligne[contenu_texte];

Pour cela pas de problème. Je continue ensuite, toujours dans ma boucle de While afin de déclarer:

$j1 = substr_count($contenu_texte, 'Antoine');
$j2 = substr_count($contenu_texte, 'Fabrice');
$j3 = substr_count($contenu_texte, 'Valérie');
$j4 = substr_count($contenu_texte, 'Martine');

Jusque là, tout est ok. Et produire l’affichage n’a pas posé de problème, via:

echo '<tr><td>$num_jeu</td><td>$j1</td><td>j2</td><td>j3</td><td>j4</td></tr>'; // j'ai pris soin de mettre <table> avant ma requête et </table> après ma boucle while.

Là où cela devient embarrassant, c’est lorsque je veux encoder ces données recueillies dans une nouvelle table appelée classement:

$sql = "INSERT INTO classement (num_jeu, j1, j2, j3, j4) VALUES ('$num_jeu', '$j1', '$j2', '$j3', '$j4')";

} // fin de la boucle

C’est en effet là que le navigateur m’indique Erreur Ressource #4 et que l’insertion dans la nouvelle table ne s’effectue pas.

Le but ultime, en réalité, c’est d’aller chercher dans une table (jeu_de_bois) le nombre de fois que j1, j2, j3 et j4 apparaissent dans la colonne vainqueur et produire ce résultat dans une nouvelle table (classement) où chaque joueur (j1, j2, j3 et j4) a sa colonne.

Bien sûr, un count(*) sur jointure pourrait faire l’affaire, mais je ne m’y risque plus, tant cela me dépasse (les deux tables ont une colonne commune), raison pour laquelle je me suis retranché sur substr_count qui reprend également les données.

J’espère avoir été suffisamment compréhensible ;)

Et encore merci !


#4

Bonjour,

certains champs ont des cotes et le dernier non. ce sont tous des entiers?

sinon afficher l’erreur pourrai éventuellement aider

echo mysql_errno($link) . ": " . mysql_error($link). "\n";


#5

Alors plusieurs remarques :

  1. Tu utilises la vieille extension mysql de PHP, avec les fonctions mysql_*. Celle-ci est dépréciée, pas maintenue et pas sécurisée. Je te recommande dès maintenant de migrer à mysqli et d’utiliser les mêmes fonctions mysqli_*. Celles-ci changent un peu car elles acceptent en argument une Ressource Mysqli.
  2. Si tu obtiens une ressource, c’est normal : l’ancienne API de Mysql contient une ressource tant que tu ne le “cast” pas en autre chose.
  3. Tes requêtes SQL ne sont pas sécurisées. Cf: http://php.net/manual/fr/security.database.sql-injection.php
  4. Utilise une requête préparée et exécute-là à chaque itération avec de nouveaux paramètres (ceux que tu récupères à chaque itération de ta boucle). Non seulement c’est propre, mais en plus ça économise des performances.