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 :

Y-a-til moyen de faire un INSERT sans doublon


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 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut Y-a-til moyen de faire un INSERT sans doublon
    Bonjour à tous.

    J'inser des données de cette façon:
    Code : 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
     
    $sql_insert = 'INSERT into collections(
    		id_collection,
    		collection_date,
    		gateways_id_gateway,
    		ttn_port,
    		ttn_count,
    		ttn_payload_raw,
    		ttn_m_time,
    		ttn_m_freq,
    		ttn_m_modulation,
    		ttn_m_data_rate,
    		ttn_m_coding_rate,
    		collection_created
     
    	) VALUES (
    		"",
    		"'.$da.'",
    		"'.$gateway_id.'",
    		"'.$port.'",
    		"'.$count.'",
    		"'.$payload_raw.'",
    		"'.$m_time.'",
    		"'.$m_freq.'",
    		"'.$m_modulation.'",
    		"'.$m_data_rate.'",
    		"'.$m_coding_rate.'",
    		"'.$gmdate.'"
    	)';
     
     
    	if (!$connect->query($sql_insert) )
    	{
    		printf("Erreusr : %s\n", $connect->error);
    	    exit("ERROR while intersting in collection");
    	}
    	else
    	{
    		$last_collection_id = $connect->insert_id;
    		echo "collection ".$last_collection_id." inserted<br>";
    	}
    Jusqu'à là, tout va bien.
    Sauf que si je rafraichi la page, ou imaginous que ces données sont envoyé deux fois, il va faire deux meme enregistrements.


    Il me semble que si j'utilise un UPDATE, il va mettre a jour une ligne MAIS que si cette ligne n'existe pas, il l'a créé?

    Y-aurait-il pas un moeyen de faire plus simple que de faire un SELECT avant le INSERT pour vérifier si l'entrée existe déjà?

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,

    ...Sauf que si je rafraichi la page, ...
    Dernière modification par Invité ; 07/05/2018 à 18h32.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    merci:
    J'ai toruvl ceci

    Code : 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
    	$sql_insert = 'INSERT into collections(
    		id_collection,
    		collection_date,
    		gateways_id_gateway,
    		ttn_port,
    		ttn_count,
    		ttn_payload_raw,
    		ttn_m_time,
    		ttn_m_freq,
    		ttn_m_modulation,
    		ttn_m_data_rate,
    		ttn_m_coding_rate,
    		collection_created
     
    	) VALUES (
    		"",
    		"'.$da.'",
    		"'.$gateway_id.'",
    		"'.$port.'",
    		"'.$count.'",
    		"'.$payload_raw.'",
    		"'.$m_time.'",
    		"'.$m_freq.'",
    		"'.$m_modulation.'",
    		"'.$m_data_rate.'",
    		"'.$m_coding_rate.'",
    		"'.$gmdate.'"
    	) ON DUPLICATE KEY UPDATE collection_date=VALUES("'.$da.'")';
    mais j'ai ce message d'errur:
    Erreusr : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"2018-05-07 11:20:00")' at line 28 ERROR while intersting in collection
    J'ai encore essayé ceci
    Code : 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
     
    	$sql_insert = 'INSERT into collections(
    		id_collection,
    		collection_date,
    		gateways_id_gateway,
    		ttn_port,
    		ttn_count,
    		ttn_payload_raw,
    		ttn_m_time,
    		ttn_m_freq,
    		ttn_m_modulation,
    		ttn_m_data_rate,
    		ttn_m_coding_rate,
    		collection_created
     
    	) VALUES (
    		"",
    		"'.$da.'",
    		"'.$gateway_id.'",
    		"'.$port.'",
    		"'.$count.'",
    		"'.$payload_raw.'",
    		"'.$m_time.'",
    		"'.$m_freq.'",
    		"'.$m_modulation.'",
    		"'.$m_data_rate.'",
    		"'.$m_coding_rate.'",
    		"'.$gmdate.'"
    	) ON DUPLICATE KEY UPDATE collection_date="'.$da.'"';
     
    if (!$connect->query($sql_insert) )
    	{
    		printf("Erreusr : %s\n", $connect->error);
    	    exit("ERROR while intersting in collection");
    	}
    	else
    	{
    		$last_collection_id = $connect->insert_id;
    		echo "collection ".$last_collection_id." inserted<br>";
    	}
    Mais cette dernière m'ajoute une nouvelle ligne même si les dates correspondent. Mon champs 'collection_date' est de tyoe datetime. Je me demande si le soucis vient pas des ", mais j'ai délà essayé plsieurs possiblités

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Quelle est ta clé d'unicité ? Il ne comprendra pas pareil le "on duplicate key" selon la façon dont tu as défini ce qu'est un doublon...
    Peut-être n'as tu pas défini ce qu'est un doublon ? Juste ton id auto-incrémenté ? alors il ne verra pas de doublon...

    Complète cette phrase :

    Je ne veux pas voir deux fois un enregistrement avec le même ? et le même ? et le même ?...

    Selon les tables, cela peut s'avérer une bonne idée de poser une clé d'unicité... Genre, une nomenclature, tu ne veux pas voir deux fois le même libelle... Simple !
    Mais sur des users par exemple, c'est déjà plus touffu... Tu ne veux pas voir 2 fois le même nom + le même prénom + la même date de naissance... Vraiment ? et le jour où ça arrive ? Ben, tu es coincé. donc dans ces cas-là, préférer le mail unique, car tu n'as pas le droit de demander le numéro de sécu non plus, et heureusement...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

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

    Mon champ unique (et ibcrémentiel) est id_collection, et non collaction_date.
    Collection_date est un champ de type datetime et il correcpond a la date ou la mesure a été prise. Donc il ne peut pas avoir deux date identique, sauf,... si on rafraichi deux fois la page ou le cas le plus probable, est lorsque mon micricontrolleur envoit deux fois la mesure.

    Je ne veux pas voir deux fois un enregistrement avec le même ? et le même ? et le même ?...
    Dans ce cas, le faudrait pas avoir deux entrées avec la meme date, dans le champ 'collection_date' même si id_collection n'est pas identique.

    Je pensais que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON DUPLICATE KEY UPDATE collection_date="'.$da.'"'
    allait comparer justement le camp 'collection_date' et le mettre à jour s'il existe (ou rien faire), et si le champs 'collection_date' ne contient pas la valeur de $da, il crée un nouvel enregistrement.

    Tu ne veux pas voir 2 fois le même nom
    Oui je ne veux pas avoir deux fois la même date dans collection_date et j'aimerais éviter de faire un SELECT avant un INSERT pour controler la table. (A moins que si c'est mieux de le faire ainsi)

    Ai-je répondu à ta question?

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    La bonne méthode est celle proposée par Jreaux.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. [XL-2016] Faire une liste sans doublon mais départ sans entrée
    Par Vb.pix dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/11/2017, 17h37
  2. Optimisation d'un INSERT sans doublon
    Par rg77140 dans le forum Optimisations
    Réponses: 3
    Dernier message: 03/04/2013, 12h21
  3. Insertion sans doublons
    Par franculo_caoulene dans le forum Développement
    Réponses: 2
    Dernier message: 16/09/2008, 09h59
  4. [Postgresql] insertion sans doublon
    Par Pwill dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 08/06/2005, 11h37
  5. faire un insert pour un champ blob
    Par tripper.dim dans le forum InterBase
    Réponses: 10
    Dernier message: 02/05/2003, 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