IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Mettre à jour une ligne si elle existe lors d'un INSERT


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 202
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 202
    Par défaut Mettre à jour une ligne si elle existe lors d'un INSERT
    Bonjour,

    Je souhaite faire un truc de simple. Je développe une application IOS/Android et sur une vue, elle affiche tous les capteurs disponibles pour une station.

    Pour chaque capteur, il est possible de définir un seuil minimum et maximum ainsi qu'un oprateur.. Ces valeurs sont sauvées dans une table 'thresholds'

    thresholds
    - id_threshold (int)
    - sensors_id_sensor (VAR)
    - threshold_min (INT)
    - threshold_max (INT)
    - threshold_operator (INT)

    Tous les capteurs m'ont pas forcément des valeurs de seuil. Par conséquent, il n'y pas d'enreistrement dans la table thresholds correspondant à sensors_id_sensor.

    Si maintenant, je veux enregistrer des valeurs de seuil pour le capteur 45 (sensors_id_sensors) il doit ajouter un enregistrement dans la table 'thresholds, dont le champs 'sensors_id_sensor' aura pour valeur 45.

    Mon problème est que si cette ligne avec la valeur 45 existe déjà, il ne dois pas me retourner un message d'erreur, mais la mettre à jour.

    J'ai essayé ceci en pensant que UPDATE créerait une ligne, si sensors_id_sensor n'existait pas avec une valeur de 5


    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		$sql_update = 'UPDATE thresholds SET threshold_min = '.$payload["threshold_min"].', threshold_max = '.$payload["threshold_max"].', threshold_operator = "'.$payload["threshold_operator"].'" WHERE sensors_id_sensor = 45';
    		if ($connect->query($sql_insert) === TRUE)
    	    {
    			$payload['method'] = $method;
    			$payload['response'] = 200;
    	    }
    	    else
    	    {
    			$payload['method'] = $method;
    			$payload['response'] = 500; // 500 Internal Server Error
    	    }

    J'ai constaté que ceci met bien à jour, pour autant qu'elle existe, si non rien ne se passe.

    J'ai cherché un peu plus loin et je suis arrivé à ca

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $sql_insert 'INSERT into thresholds(
    			id_threshold,
    			sensors_id_sensor,
    			threshold_min,
    			threshold_max,
    			threshold_operator
    			)
    		VALUES(
    			"",
    			'.$payload["sensors_id_sensor"].',
    			'.$payload["threshold_min"].',
    			'.$payload["threshold_max"].',
    			"'.$payload["threshold_operator"].'"
    		)ON DUPLICATE KEY UPDATE sensors_id_sensor = VALUES(sensors_id_sensor), VALUES(theshold_min), VALUES(threshold_max), VALUES(threshold_operator)';

    (J'espère ne pas trop avoir fait d'erreur de syntaxe )

    Ma question, comment être sûre que c'est la valeur 'sensors_id_sensor' uniquement qui est comparée, et non pas id_threshold, ou une autre?
    On ne peut pas ajouter une cluase WHERE comme dans UPDATE?

    Merci

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 359
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 359
    Billets dans le blog
    17
    Par défaut
    Ma question, comment être sûre que c'est la valeur 'sensors_id_sensor' uniquement qui est comparée, et non pas id_threshold, ou une autre?
    ON DUPLICATE KEY est déclenché en cas de clef primaire ou clef unique violée, cela dépend donc de la définition de ta table.
    C'est la bonne solution à adopter.

    On ne peut pas ajouter une cluase WHERE comme dans UPDATE?
    C'est inutile.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 202
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 202
    Par défaut
    Hello

    Ok, donc je ne peux pas utiliser ca alors, car ma clé primaure est id_threshold.

    Je me demande aussi pourquoi UPDATE ne me retourne pas s'il a mis a jour une ligne ou pas

    Par exemple
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $sql_update = 'UPDATE thresholds SET threshold_min = '.$payload["threshold_min"].', threshold_max = '.$payload["threshold_max"].', threshold_operator = "'.$payload["threshold_operator"].'" WHERE sensors_id_sensor = 45';
     
     
            $sql_result2 = $connect->query($sql_update);
     
    	    if($sql_result2->num_rows>0)
    	    {
    			$payload['method'] = $method;
    			$payload['response'] = 200;
    	    }
    	    else
    	    {
    			$payload['method'] = $method;
    			$payload['response'] = 500; // 500 Internal Server Error
    	    }

    Vu que 45 existe, il devrait me retourner 1.
    S'il n'existe pas, il devrait retourner 0, car il n'a rien mis à jour

    Dans l'exemple, ci-dessus, il n'aime pas du tout le $sql_result2->num_rows>0 mais si ca fonctionne avec un INSERT

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 687
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    L'instruction INSERT ON DUPLICATE KEY est spécifique au jargon MySQL, le standard SQL est l'instruction MERGE.
    Donc à voir selon votre SGBD

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 359
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 359
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Dans l'exemple, ci-dessus, il n'aime pas du tout le $sql_result2->num_rows>0 mais si ca fonctionne avec un INSERT

    Regarde plutôt affected_rows

    https://www.php.net/manual/fr/mysqli.affected-rows.php
    https://www.php.net/manual/fr/mysqli...ected-rows.php
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 463
    Par défaut
    Bonjour,

    Citation Envoyé par pierrot10 Voir le message
    Je me demande aussi pourquoi UPDATE ne me retourne pas s'il a mis a jour une ligne ou pas
    Essaye d'utiliser affected_rows à la place de num_rows.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 202
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 202
    Par défaut
    Merci beaucoup pour vos réponses.

    J'ai finallement fait simple.

    Une requete SELECT sur 'sensors_id_sensor' pour voir si le capteur a déjà un enregistrement.

    Si oui, fait un update, si non crée un enregistrement

    Avec '$result = $connect->affected_rows;' je peux voir si un enregistrement (Update ou create) a été fait ou pas

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    $sql_select = 'SELECT sensors_id_sensor FROM thresholds WHERE sensors_id_sensor='.$payload['id_sensor'];
    		$sql_result = $connect->query($sql_select);
     
    		// Check if the record exists or not
    		if($sql_result->num_rows>0)
    		{
    			// If the record exists, update it
    			$payload['action'] = 'update';
    			$sql = 'UPDATE thresholds SET threshold_min = '.$payload["threshold_min"].', threshold_max = '.$payload["threshold_max"].', threshold_operator = "'.$payload["threshold_operator"].'" WHERE sensors_id_sensor = '.$payload['id_sensor'];
     
    		}
    		else
    		{
    			// If the record does not exists, create it
    			$payload['action'] = 'insert';
    			$sql = 'INSERT into thresholds(
    				id_threshold,
    				sensors_id_sensor,
    				threshold_min,
    				threshold_max,
    				threshold_operator
    			)
    			VALUES(
    				"",
    				'.$payload["id_sensor"].',
    				'.$payload["threshold_min"].',
    				'.$payload["threshold_max"].',
    				"'.$payload["threshold_operator"].'"
    			)';
    		}
     
    		$connect->query($sql);
     
    		// Save if a record has been created or updated (0: nothing happen, 1: create/update)
     
    		$result = $connect->affected_rows;
    		$payload['affected_row'] = $result;
     
    		if($result){
    			$payload['response'] = 200;
    		}
    		else
    		{
    			$payload['response'] = 202;
    		}

    et je retourne le tout à mon application IOS/Android

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    echo json_encode($payload, JSON_NUMERIC_CHECK);

    Pour le moment ca semble bien fonctionner

Discussions similaires

  1. [XL-365] Remplacer une ligne dans une feuille si elle existe déja lors de sauvegarde.
    Par New_VBA_User dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/09/2019, 17h10
  2. Réponses: 15
    Dernier message: 06/08/2018, 10h23
  3. mettre à jour une ligne
    Par Rniamo dans le forum C
    Réponses: 16
    Dernier message: 09/12/2007, 13h50
  4. Réponses: 1
    Dernier message: 16/05/2007, 21h31
  5. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo