[RESOLU] Requêtes à tiroir

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Requêtes à tiroir

Re: [RESOLU] Requêtes à tiroir

par Gadwin » 04 juil. 2013, 14:42

bonne idée :)

Re: [RESOLU] Requêtes à tiroir

par Mazarini » 04 juil. 2013, 14:39

Il est bien de paramétrer PHP pour afficher toutes les erreurs, warning et notice en développement (error_reporting à E_ALL). Ca permet de voir entre autre les fautes de frappe dans les noms de variables et d'obliger à initialiser toutes les variables.

Re: Requêtes à tiroir

par Gadwin » 04 juil. 2013, 14:26

C'est réglé !

J'ai rajouté un
$lol = '';
avant la boucle (jusqu’à maintenant, je le mettais dans la boucle, juste avant le if).

Du coup maintenant tout marche comme il se doit ^^

Merci beaucoup ;)

Re: Requêtes à tiroir

par Mazarini » 04 juil. 2013, 13:49

Par top, j'entends une variable que tu positionnes à false avant la boucle et que tu positionnes à true dans la boucle. Comme ca, suivant la valeur tu sais si tu est entré dans la boucle.
Par rapport à ce que je vois dans ton code, tu peux tester la chaine constitué ($lol == '' par exemple) pour savoir s'il y a eu quelque chose.

Il est peux être mieux de regarder du coté de PDOStatement::rowCount() ou mysqli_num_rows() pour savoir combien tu as de lignes comme résultat.

Re: Requêtes à tiroir

par Gadwin » 04 juil. 2013, 13:18

Bonjour et merci pour la réponse :)

Je voudrais savoir ce qu'est un top pour essayer de comprendre pourquoi il ne veut pas faire ce que j'attends de lui :oops:

Re: Requêtes à tiroir

par Mazarini » 04 juil. 2013, 11:28

Il me semble que ton problème vient que lorsque ton select ne retourne aucune ligne, tu ne rentres pas dans la boucle while.

Piste : tester le nombre de ligne retourné par le select ou utiliser un top pour savoir si tu es rentré dans la boucle.

Je n'ai pas étudié le code en détail, trop d'information à regarder.

Requêtes à tiroir

par Gadwin » 04 juil. 2013, 11:06

Bonjour à tous,

J'utilise des requêtes à tiroir, c'est à dire que j'utilise dans une requête, certaines informations obtenues dans une précédente requête. Tout allait pour le mieux jusqu'à ce que j'ajoute la dernière requête qui aurait normalement dû terminé mon travail, mais elle déconne :

Si je mets des echo, j'obtiens que la première requête est celle-ci :

Code : Tout sélectionner

