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 :

Double vérification Mysql dans 2 tables + formulaire


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut Double vérification Mysql dans 2 tables + formulaire
    Bonjour,

    J'ai actuellement un formulaire php de scanning de barcode qui doit faire ceci :
    1. Si code existe déjà dans table2 > message d'erreur "le code existe déjà" > ça fonctionne.
    2. Si code existe pas > insertion en base dans table 2 MAIS en reprenant des datas d'une autre table (une fiche produit) > ça fonctionne.

    Mon code fonctionne... mais j'ai un phénomène bizarre.
    Si je tape n'importe quoi au lieu d'un code barre, en fait si je tape un code qui n'existe dans aucunes des deux tables style 1234
    ou 111111 ou n'importe quels chiffres qui ne sont pas présents en base
    mon script m'envoie quand même à l'insert, fait comme si il insérait et je n'ai rien d'ajouté en base.
    Jusque ici tant mieux, comme ça je n'ai pas de trucs à la con dans ma base.

    Cependant, j'aimerai que si j'insère n'importe quoi, il check bien que ce n'importe quoi existe dans ma base dans les table1 et table2
    et si il n'existe pas qu'il me dise "tu as tapé n'importe quoi ou ce code est incorrect" .
    Actuellement, comme il passe au travers, il m'affiche mon html "ok bien enregistré" alors qu'il fait rien au final
    et les utilisateurs pensent avoir bien scanné.
    Tant que je prends des datas existantes dans ma table1 tout fonctionne.

    Mon code :
    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
    <?php
     
    //Connections
     
    try {
        $handler = new PDO('mysql:host=localhost:3307;dbname=base_barcode','login', 'password');
        $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e){
        exit($e->getMessage());
    }
     
    $codebar = isset($_GET['barcode']) ? $_GET['barcode'] : NULL;
     
    //Verification 
     
    if(!isset($error)){
    //no error
    $sthandler = $handler->prepare("SELECT * FROM table2 WHERE quantity = 0 AND table2_Barcod=:barcode");
    $sthandler->bindParam(':barcode', $codebar);
    $sthandler->execute();
    if($sthandler->rowCount() > 0 ){
        echo "<center><span style=background:#FFFFFF><font color=red><b>!! Code déjà scanné !!</b></font></span><br />";
    	header("Refresh: 3; URL=indexphp");
    } else {
        //insert into database
        $sql = 'insert into table2 (table2_Barcod, table2_Qty, table2_datetime, table2_process, table2_user, table2_zone)
    SELECT distinct table1_Barcod, table1_Qty, now(), "C", "data1", "data2"
    from table1
    where table1_Barcod = :barcode';
        $query = $handler->prepare($sql);
        $query->execute(array(':barcode' => $codebar));
    	echo "<center><FONT SIZE=4 FACE=Arial><b><font color='red'>enregistrement en base...</font></font></center>";
    	echo "<center><FONT SIZE=20 FACE=Arial><b><font color='green'>OK</font></font></center>";
    	echo "<center><FONT SIZE=2 FACE=Arial><b>Redirection en cours...</font></center>";
    	header("Refresh: 3; URL=index.php");
    	    }
    }else{
        echo "erreur d'insertion, réessayez ".$error;
        exit();
    }
    ?>

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Bonjour,
    déjà je vois une indentation incohérente dans ton code, donc peut-être que les enchaînements de if / else ne sont pas ceux que tu crois. Utilise ton éditeur / IDE (ou un service en ligne, par exemple PHPBeautifier) pour réindenter ton code.

    Ensuite il y a cette variable $error qui n’est jamais définie, mais c’est peut-être dans un bout de code que tu n’as pas montré.

    Enfin, sache que tu peux aussi utiliser rowCount pour compter le nombre d’insertions faites par ta requête INSERT. Si c’est 0, bingo, tu peux dire à l’utilisatrice ou l’utilisateur que le code barre n’existe pas.

    C’est un peu hors sujet mais fais attention à ton code HTML, il est obsolète. Au lieu d’utiliser des balises de présentation (notamment <center> et <font>), tu devrais utiliser des styles CSS.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Bonjour,
    déjà je vois une indentation incohérente dans ton code, donc peut-être que les enchaînements de if / else ne sont pas ceux que tu crois. Utilise ton éditeur / IDE (ou un service en ligne, par exemple PHPBeautifier) pour réindenter ton code.

    Ensuite il y a cette variable $error qui n’est jamais définie, mais c’est peut-être dans un bout de code que tu n’as pas montré.

    Enfin, sache que tu peux aussi utiliser rowCount pour compter le nombre d’insertions faites par ta requête INSERT. Si c’est 0, bingo, tu peux dire à l’utilisatrice ou l’utilisateur que le code barre n’existe pas.

    C’est un peu hors sujet mais fais attention à ton code HTML, il est obsolète. Au lieu d’utiliser des balises de présentation (notamment <center> et <font>), tu devrais utiliser des styles CSS.
    Merci à toi.

    J'ai corrigé les idents mais c'est pas ça qui bloque on dirait.
    Je pense ne pas avoir la bonne "méthode" en tête...
    Je fais déjà un rowcount à la première requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sthandler = $handler->prepare("SELECT * FROM table2 WHERE quantity = 0 AND table2_Barcod=:barcode");
    $sthandler->bindParam(':barcode', $codebar);
    $sthandler->execute();
    if($sthandler->rowCount() > 0 ){
    Dans l'odre, il faudrait que j'arrive à faire ça :
    1. Vérifier dans la table2 si mon barcode existe
    > s'il existe > message "ce code existe déjà"
    > s'il existe pas > étape 2
    2. Vérifier dans la table 1 cette fois si ce code existe
    > s'il existe > je fais mon insert dans la table2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = 'insert into table2 (table2_Barcod, table2_Qty, table2_datetime, table2_process, table2_user, table2_zone)
    SELECT distinct table1_Barcod, table1_Qty, now(), "C", "data1", "data2"
    from table1
    where table1_Barcod = :barcode';
    > s'il existe pas > ce code est inexistant, vérifiez svp et retour page précédente.

    Dans mon code complet, si le code barre n'existe pas dans les deux tables, il passe à l'étape insert quand même
    MAIS n'insère rien du tout en base de données...

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Ta requête INSERT ... SELECT fait déjà la vérification sur la table 1. Si le SELECT ne renvoie rien, il y aura zéro INSERT. Et tu peux utiliser rowCount à cet endroit pour savoir s’il y a eu insertion ou pas, autrement dit si le SELECT a trouvé une entrée dans la table 1 ou pas.

    Si tu n’es pas à l’aise avec le fonctionnement de INSERT ... SELECT, je te conseille de décomposer ta requête :
    1. d’abord tu fais le SELECT sur la table 1,
    2. là tu peux tester si le code existe ou pas et l’indiquer à l’utilisateur,
    3. ensuite, si tout va bien, tu fais l’INSERT dans la table 2.


    Note : la doc de rowCount indique que son usage est déconseillé pour les requêtes SELECT. Il vaut mieux faire un SELECT COUNT(*) et lire le résultat comme d’habitude avec un fetch.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 17
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Ta requête INSERT ... SELECT fait déjà la vérification sur la table 1. Si le SELECT ne renvoie rien, il y aura zéro INSERT. Et tu peux utiliser rowCount à cet endroit pour savoir s’il y a eu insertion ou pas, autrement dit si le SELECT a trouvé une entrée dans la table 1 ou pas.

    Si tu n’es pas à l’aise avec le fonctionnement de INSERT ... SELECT, je te conseille de décomposer ta requête :
    1. d’abord tu fais le SELECT sur la table 1,
    2. là tu peux tester si le code existe ou pas et l’indiquer à l’utilisateur,
    3. ensuite, si tout va bien, tu fais l’INSERT dans la table 2.


    Note : la doc de rowCount indique que son usage est déconseillé pour les requêtes SELECT. Il vaut mieux faire un SELECT COUNT(*) et lire le résultat comme d’habitude avec un fetch.
    Merci, je comprends le principe mais la je nage dans le code... au plus je bosse dedans, au moins ça marche lol
    Je vais continuer à fouiller, quitte à faire un formulaire GET ou je récupère le code dans l'URL pour ensuite l'injecter via l'insert
    Avec un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Refresh: 2; URL=formulaire.php?barcode=$codebar");

Discussions similaires

  1. [MySQL] Comment afficher le résultat d'une données mysql dans une table html ?
    Par Alexandrebox dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/03/2010, 22h44
  2. Valeur si … dans 1 table/formulaire
    Par MaryR dans le forum IHM
    Réponses: 4
    Dernier message: 28/11/2008, 00h57
  3. Réponses: 2
    Dernier message: 17/06/2008, 20h55
  4. [MySQL] Requete MySQL dans plusieurs tables
    Par Luverger dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 23/08/2007, 17h20
  5. Utiliser une table MySQL dans un menu deroulant de formulaire
    Par darkfazer dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 17/10/2006, 23h16

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