UPDATE à multiple choix [Résolu]

Signaler
Messages postés
46
Date d'inscription
samedi 12 janvier 2008
Statut
Membre
Dernière intervention
12 décembre 2015
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
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

Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
156
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
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
    
<?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 ?]
Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
156
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
Messages postés
46
Date d'inscription
samedi 12 janvier 2008
Statut
Membre
Dernière intervention
12 décembre 2015
3
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!
Messages postés
46
Date d'inscription
samedi 12 janvier 2008
Statut
Membre
Dernière intervention
12 décembre 2015
3
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).
Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
156
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
Messages postés
46
Date d'inscription
samedi 12 janvier 2008
Statut
Membre
Dernière intervention
12 décembre 2015
3
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?
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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 ?]
Messages postés
46
Date d'inscription
samedi 12 janvier 2008
Statut
Membre
Dernière intervention
12 décembre 2015
3
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.