UPDATE à multiple choix

Résolu
Rom1sab Messages postés 46 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 12 décembre 2015 - 25 mai 2013 à 06:52
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 5 août 2013 à 12:51
Bonjour,
voici mon code actuel:
mysql_query("UPDATE salles SET j1='0' WHERE j1 LIKE '$pseudo'") or die("erreur update");
mysql_query("UPDATE salles SET j2='0' WHERE j2 LIKE '$pseudo'") or die("erreur update");
mysql_query("UPDATE salles SET j3='0' WHERE j3 LIKE '$pseudo'") or die("erreur update");
mysql_query("UPDATE salles SET j4='0' WHERE j4 LIKE '$pseudo'") or die("erreur update");

sachant que la valeur de $pseudo ne peut être que dans un seul champ d'une seule entrée, il y a t-il un moyen de faire une seule requête comprenant les 4 possibilités?
Cela uniquement dans le but de rendre l’exécution PHP et MySQL moins lourde.

9 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
25 mai 2013 à 18:23
Bonjour,

As-tu essayé :
mysql_query("UPDATE salles SET j1='0' WHERE j1 LIKE '$pseudo';
UPDATE salles SET j2='0' WHERE j2 LIKE '$pseudo';
UPDATE salles SET j3='0' WHERE j3 LIKE '$pseudo';
UPDATE salles SET j4='0' WHERE j4 LIKE '$pseudo';") or die("erreur update"); 

?

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
1
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
Modifié par f0xi le 5/08/2013 à 12:57
    
<?php
/* cette fonction permet de créer la requête SQL pour mettre à Zero un ou plusieurs champs J dans la table SALLE 
  attention : MYSQL est déprécié pour MYSQLI, vois son fonctionnement pour mettre à jours tes scripts PHP qui ne seront plus acceptés par PHP 5.5.
*/

function clearRoom((string) $pseudo){
  /* echapements des caractères spéciaux du pseudo,
     la variable peut restée $pseudo car Locale et non globale,
    pas d'interférence avec $pseudo globale */  
  $pseudo = mysql_real_escape_string($pseudo);

  /* on retourne la requête, qui n'est qu'une seule requête ! pas quatres ! n'oublie pas de vérouiller la valeur '0' pour que personne ne l'utilise comme pseudo */
    return "UPDATE salles SET ".
    " j1=IF(j1 LIKE '$peudo', '0', j1),".
    " j2=IF(j2 LIKE '$peudo', '0', j2),".
    " j3=IF(j3 LIKE '$peudo', '0', j3),".
    " j4=IF(j4 LIKE '$peudo', '0', j4)";
    }
?> 


le requete que tu recherche est bien celle que je donne, avec l'utilisation de la fonction IF de MYSQL qui est parfaite pour faire cela.

UPDATE /*table*/
SET /*champ*/=IF(/*condition booléenne*/, /*si vrai*/, /*si faux*/)


________________________________________________________
[ besoin de câbles audio, vidèo, informatique pas cher ?]
1
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
25 mai 2013 à 14:27
Bonjour,

Tu peux toujours en faire une procédure stockée, comme cela, tes requêtes seront optimisées par MySQL.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Rom1sab Messages postés 46 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 12 décembre 2015 3
25 mai 2013 à 14:51
Je vient de lire la définition d'une procédure stockée, non merci.
j'aime faire des projets qui marchent en copier-coller (et la je ne suis pas sur d'avoir compris, peut être que c'est le programme PHP qui stockent la procédure en BDD?).
Quoi qu'il en soit j'ai l'impression que cela ne raccourci pas vraiment le tout.
Merci quand même, cela n'est pas une critique.

Ce que je recherche serait plutôt du style:
mysql_query("UPDATE salles SET j1='0' OR j2='0' OR j3='0' OR j4='0' WHERE j1 OR j2 OR j3 OR j4 LIKE '$pseudo'") or die("erreur update");
mais que les quatre champs n’interfèrent pas entre eux, je veut un "ou exclusif" et selectif.
Je ne suis pas sur que cela existe, mais des-fois la puissance des possibilités informatiques m'étonne!
0

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

Posez votre question
Rom1sab Messages postés 46 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 12 décembre 2015 3
25 mai 2013 à 23:34
En effet c'est tout bête et c'est déjà plus court, en une seule requête.
Merci
PS: Le compteur de visite de ton site ne marche pas (et j'habite à 2 kilomètres de ton lieu de travail).
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
26 mai 2013 à 00:28
Bonjour,

Merci pour le retour concernant le compteur, je pense que mon hébergeur a raté l'enregistrement de l'info et l'a corrompu.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Rom1sab Messages postés 46 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 12 décembre 2015 3
3 août 2013 à 03:44
Me revoilà sur le sujet car...
je me suis remis sur mon jeu et il se trouve que l'UPDATE ne marchait plus, et sans message d'erreur.
Ayant tout vérifié, je me suis creusé la tête, rien à faire, alors j'ai remis le code en quatre requêtes mysql pour voir, et tout fonctionne!
Une idée sur cette bizarrerie?
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
Modifié par f0xi le 4/08/2013 à 00:40
Essaye plutôt ceci :

<?php
function clearRoom((string) $pseudo){
  $pseudo = mysql_real_escape_string($pseudo);
  return "UPDATE salles SET ".
         " j1=IF(j1 LIKE '$peudo', NULL, j1),". 
         " j2=IF(j2 LIKE '$peudo', NULL, j2),".
         " j3=IF(j3 LIKE '$peudo', NULL, j3),".
         " j4=IF(j4 LIKE '$peudo', NULL, j4)";
} 
?>


a utiliser comme suis :

<?php
mysql_query( clearRoom('lucy') );
mysql_query( clearRoom('paul') );
?>


ou encore :

<?php
$queries = array();

foreach($players as $k => $v){
  if( $v['disconnected'] ){
    array_push($queries, clearRoom( $v['player_name'] )); 
  }
}

if(!empty($queries)){
  $queries = implode(";", $queries);
  mysql_query($queries);
}
?>


et avec ClearRoom qui prend plusieurs Pseudo :

<?php
function clearRoom(){
  $a = func_get_args();
  $l = func_num_args();
  if($l >= 1 && $l <= 4){
    foreach($a as $k => &$v){
      $v = htmlentities($v);
    }
    $q = "UPDATE testj SET ";
    $q.= " j1=IF(j1 LIKE '".implode("' OR j1 LIKE '", $a)."', NULL, j1),";
    $q.= " j2=IF(j2 LIKE '".implode("' OR j2 LIKE '", $a)."', NULL, j2),";
    $q.= " j3=IF(j3 LIKE '".implode("' OR j3 LIKE '", $a)."', NULL, j3),";
    $q.= " j4=IF(j4 LIKE '".implode("' OR j4 LIKE '", $a)."', NULL, j4)";
    
    return $q;
  } else {
    return false;
  }
}          


$my = new mysqli("127.0.0.1", "root", "", "testj");
if($my->connect_errno){
  echo $my->connect_error;
} else {

  $query = clearRoom('marty');
  if($query){         
    echo '<p>', $query, '<br/>', ($my->query($query) ? "OK" : "ERREUR"), '</p>';
  }
  $query = clearRoom('lucy', 'paul');
  if($query){         
    echo '<p>', $query, '<br/>', ($my->query($query) ? "OK" : "ERREUR"), '</p>';
  }
  $query = clearRoom('raymond', 'pierre', 'goldorack');
  if($query){         
    echo '<p>', $query, '<br/>', ($my->query($query) ? "OK" : "ERREUR"), '</p>';
  }
  $query = clearRoom('jack', 'fred', 'marc', 'astride');
  if($query){         
    echo '<p>', $query, '<br/>', ($my->query($query) ? "OK" : "ERREUR"), '</p>';
  }
 
  $my->close(); 
}
?>


________________________________________________________
[ besoin de câbles audio, vidèo, informatique pas cher ?]
0
Rom1sab Messages postés 46 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 12 décembre 2015 3
4 août 2013 à 18:52
Bon,
je vais marquer comme résolu car je pense que ce que je voudrait n'existe pas (quelques chose de léger autant en écriture qu'en exécution).
Oui je suis difficile, et je te remercie f0xi d'avoir écrit un véritable programme juste pour mon poste, tu semble être très engagé dans l'entre-aide :) .
Tes exemples sont tous trop longs à mon goût, et si je voulait prendre le premier (outre le manque de s à pseudo), je ne comprends pas vraiment son fonctionnement, en supposant que tu est remplacé mon 0 par NULL (ce qui est différent, j'ai beau être noob je le sais ^^)., et que je renomme ta variable $pseudo car j'en est déjà une qui me sert et qui doit garder la même valeur.
0
Rejoignez-nous