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

Langage PHP Discussion :

Aide SQL insert


Sujet :

Langage PHP

  1. #21
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2017
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    OK donc celui :

    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
    <?php
    if(isset($_POST['Import'])) {
     
    	$bdd = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '');
     
        if($_FILES['file']['error'] === 0)
        {
    		$file = fopen($_FILES["file"]["tmp_name"], "r");
    		fgetcsv($file, 767, ";");
    		$sth = $bdd->prepare('INSERT INTO conge (nom_dusage) values (:prenom_insert) ON DUPLICATE KEY UPDATE SET prenom = CONCAT(prenom, "\n", :prenom_update)');
    		while (($getData = fgetcsv($file, 767, ";")) !== FALSE)
    		{
    			$sth->execute(array(':prenom_insert'=>$getData[0], ':prenom_update'=>$getData[0]));
    		}
    		fclose($file); 
    	}
    }
    ?>
    Mais j'aimerais vraiment des explications parce que lors que je l’exécute rien ne se passe et rien n'est envoyer dans ma bdd.

  2. #22
    Invité
    Invité(e)
    Par défaut
    @sabotage,

    Dans ton code,
    • "ON DUPLICATE KEY" fonctionne sur le "nom_dusage" ;
      or, d'après ce que je comprends, il faut vérifier que nom_dusage, prenom et date de naissance sont identiques pour faire l'UPDATE.
    • et il faut que nom_dusage soit en clé unique ;
      or, plusieurs personnes peuvent avoir le même nom !


    Par contre, ce qu'on peut/doit faire :
    • lire le fichier ligne par ligne
    • pour chaque ligne, requete SELECT en Bdd avec les nom_dusage, prenom et date de naissance (de cette ligne du fichier)
    • si pas de correspondance (nombre de résultats = 0) : INSERT
    • sinon : UPDATE


    Pour peu qu'on prépare les requêtes avant (en dehors de la boucle), ça devrait optimiser le bazar...

  3. #23
    Invité
    Invité(e)
    Par défaut
    Un truc comme ça (?) :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    <?php
    if(isset($_POST['Import'])) {
     
    	$bdd = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '');
     
    	// on prepare les requetes
    	// 1- SELECT
    	$req_select = "SELECT id FROM conge 
    			WHERE nom_dusage = :nom_dusage 
    			AND prenom = :prenom 
    			AND date_naissance = :date_naissance";
    	$sth_select = $bdd->prepare($req_select);
    	// 2- INSERT
    	$req_insert = "INSERT INTO conge 
    			(nom_dusage, 
    			prenom, 
    			date_naissance
    			// .......... (et tous les autres champs nécessaires).....
    			) values (
    			:nom_dusage, 
    			:prenom, 
    			:date_naissance
    			// .......... (et tous les autres champs nécessaires).....
    			) "; 
    	$sth_insert = $bdd->prepare($req_insert);
    	// 3- UPDATE
    	$req_update = "UPDATE conge SET 
    			nom_dusage = :nom_dusage, 
    			prenom = :prenom, 
    			date_naissance = :date_naissance 
    			// .......... (et tous les autres champs nécessaires).....
    			WHERE id = :id "; 
    	$sth_update = $bdd->prepare($req_update);
     
        if($_FILES['file']['error'] === 0)
        {
    		$file = fopen($_FILES["file"]["tmp_name"], "r");
    		fgetcsv($file, 767, ";");
     
    		while (($getData = fgetcsv($file, 767, ";")) !== FALSE)
    		{
    			// 1- on cherche une correspondance (meme nom/prenom/date de naissance)
    			$sth_select->execute(array(
    				':nom_dusage' => $getData[0], 
    				':prenom' => $getData[1],
    				':date_naissance' => $getData[2]
    				));
    			$nombre_result = $sth_select->rowCount();
    			if( $nombre_result = 0 )
    			{
    				// 2/ pas de correspondance : on INSERT
    				$sth_insert->execute(array(
    					':nom_dusage' => $getData[0], 
    					':prenom' => $getData[1],
    					':date_naissance' => $getData[2]
    					// .......... (et tous les autres champs nécessaires).....
    					));
    			} else {
    				// 3/ on a une correspondance : on UPDATE
    				$row = $sth_select->fetch();
    				$sth_update->execute(array(
    					':nom_dusage' => $getData[0], 
    					':prenom' => $getData[1],
    					':date_naissance' => $getData[2],
    					// .......... (et tous les autres champs nécessaires).....
    					':id' => $row['id'],
    					));
    			}
    		}
    		fclose($file); 
    	}
    }
    ?>

    remarque : pour la requête UPDATE, on peut très bien se passer d'updater les nom/prenom/date de naissance, puisque on sait que ce sont les mêmes.
    Dernière modification par Invité ; 22/06/2017 à 18h31.

  4. #24
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    or, d'après ce que je comprends, il faut vérifier que nom_dusage, prenom et date de naissance sont identiques pour faire l'UPDATE.
    Oui mais cette info est arrivée après mon code. Le code du premier message ne comparait que le "nom".
    Il suffit comme j'ai dit de faire une clef UNIQUE sur les 3 colonnes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #25
    Invité
    Invité(e)
    Par défaut
    ...une clef UNIQUE sur les 3 colonnes...
    On sait faire ça ? (j'ai des lacunes en SQL...)

    Alors OK : je vote pour le code de sabotage
    Dernière modification par Invité ; 22/06/2017 à 18h31.

  6. #26
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2017
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    Moi aussi j'aimerais bien voir comment faire avec ce code car depuis ce matin je trouve pas :/

    Nom : Capture20.PNG
Affichages : 94
Taille : 37,4 Ko

    De plus les trois colonnes sont bien en clef unique ...

  7. #27
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans Phpmyadmin :
    - Index
    - Créer un index sur < 3 > colonnes
    - Executer
    - Nom de l'index : UNIQUE
    - Type de l'index : UNIQUE
    - Colonnes : mettre les 3 colonnes
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #28
    Invité
    Invité(e)
    Par défaut
    OK.
    Je viens de tester : ça fonctionne très bien !

    On peut traduire ça par une requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    --
    -- Index pour la table `conge`
    --
    ALTER TABLE `conge`
      ADD UNIQUE KEY `nom_unique` (`nom_dusage`,`prenom`,`date_naissance`);

    (ça pourra me servir à l'avenir)

  9. #29
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2017
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    Moi aussi je vient de tester et les trois clefs unique sont créer

    Il ne me reste plus que le code.

  10. #30
    Invité
    Invité(e)
    Par défaut
    Tu n'as pas compris.

    Il n'y a qu'UNE clé unique, qui regroupe 3 champs.

    Voir mon code precedent.

  11. #31
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2017
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    JE vient d'exécuter votre code sql dans la parti sql ^^ je pense que c'est OK , nan?

  12. #32
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, et comme on te le répète depuis le début :

    • reprends/adapte le code PHP de sabotage

  13. #33
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2017
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    C'est ce que j'ai fait mais lorsque je l’exécute rien ne se passe ...

    J'ai vraiment l'impression que je vais jamais y arrivé

  14. #34
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Sauf que tu ne nous as jamais montré ce code.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  15. #35
    Invité
    Invité(e)
    Par défaut
    C'est sûr qu'en répétant "rien ne se passe", ça fait bien avancer le schmilblick...

    Commence par activer les erreurs PDO, et utilise try catch :

    Généralement, on mets ce code dans un fichier externe _connexxion.php (par exemple), qu'on appelle ensuite avec require dans la page :
    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
    <?php
    // ------------------------
    // connexion à la Base de Données
    try {
    	// chaine de connexion (DSN)
    	$pdo_extraParams = array(
    		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,		// rapport d'erreurs sous forme d'exceptions
    		PDO::ATTR_PERSISTENT => true, 						// Connexions persistantes
    		PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"	// encodage UTF-8
    		);
    	// Instancie la connexion
    	$pdo = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '', $pdo_extraParams);
    }
    catch(PDOException $e){ die 'ERREUR PDO dans ' . $e->getFile().' L.' . $e->getLine().' : ' . $e->getMessage(); }
    // ------------------------

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    require('_connexxion.php');
    ....

    Et pour la requête elle-même :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	try {
    		$sth->execute(..........................); // à adapter...
    	}
    	catch(PDOException $e){ die 'ERREUR PDO dans ' . $e->getFile().' L.' . $e->getLine().' : ' . $e->getMessage(); }

  16. #36
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2017
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    <!> WARNING risque de brulure visuel <!>

    Vous devez me prendre pour un idiot .................................................... mais pour moi c'est le néant actuellement...

    Je ne comprend strictement rien ici :
    ON DUPLICATE KEY UPDATE SET prenom = CONCAT(prenom, "\n", :prenom_update)';
    Voila où je bloque :

    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
     
    <?php
    if(isset($_POST['Import'])) {
     
      $bdd = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '');
     
      if($_FILES['file']['error'] === 0)
      {
        $file = fopen($_FILES["file"]["tmp_name"], "r");
        fgetcsv($file, 767, ";");
        $sth = $bdd->prepare('INSERT INTO conge (nom_dusage,prenom,nom_famille,date_naissance,categorie,grade) values (:nom_dusage_insert,:prenom_insert,:nom_famille_insert,:date_naissance_insert,:categorie_insert,:grade_insert) ON DUPLICATE KEY UPDATE SET (prenom, "\n", :prenom_update)';
     
     
          while (($getData = fgetcsv($file, 767, ";")) !== FALSE)
          {
            $sth->execute(array(':nom_dusage_insert'=>$getData[0], ':prenom_insert'=>$getData[1],':nom_famille_insert'=>$getData[2],':date_naissance_insert'=>$getData[3],':categorie_insert'=>$getData[4],':grade_insert'=>$getData[5], ':nom_dusage_update'=>$getData[0], ':prenom_update'=>$getData[1],':nom_famille_update'=>$getData[2],':date_naissance_update'=>$getData[3],':categorie_update'=>$getData[4],':grade_update'=>$getData[5]));
          }
          fclose($file); 
        }
      }
      ?>

  17. #37
    Invité
    Invité(e)
    Par défaut
    Je ne comprend strictement rien...
    1/ As-tu au moins eu la CURIOSITE de faire une RECHERCHE , histoire de COMPRENDRE ??

    Tiens, on fait ENCORE le boulot à ta place : ON DUPLICATE KEY
    Et c'est écrit en français. Donc, pas d'excuse...


    2/ Et tu nous remets ton VIEUX CODE !!!!


    Un peu de sérieux...
    Ou confie le travail à un professionnel.
    Dernière modification par Invité ; 23/06/2017 à 15h32.

  18. #38
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2017
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    Bon je pense abandonner car je vois que sa vous énerves et c'est dommage d'en arrivé là !

    Je vais donc voir sur d'autres forum merci quand même à vous deux.

    Pour le coup de la clef unique avec le nom, prénom et date de naissance sa ma pas mal aider et donc j’avance pas mal maintenant. Je te remercie énormément pour sa Sabotage !

    Il ne me reste plus que la condition qui modifie

    Bref le sujet n'est pas résolue mais finir sur de mauvaises ondes n'est point mon but

  19. #39
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    La seule chose agaçante c'est qu'on t'écrit en entier le code, et que tu ne l'utilises pas.
    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
    <?php
    if(isset($_POST['Import'])) {
     
      $pdo_extraParams = array(
    		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,		// rapport d'erreurs sous forme d'exceptions
    		PDO::ATTR_PERSISTENT => true, 						// Connexions persistantes
    		PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"	// encodage UTF-8
    		);
    	// Instancie la connexion
       $pdo = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '', $pdo_extraParams);
     
      if($_FILES['file']['error'] === 0)
      {
       echo '<p>fichier reçu</p>';
        $file = fopen($_FILES["file"]["tmp_name"], "r");
        fgetcsv($file, 767, ";");
        $sth = $bdd->prepare('INSERT INTO conge (nom_dusage,prenom,nom_famille,date_naissance,categorie,grade) values (:nom_dusage_insert,:prenom_insert,:nom_famille_insert,:date_naissance_insert,:categorie_insert,:grade_insert) ON DUPLICATE KEY UPDATE SET (prenom, "\n", :prenom_update)';
     
     
          while (($getData = fgetcsv($file, 767, ";")) !== FALSE)
               echo '<p>ligne : '  . $getData . '</p>';
          {
            $result = $sth->execute(array(':nom_dusage_insert'=>$getData[0], ':prenom_insert'=>$getData[1],':nom_famille_insert'=>$getData[2],':date_naissance_insert'=>$getData[3],':categorie_insert'=>$getData[4],':grade_insert'=>$getData[5], ':nom_dusage_update'=>$getData[0], ':prenom_update'=>$getData[1],':nom_famille_update'=>$getData[2],':date_naissance_update'=>$getData[3],':categorie_update'=>$getData[4],':grade_update'=>$getData[5]));
             if ($result) { echo '<p>insertion OK</p>'; }
          }
          fclose($file); 
        }
      }
      ?>
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Syntaxe tableaux dans ordre SQL INSERT
    Par lio33 dans le forum SQL
    Réponses: 6
    Dernier message: 19/10/2005, 18h07
  2. Réponses: 2
    Dernier message: 30/09/2005, 16h41
  3. Multiplier les And dans Sql Insert Into
    Par samlepiratepaddy dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 23/09/2005, 22h55
  4. Réponses: 4
    Dernier message: 30/01/2005, 15h23
  5. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 12h38

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