Page 1 sur 1

Plusieurs informations dans la clause WHERE !

Posté : 07 juil. 2012, 19:52
par YADev
Bonjour,

Dans une requête SQL, je dois mettre à jour un champ.
Dans ma clause WHERE, je dois dire "si l'ID est égal à". Rien de difficile : WHERE poll_option_id = $row['poll_option_id']

Mais il se trouve qu'il ne s'agit pas d'un seul ID, j'en récupère plusieurs (6, 78, 34, ...) et j'aimerais savoir comment faire pour exécuter cette requête en les prenant tous en compte. On peux pas faire WHERE = 6,78,43 et quand je fais une boucle while ça marche pas...
				$sql = 'SELECT poll_option_id
					FROM ' . POLL_VOTES_TABLE . "
					WHERE topic_id = '" . (int) $topic . "' AND vote_user_id = '" . (int) $supp . "'";
				$result = $db->sql_query($sql);		
								
				while ($row = $db->sql_fetchrow($result))
				{
					$sql_change = 'UPDATE ' . POLL_OPTIONS_TABLE . ' o, ' . TOPICS_TABLE . " t
						SET o.poll_option_total = o.poll_option_total -1, t.poll_last_vote = 0, t.poll_vote_change = 0
						WHERE o.topic_id = '" . (int) $topic . "' 
						AND o.poll_option_id = '" . (int) $row['poll_option_id'] . "' 
						AND t.topic_id = '" . (int) $topic . "'";	
					$result_change = $db->sql_query($sql_change);		
					$db->sql_freeresult($sql_change);	
				}
Une idée ? :(

Re: Plusieurs informations dans la clause WHERE !

Posté : 07 juil. 2012, 20:39
par Ryle
Il te faut soit utiliser des instructions OR
WHERE poll_option_id = 5 OR poll_option_id = 6 OR poll_option_id = 8 ...
Soit plus simplement utiliser un IN()
WHERE poll_option_id IN (5, 6, 8)

Re: Plusieurs informations dans la clause WHERE !

Posté : 08 juil. 2012, 12:57
par YADev
Apparement j'ai une erreur de syntaxe, car du coup pour utiliser IN je fais ça dans ma clause WHERE :
AND o.poll_option_id IN ('" . rtrim($row['poll_option_id'], ', ') . "') 
Mais via phpMyAdmin, quand je tente de rentrer la requête pure j'ai une erreur :
UPDATE phpbb_poll_options o, phpbb_topics t

						SET o.poll_option_total = o.poll_option_total -1, t.poll_last_vote = 0, t.poll_vote_change = 0
						WHERE o.poll_option_id IN (2, 3) 
						AND o.topic_id = 8
						AND t.topic_id = 8
Est-ce le fait de préciser les préfixe o et t ?

Re: Plusieurs informations dans la clause WHERE !

Posté : 08 juil. 2012, 13:00
par Adanorm
Tu as visualisé $row['poll_option_id'] ? Tu es sur qu'il est séparé par des "," ?

Re: Plusieurs informations dans la clause WHERE !

Posté : 08 juil. 2012, 14:46
par Ryle
Un update ne se fait que sur une seule table à la fois...

Et effectivement, pour la syntaxe, tu dois obtenir quelque chose de la forme " IN (3, 35, 90) "
Il n'y a pas d'apostrophes, pas de virgule toute seule, ... il faut donc adapter ton code pour obtenir ce résultat à partir des ids que tu récupères :)

Re: Plusieurs informations dans la clause WHERE !

Posté : 08 juil. 2012, 15:43
par YADev
Une à la fois ? Pourtant ça marche habituellement quand je veux faire sur 2 à la fois via les préfixes là.. Non :?:
UPDATE phpbb_poll_options o, phpbb_topics t

Re: Plusieurs informations dans la clause WHERE !

Posté : 09 juil. 2012, 20:50
par Ryle
Quand tu fais un select, tu peux effectivement interroger plusieurs tables... en revanche tu ne peux pas mettre à jour ou insérer des données dans plusieurs tables simultanément.

Re: Plusieurs informations dans la clause WHERE !

Posté : 11 juil. 2012, 15:43
par YADev
Ok, je me coucherais mon bête. :P

Ma requête est donc comme-ci :
				$sql_date = 'UPDATE ' . POLL_OPTIONS_TABLE . "
					SET poll_option_total = poll_option_total -1
					WHERE poll_option_id IN (" . implode(',', $row['poll_option_id']) . ") 
					AND topic_id = '" . (int) $topic . "'";
Soucis, $row[''] contient bien ce qu'on lui demande, quand il est seul il affiche bien une valeur, mais quand on l'entoure d'implode il devient vide et IN devient l'équivalent de IN () :| Le format utilisé est incorrect ? Sachant que la variable contient plusieurs IDs :?:

Re: Plusieurs informations dans la clause WHERE !

Posté : 12 juil. 2012, 00:11
par Ryle
Et si tu fais un print_r( $row['poll_option_id'] ); pour voir ce que contient ta variable, tu obtiens quoi ?

Sachant que tu devrais obtenir un array ( ...) s'il s'agit bien d'un tableau d'id. SI tu n'as pas un tableau, le implode ne pourra pas fonctionner...