Mysqli

Résolu/Fermé
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 - 11 oct. 2009 à 20:44
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 - 15 oct. 2009 à 16:02
Bonjour,

Je me mets à mysqli depuis peu, et je l'utilise en POO.

J'ai besoin d'effectuer la requête suivante dans une boucle foreach:

$request="set @where='".REFERER."'; ";
								$request.="set @newpos=(select ifnull(max(position)+1,1) from images i inner join cat_images ci on ci.ref_sCat=@where and ci.ref_image=i.ref_image); ";
								$request.="insert into images ";
								$request.="values ('$refi2','$i1','$i2',@newpos); ";
								$request.="insert into cat_images ";
								$request.="values ('$refi2',@where);";


la requête est bonne, elle fonctionne, mais mysqli me renvoi une erreur. Lorsque je place la connexion à la bdd et la déconnexion dans la boucle, tout fonctionne, mais dès que c'est placé avant et après, la requête est faite mais me renvoi quand même l'erreur.

J'en déduis donc qu'elle laisse des traces qui pourrissent les loop suivants, et j'aimerais savoir ce qu'il faut faire pour les nettoyer.

Quelqu'un aurait il une idée?
A voir également:

6 réponses

P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
11 oct. 2009 à 20:57
Je comprend pas trop pourquoi tu parles de foreach alors que $request est une chaine.

mysql_query, mysqli::query n'accepte pas les requetes multiples en argument.
0
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58
11 oct. 2009 à 22:42
parce que request n'est qu'une partie de mon code traité par la boucle foreach.
De plus, je suis au courant pour les requêtes multiples, et multi_query s'en occupe assez bien^^.
Mysql prend en charge les requêtes multiples, mais il faut changer un flag à la connexion et c'est plutôt foireux comme gestion^^.
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
12 oct. 2009 à 18:56
Désolé, je comprend pas où se situe ton problème.

Tu peux montrer ce foreach, et ton utilisation de mysqli ?
Et l'erreur que retourne mysql est laquelle ?
0
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58
12 oct. 2009 à 19:18
mysqli ne retourne pas d'erreur, il se contente juste de rater son truc passer une itération :s

Voici ma boucle, je l'ai simplifiée depuis:

$mysqli=new mysqli('mysql2.celeonet.fr','jophan','mensonge1','jophan_v2');
			if( $images=$_FILES ):
					foreach($images as $id=>$image){
						list($refi1,$refi2,$i1,$i2)=$this->prepareImage($id,$image);
						if( is_int($id)
							and strlen($refi1)==10 and strlen($refi2)==10
							and strlen($i1)==14 and strlen($i2)==14 ):
								$request.="set @where='".REFERER."'; ";
								$request.="set @newpos=(select ifnull(max(position)+1,1) from images i inner join cat_images ci on ci.ref_sCat=@where and ci.ref_image=i.ref_image); ";
								$request.="insert into images ";
								$request.="values ('$refi2','$i1','$i2',@newpos); ";
								$request.="insert into cat_images ";
								$request.="values ('$refi2',@where);";
						elseif( strlen($i1)==14 and strlen($i2)==14 ):
							$request="update sCat_config set outFocus='$i1', onFocus='$i2' where ref_cat='".REFERER."' limit 1";
						endif;
					}
				if(strlen($request)!=0) $mysqli->multi_query($request) or die(__file__.' erreur '.__line__."<br />$request");
			endif;


j'ai également arrêté de faire ma query dans la boucle foreach: en concaténant mes instructions avant de les envoyer une seule fois (au lieu de toutes les envoyer dès qu'elles sont prêtes), je me suis rendu compte que le problème disparaissait. Je ne comprends absolument pas pourquoi, mais bon, tant que ça fonctionne... Je reste sur l'idée que mes requêtes laissaient des traces.

A propos, je programme en POO mes fonctions, y'a pas un moyen de faire en sorte que l'objet $mysqli soit accessible partout sans avoir à le recréer à chaque fois?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
15 oct. 2009 à 10:09
Comme j'ai toujours pas saisi le problème, je sais pas.
Et vu que je n'utilise jamais mysqli...

Sinon, tes requêtes me semble déjà incohérentes.

set @where='".REFERER."

Pourquoi initialiser une variable avec cette valeur ?
Je ne comprend pas trop l'intérêt, autant passer directement cette valeur dans la requête en ayant besoin.

set @newpos=(select ifnull(max(position)+1,1) from images i inner join cat_images ci on ci.ref_sCat=@where and ci.ref_image=i.ref_image);

Là, pareil, si la valeur de @newpos n'est pas d'une importance capitale (elle ne peut l'être en utilisant un max qui ne garanti pas l'unicité de la nouvelle valeur), autant exécuter cette requête une seule fois et d'incrémenter la variable à chaque fois (@newpos:=@newpos+1), ou même carrément utiliser une variable php.


« A propos, je programme en POO mes fonctions, y'a pas un moyen de faire en sorte que l'objet $mysqli soit accessible partout sans avoir à le recréer à chaque fois? »

Tu seras toujours obligé de créer ton objet, après tu pourrais peut-être faire une classe héritant de mysqli de façon à ne créer qu'une unique connexion à mysql (accès par singleton), c'est même préférable.
0
Smoking bird Messages postés 870 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 10 juillet 2011 58
15 oct. 2009 à 16:02
Pour le where, uniquement parce que je voulais travailler un peu avec les variables mysql :D :)

Pour newpos, si, c'est d'une importance capitale. J'ajouterais que mon max passe sur une jointure où les valeurs de position sont uniques dans la mesure où elles sont liées par une autre table, donc ça me semble ne pas être une si mauvaise idée que ça. Cela dit, je prends ta remarque en compte, j'avais pas du tout envisagé cette façon de faire (incrémenter la variable @newpos), je me pencherais très probablement sur la question.

Pour le singleton, ça m'a l'air assez intéressant :) je me renseignerais dessus.

Merci pour ta participation en tous cas, très utile^^. J'ai terminé mon projet, je mets donc ce sujet en résolu. Pas entièrement satisfait, mais dans les faits, c'est amplement suffisant. Je ferais mieux la prochaine fois :p. Cela dit, je note d'un point de vue personnel que mysqli est plus délicat à utiliser qu'il n'y paraît, j'me retrouve avec des bugs qui ne se répètent pas toujours, donc très difficiles à traquer. J'me demande bien si je vais continuer là dessus ^o).

Merci encore et à bientôt on CCM^^

Smoke
0