SELECT * FROM butins_items WHERE zone = 'Gouffre Hurlant' ORDER BY name
Le résultat consiste en des informations sur des objets, avec un champ id que j'utilise pour la 2e requête qui va être effectuée autant de fois qu'il y a eu de résultat dans ma première requête (c'est normal, c'est ce que je veux qu'elle fasse) :
SELECT user_id FROM phpbb_user_items WHERE item_id = 23
SELECT user_id FROM phpbb_user_items WHERE item_id = 6

SELECT user_id FROM user_items WHERE item_id = 7
SELECT user_id FROM user_items WHERE item_id = 12
SELECT user_id FROM user_items WHERE item_id = 15
SELECT user_id FROM user_items WHERE item_id = 18
SELECT user_id FROM user_items WHERE item_id = 17
SELECT user_id FROM user_items WHERE item_id = 14
Les requêtes en bleu donnent un résultat (le user_id des membres possédant le butins_items considéré), les requêtes en rouge ne renvoient aucun résultat (ce qui est normal car le butins_items considéré n'est possédé par personne).

Si je mets un echo sur la requête et sur le résultat, j'ai la confirmation de ce qui est dis plus haut :
SELECT user_id FROM phpbb_user_items WHERE item_id = 23
2

SELECT user_id FROM phpbb_user_items WHERE item_id = 6
2
10

SELECT user_id FROM phpbb_user_items WHERE item_id = 7
SELECT user_id FROM phpbb_user_items WHERE item_id = 12
SELECT user_id FROM phpbb_user_items WHERE item_id = 15
SELECT user_id FROM phpbb_user_items WHERE item_id = 18

SELECT user_id FROM phpbb_user_items WHERE item_id = 17
10

SELECT user_id FROM phpbb_user_items WHERE item_id = 14
Cela dit, mon 1er problème commence ici. Voici mon code pour cette partie
		$sql = "SELECT user_id FROM ". USER_ITEMS_TABLE . " WHERE item_id = " . $row2['id'];
		echo $sql . '<br />';
		if ( !($subresult1 = $db->sql_query($sql)) )
		{
			message_die(GENERAL_MESSAGE, 'Fatal Error: '.mysqli_error());
		}
		while( $sub01 = $db->sql_fetchrow($subresult1) )
		{
			if ($sub01['user_id'] != '')
			{
				$lol = $sub01['user_id'];
			}
			else
			{
				$lol = '0';
			}
			
			echo $lol . '<br />';
			
		}
		$db->sql_freeresult($subresult1);
Peut importe que je mets
if ($sub01['user_id'] != '')
if (!empty($sub01['user_id']))
if (isset($sub01['user_id']))
Le else n'entre jamais en jeu, alors que l'on sait d'après les echo que j'ai placé avant, que certaine requête ne renvoie aucun résultat.

En soit je me moque qu'il n'affiche pas le else, mais cela me cause des problèmes pour la requête d'après.
- Que dois-je changer pour afficher le else lorsque le résultat de ma requête est vide ?
- Comment rendre mon résultat $lol affichable sur une seule ligne ?
Mon but étant de le transformer en
"AND user_id != " . $lol
------------------------

Pourquoi est-ce que je souhaite afficher le else ?

Sur la requête d'après, j'utilise le code suivant
		$sql = "SELECT user_id, username, BLM, WHM, SMN, PLD, MNK, DRG, BRD, WAR, SCH
			FROM " . USERS_TABLE . "
			$requete01 
			$lol 
			ORDER BY username";
			echo $sql . '<br />';
		if ( !($result01 = $db->sql_query($sql, false, true)) )
		{
			message_die(GENERAL_MESSAGE, 'Fatal Error: '.mysqli_error());
		}
		
		while( $row01 = $db->sql_fetchrow($result01) )
		{
			$joblist01 .= ( $joblist01 != '' ) ? ', ' . $row01['username'] : $row01['username'];
		}
		$db->sql_freeresult($result01);
Ce qui produit le résultat suivant
SELECT user_id, username, xxxx FROM users WHERE BRD = 1 AND user_id != 2 ORDER BY username
SELECT user_id, username, xxxx FROM users WHERE (MNK = 1 OR BRD = 1) AND user_id != 10 ORDER BY username
SELECT user_id, username, xxxx FROM users WHERE DRG = 1 AND user_id != 10 ORDER BY username
SELECT user_id, username, xxxx FROM users WHERE PLD = -1 AND user_id != 10 ORDER BY username
SELECT user_id, username, xxxx FROM users WHERE PLD = 1 AND user_id != 10 ORDER BY username
SELECT user_id, username, xxxx FROM users WHERE PLD = -1 AND user_id != 10 ORDER BY username
SELECT user_id, username, xxxx FROM users WHERE PLD = 1 AND user_id != 10 ORDER BY username
SELECT user_id, username, xxxx FROM users WHERE (BLM = 1 OR WHM = 1) AND user_id != 10 ORDER BY username
En bleu, j'ai les résultats attendus. En vers j'ai qu'une moitié du résultat (il ne me parle que du user_id = 10 alors qu'il y a également le user_id = 2 qui devrait être mentionné), en rouge, c'est toutes les fois ou le else devrait intervenir, et ou je ne devrais avoir une valeur vide (j'ai mis 0 plus haut pour afficher quelque chose avec l'echo, mais je veux une valeur vide en vrai). Du coup mes requêtes me donnent un résultat faussé car dans le cas des valeurs en rouge, je ne devrais pas ajouter une condition de plus à la requête, et dans le cas du résultat en vers, il manque une condition...


Quelqu'un pourrait-il m'aider s'il vous plait ?


Merci à tous