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 :

Comparaison avec PDO [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 33
    Par défaut Comparaison avec PDO
    Bonjour,

    Je ne suis pas certain de devoir poster cela ici ou dans la section PDO...

    Je cherche à "contrôler" une insertion dans la base de donnée -> J'ai une table compétence_personnel dans laquelle j'insert l'id_Personnel, l'id_Competence, le niveau, et si le salarié en question est en formation ou non. Jusque là ok. - Le soucis c'est que j'aimerais qu'il ne soit pas possible d'insérer une deuxième fois la même compétence pour le même salarié. Exemple : J'insert l'id_Personnel 119, que j'associe à l'id_Competence 19, je refais la même manipulation, c'est-à-dire je ré-insert les mêmes données sauf que je souhaite retourner une erreur du style "compétence déjà acquise / pas possible". Je bloque à ce niveau, j'ai testé plusieurs choses différentes.

    l'id_Competence ($idComp), et l'id_Personnel($idSal1) sont "générés" dans un input type="hidden" avec de l'ajax. Apparemment quand je var_dump($request['id_Competence']) et var_dump($request['Personnel']) ça me retourne "null".

    Mon code atm :

    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
     
     
    if(isset($_POST['idSal1']) && isset($_POST['titreComp']) && isset($_POST['niveau']) && isset($_POST['formation']) && isset($_POST['nomSal']) && isset($_POST['idComp'])) {
     
        $idSal1 = htmlspecialchars($_POST['idSal1']);
        $idComp = htmlspecialchars($_POST['idComp']);
        $niveau = htmlspecialchars($_POST['niveau']);
        $formation = htmlspecialchars($_POST['formation']);
        $test = false;
        $maRequete = $db->query("SELECT * FROM competence_personnel WHERE id_Personnel = '".$idSal1."'");
     
        if(!empty($_POST['idSal1']) && !empty($_POST['idComp']) && $_POST['niveau'] != "" && $_POST['formation'] != "" ) {
     
            while($request = $maRequete->fetch() && $test == false) {
     
                if($request['id_Competence'] != $idComp && $request['id_Personnel'] != $idSal1) {
                    var_dump($request['id_Competence']);
                    var_dump($idComp);
                    $test = true;
                    echo '4';
                }
            }
     
            if($test == true) {
     
                $insert = $db->prepare('INSERT INTO competence_personnel (id_Personnel, id_Competence, niveau, formation) 
                                            VALUES(:id_Personnel, :id_Competence, :niveau, :formation)');
                $insert->execute(array(
                    'id_Personnel'=>$idSal1,
                    'id_Competence'=>$idComp,
                    'niveau'=>$niveau,
                    'formation'=>$formation
                    ));
                echo "<script>alert(\"Vos données ont été enregistrées\")</script>";   
            }
     
            else {
     
                echo "<script>alert(\"Compétence déjà acquise\")</script>";    
            }
        }
     
        else {
     
            echo "<script>alert(\"Le formulaire n'est pas complet\")</script>";    
        }
    }
     
     
    ?>
    Si quelqu'un a une idée pour me mettre sur la voie :-)

    Merci!

  2. #2
    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
    Il faut que tu conçoive tes traitement avec plus de simplicité
    - tu cherches un couple personnel/competence alors pourquoi tu ne mets que personnel dans ta requête SELECT ?
    - htmlspecialchars, comme son nom l'indique, traite de HTML, pas d'insertion dans une base de données
    - il faut uniformiser tes nommages : pourquoi "id_Personnel" devient "idSal1" quand on est dans le formulaire

    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
    <?php
    if (isset($_POST['idSal1'], $_POST['titreComp'], $_POST['niveau'], $_POST['formation'], $_POST['nomSal'], $_POST['idComp'])) {
     
        $sth = $db->prepare("SELECT COUNT(*) FROM competence_personnel WHERE id_Personnel = :id_Personnel AND id_Competence = :id_Competence");
    	$sth->execute(array(':id_Personnel'=>$_POST['idSal1'], ':idCompetence'=>$_POST['idComp']));
    	$row = $sth->fetch(PDO::FETCH_NUM);
    	if ($row[0] === 0) {
    		$insert = $db->prepare('INSERT INTO competence_personnel (id_Personnel, id_Competence, niveau, formation) 
                                   VALUES(:id_Personnel, :id_Competence, :niveau, :formation)');
    		$insert->execute(array(
                    'id_Personnel'=>$_POST['idSal1'],
                    'id_Competence'=>$_POST['idComp'],
                    'niveau'=>$_POST['niveau'],
                    'formation'=>$_POST['formation']
                    ));
                echo "<script>alert(\"Vos données ont été enregistrées\")</script>";   
    	} 
    	else {
     
    		echo "<script>alert(\"Compétence déjà acquise\")</script>";    
    	}
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 33
    Par défaut
    Hello,

    merci d'avoir pris le temps de répondre, j'ai essayé ton code et ça m'a donné l'erreur :
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number:", manquait juste un "_" à idCompetence dans l'execute();
    Tu peux m'expliquer le if($row[0] === 0) ? ça marche seulement si je change par if($row[0] == 0)

    Merci :-)

    Edit : Grâce à ton code j'ai remarqué plusieurs mauvaises habitudes, comme la répétition des isset(), etc, pareil pour les remarques. Merci ça m'évitera de répéter les mêmes erreurs :-)

  4. #4
    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
    === est une comparaison valeur et type au lieu de valeur seule
    Si ça ne marche pas c'est qu'a priori ton pilote renvoit "0" au lieu de 0.

    J'ai oublié une précision : ta table doit contenir un index "UNIQUE" avec les deux colonnes id_Personnel et id_Competence. Ainsi il sera techniquement impossible d'avoir des doublons.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 33
    Par défaut
    Ah oui, je viens de le faire, du coup la condition devient "inutile" si on veut, :-)

  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 requete renverra une erreur c'est pas très joli.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

Discussions similaires

  1. [PDO] requête sql avec PDO impossible
    Par HALOMOTO dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/03/2009, 00h17
  2. Comparaison avec BSTR
    Par Sarkou dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 17/11/2006, 15h38
  3. [Oracle] type date: comparaison avec l'année en cours
    Par zchallal dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/06/2006, 07h39
  4. comparaison avec strcmp
    Par je®ome dans le forum C
    Réponses: 9
    Dernier message: 23/05/2006, 18h09
  5. comparaison avec substring
    Par tidan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2005, 17h13

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