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 :

Requêtes sql sans écraser les données [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Requêtes sql sans écraser les données
    Bonjour tout le monde !

    Je travaille sur un script php censé alimenter ma base de données à partir d'une "datagrid" créée avec Handsontable, mais là n'est pas le soucis.

    Je voudrais que ce script ajoute à ma base de données les nouvelles données or ces dernières écrasaient les anciennes. Après de nombreuses heures passées dessus, j'ai réussi à réaliser cela sur une des tables mais je ne comprends pas pourquoi la seconde n'est pas mise à jour du tout.

    De plus, mon code n'est probablement pas optimisé mais c'est la seule solution qui m'est venue.

    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
    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
    74
    75
     
    <?php
    try {
     
        session_start();
        require_once('./lib/demo/php/functions.php');
     
        $db = getConnection();
        $idMax = $db -> query('SELECT max(ID) FROM COMPETENCES');
        $result = $idMax -> fetch();
     
     
     
        $colMap = array(
            0 => 'LIBELLE',
            1 => 'DESCRIPTION',
            2 => 'CODE'
        );
     
      if (isset($_GET['data']) && $_GET['data']) {
     
     
    	for ($r = 0, $rlen = count($_GET['data']); $r < $rlen; $r++) {
    		$rowId = $r + 1;   
     
        		for ($c = 0, $clen = count($_GET['data'][$r]); $c < $clen; $c++) {
            	if (!isset($colMap[$c])) {
              		continue;
    	}
     
     
     
            $newVal = $_GET['data'][$r][$c];
     
    	$select = $db -> prepare('SELECT ID FROM COMPETENCES WHERE ID= ?  LIMIT 1');
    	$select2 = $db -> prepare('SELECT ID FROM DESCRIPTION WHERE ID= ? LIMIT 1');
     
     
    	$select -> execute(array($rowId));
    	$select2 -> execute(array($rowId));
     
    	if ($row = $select->fetch() && $row = $select2->fetch()) {
              $query = $db->prepare('UPDATE COMPETENCES SET `' . $colMap[$c] . '` = :newVal WHERE ID = :id');
              $query2 = $db->prepare('UPDATE DESCRIPTION SET `' . $colMap[$c] . '` = :newVal2 WHERE ID = :id');
     
            } else {
              $query = $db->prepare('INSERT INTO COMPETENCES (ID, `' . $colMap[$c] . '`) VALUES(:id, :newVal)');
              $query2 = $db->prepare('INSERT INTO DESCRIPTION (ID, `' . $colMap[$c] . '`) VALUES(:id, :newVal)');
            }
            $query->bindValue(':id', $result, PDO::PARAM_INT);        
            $query2->bindValue(':id', $result, PDO::PARAM_INT);
     
            $query->bindValue(':newVal', $newVal, PDO::PARAM_STR);
            $query2->bindValue(':newVal', $newVal, PDO::PARAM_STR);
     
            $query->execute();
            $query2->execute();
     
          }
     
      }
     
    }
     
    $out = array(
        'result' => 'ok'
      );
      echo json_encode($out);
     
      closeConnection($db);
    }
    catch (PDOException $e) {
      print 'Exception : ' . $e->getMessage();
    }
    ?>
    Seule la table COMPETENCES est alimentée.

    Je sollicite donc votre aide pour m'aider à résoudre ce problème qui m'échappe totalement !
    N'hésitez pas à me demander plus de précisions, le problème n'étant peut être pas assez bien synthétisé

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Pq tu ne bind pas la requête 2 ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $query->bindValue(':id', $result, PDO::PARAM_INT);
    $query->bindValue(':newVal', $newVal, PDO::PARAM_STR);
     
     
    //Pourquoi ceci n'est pas fait ?
    $query2->bindValue(':id', $result, PDO::PARAM_INT);
    $query2->bindValue(':newVal', $newVal, PDO::PARAM_STR);

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Attention, "Injection SQL" est un terme technique spécifique en matière de sécurité informatique qui désigne une méthode d'attaque d'un site. Puisque tu es étudiant, fais attention à utiliser les bons termes :-)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses.

    Je prend note de ta remarque sur les injections SQL !

    Sinon en effet, pour les bind c'est un oubli de ma part, j'édite le premier post.
    Dorénavant plus rien n'est envoyé dans la base de données, je ne comprends toujours pas d'où pourrait venir l'erreur. Surtout que le fait de bind la requête pour la table DESCRIPTION ne devrait en aucun cas influer sur la table COMPETENCES.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row = $select->fetch() && $row = $select2->fetch()
    Je ne suis pas sur que ce code fasse ce que tu souhaites.

    Essaie en le changeant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select->fetch() && $select2->fetch()
    puisque de toutes façons tu n'utilises jamais $row.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Que je le retire ou non ne change rien, le but étant juste de vérifier l'existence ou non de données dans chacune des tables. Mais niveau optimisation c'est peut être mieux ( une variable en moins ).
    Et en écrivant ça, je me rend compte que je n'en ai pas besoin.

    J'ai modifié le script. Dorénavant, la table COMPETENCES se remplit comme je le souhaite, alors que la table DESCRIPTION presque.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    try {
     
      session_start();
      require_once('./lib/demo/php/functions.php');
     
    $db = getConnection();
    $colMap = array(
      0 => 'LIBELLE',
      1 => 'DESCRIPTION',
      2 => 'CODE'
      );
     
      if (isset($_GET['data']) && $_GET['data']) {
     
     
      for ($r = 0, $rlen = count($_GET['data']); $r < $rlen; $r++) {
     $idMax = $db -> query('SELECT max(ID) FROM COMPETENCES');
      $result = $idMax -> fetch();
     
      $idMax2 = $db -> query('SELECT max(ID) FROM DESCRIPTION');
      $result2 = $idMax2 -> fetch();
     
            for ($c = 0, $clen = count($_GET['data'][$r]); $c < $clen; $c++) {
              if (!isset($colMap[$c])) {
                  continue;
      }
     
     
     
      $newVal = $_GET['data'][$r][$c];
     
     
     
      $query = $db->prepare('INSERT INTO COMPETENCES (ID, `' . $colMap[$c] . '`) VALUES(:id, :newVal)');
      $query2 = $db->prepare('INSERT INTO DESCRIPTION (ID, `' . $colMap[$c] . '`) VALUES(:id, :newVal)');
     
     
     
            $query->bindValue(':id', $result, PDO::PARAM_INT);        
            $query2->bindValue(':id', $result2, PDO::PARAM_INT);
     
            $query->bindValue(':newVal', $newVal, PDO::PARAM_STR);
            $query2->bindValue(':newVal', $newVal, PDO::PARAM_STR);        
     
            $query->execute();
            $query2->execute();
     
     
          }
     
      }
     
    }
    $out = array(
        'result' => 'ok'
      );
      echo json_encode($out);
     
      closeConnection($db);
    }
    catch (PDOException $e) {
      print 'Exception : ' . $e->getMessage();
    }
    ?>
    Puisqu'elle possède 2 champs à remplir, je pense que $idMax2 est calculé 2 fois, car le 2ème champs s'insère à une ligne de décalage par rapport au premier. Avec 2 lignes d'enregistrement dans la grille, quatre sont créées dans la BDD.
    Sauf que $idMax2 est calculé dans le premier des deux boucles for(), ce problème ne devrait donc pas exister...
    Je ne pense également pas que ce soit une erreur de syntaxe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/04/2015, 13h27
  2. Réponses: 10
    Dernier message: 08/12/2014, 15h11
  3. [2.x] Où placer les requêtes SQL (sans utiliser d'ORM)
    Par xhion dans le forum Symfony
    Réponses: 6
    Dernier message: 20/12/2012, 09h51
  4. [MySQL] insérer sans écraser les données déjà existantes d'une table
    Par brajae85 dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 12/05/2008, 11h33
  5. Réponses: 2
    Dernier message: 16/05/2006, 10h52

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