Fusionner 20 requetes en une seule

WRInaute impliqué
Bonjour,

je souhaite fuisionner ces 8 requetes, mais je ne trouve pas la solution. Est ce que quelqu'un peut m'aider ?

Merci d'avance

Code:
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city1.'" WHERE id=1 LIMIT 1');
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city2.'" WHERE id=2 LIMIT 1');
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city3.'" WHERE id=3 LIMIT 1');
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city4.'" WHERE id=4 LIMIT 1');
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city5.'" WHERE id=5 LIMIT 1');
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city6.'" WHERE id=6 LIMIT 1');
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city7.'" WHERE id=7 LIMIT 1');
$mysqli->query('UPDATE '.$language_settings.'_cities SET name="'.$city8.'" WHERE id=8 LIMIT 1');
 
WRInaute accro
ok, donc oublie ma première réponse

Dans ce nouveau cas tu devrais faire une boucle de 1 à n et coder la requête à l'intérieur de la boucle
 
WRInaute impliqué
J'ai pensé à ca, mais ca me fera une exécution de 20 requêtes dans tous les cas. J'aurais aimé les fusionner pour utiliser le moins de ressources possible
 
WRInaute discret
En admettant que id est une clé unique, tu peux utiliser INSERT avec ON DUPLICATE
Code:
$mysqli->query(
'UPDATE '.$language_settings.'_cities (id, name) VALUES 
(1, "'.$city1.'"),
(2, "'.$city2.'"),
(3, "'.$city3.'"),
(4, "'.$city4.'")
ON DUPLICATE KEY UPDATE 
id=VALUES(id), 
name=VALUES(name)
);
 
WRInaute impliqué
Merci pour ta réponse, j'ai mis plutot INSERT INTO, mais le soucis c'est que je me retrouve avec 20 lignes identiques.

Il y a pas possibilité de reduire tout cela ?

Code:
$mysqli->query('INSERT INTO '.$language_settings.'_cities (id, name) VALUES 
			(1, "'.$city_1.'"),
			(2, "'.$city_2.'"),
			(3, "'.$city_3.'"),
			(4, "'.$city_4.'"),
			(5, "'.$city_5.'"),
			(6, "'.$city_6.'"),
			(7, "'.$city_7.'"),
			(8, "'.$city_8.'"),
			(9, "'.$city_9.'"),
			(10, "'.$city_10.'"),
			(11, "'.$city_11.'"),
			(12, "'.$city_12.'"),
			(13, "'.$city_13.'"),
			(14, "'.$city_14.'"),
			(15, "'.$city_15.'"),
			(16, "'.$city_16.'"),
			(17, "'.$city_17.'"),
			(18, "'.$city_18.'"),
			(19, "'.$city_19.'"),
			(20, "'.$city_20.'")
			ON DUPLICATE KEY UPDATE id=VALUES(id), name=VALUES(name)');
Merci
 
WRInaute accro
Pourquoi t'as besoin de passer "id" lors d'un insert ? Parce que c'est étonnant que ce soit pas un autoincrement.
 
WRInaute impliqué
Tu voulais dire UPDATE name=VALUES(name)'); au lieu de UPDATE id=VALUES(id), name=VALUES(name)'); ?

C'est vrai que dans ce cas id n'était pas necessaire
 
WRInaute discret
sff a dit:
Merci pour ta réponse, j'ai mis plutot INSERT INTO, mais le soucis c'est que je me retrouve avec 20 lignes identiques.
Oui, désolé, c'est INSERT INTO évidemment.
Par contre je peux pas corriger mon post pour rectifier l'erreur, c'est normal ?
Je trouve pas ça terrible, si quelqu'un tombe sur le post sans lire la suite, le code n'est pas bon.

sff a dit:
Il y a pas possibilité de reduire tout cela ?
Réduire l'écriture de la requête ?
Tu peux faire un truc comme ça :
Code:
$req = array();
for($i = 1; $i <= 20; $i++){
    $req[] = '('.$i.', "'.$GLOBALS['city_'.$i].'")';
}
$mysqli->query('INSERT INTO '.$language_settings.'_cities (id, name) VALUES '.implode(',', $req).' ON DUPLICATE KEY UPDATE name=VALUES(name)');
 
WRInaute impliqué
Merci pour ton aide. Ca fonctionne parfaitement. En fait cétait relativement simple.

J'ai une question à te poser. Habituellement, j'utilise ce genre de variable pour les boucles : ${"city_$i"} au lieu de $GLOBALS['city_'.$i]. Y a t'il une réelle différence ?

Merci
 
WRInaute discret
sff a dit:
J'ai une question à te poser. Habituellement, j'utilise ce genre de variable pour les boucles : ${"city_$i"} au lieu de $GLOBALS['city_'.$i]. Y a t'il une réelle différence ?
Je ne connaissais pas la notation ${} :lol:
C'est une ancienne notation d'après ce que je trouve sur php.net, non ?
 
Discussions similaires
Haut