Plusieurs informations dans la clause WHERE !

YADev
Invité n'ayant pas de compte PHPfrance

07 juil. 2012, 19:52

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 ? :(

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 juil. 2012, 20:39

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)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

YADev
Invité n'ayant pas de compte PHPfrance

08 juil. 2012, 12:57

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 ?

Petit nouveau ! | 5 Messages

08 juil. 2012, 13:00

Tu as visualisé $row['poll_option_id'] ? Tu es sur qu'il est séparé par des "," ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 juil. 2012, 14:46

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

YADev
Invité n'ayant pas de compte PHPfrance

08 juil. 2012, 15:43

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 juil. 2012, 20:50

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.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

YADev
Invité n'ayant pas de compte PHPfrance

11 juil. 2012, 15:43

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 :?:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juil. 2012, 00:11

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...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...