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 :

présence d'une valeur dans plusieurs tables MySQL [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut présence d'une valeur dans plusieurs tables MySQL
    Bonjour,

    je cherche à tester la présence d'une valeur dans plusieurs tables. En fait l'idée est de faire une seule fonction plutôt que une par table. Donc une seule fonction pour tester si une valeur appartient à la table A ou à la table B, soit la fonction isFromAorB :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function isFromAorB($val):bool
    {
        $bdd=new MYPDO();
        $sql="SELECT COUNT(name) as yes_or_no  FROM `A`,`B` WHERE LOWER(name) = :val";
        $prio=$bdd->select( $sql, [':val' => mb_strtolower($val)] );
        $yes_or_no=$prio[0]['yes_or_no'];
        var_dump($yes_or_no);
     
        if ($yes_or_no) return(TRUE); else return(FALSE);
    }
    Voici l'idée du script mais comme le var_dump retourne NULL, y a une erreur, mais où ?

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut

    c'est quoi cette syntaxe ?
    arrête d'utiliser return(TRUE), préfère simplement return true;.
    D'ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($yes_or_no) return(TRUE); else return(FALSE);
    est remplaçable par return (bool)$yes_or_no;

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    c'est quoi cette syntaxe ?
    Je sais bien qu'elle pas bonne mais c'était pour montrer ce que je veux faire et qu'on me montre comment on peut faire. Pour le reste, merci.

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 526
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 526
    Par défaut
    Salut laurent,

    Essaies d'abord d'exécuter cette requête dans phpmyadmin pour t'assurer du résultat :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
    count( distinct( a.id ) ) as in_a,
    count( distinct( b.id ) ) as in_b  
    FROM `table_a` a
    inner join `table_b` b 
    on a.name=b.name and lower(a.name)=:val

    dont a.id et b.id sont les identificateurs uniques des tables a et b.

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Salut Toufik,

    j'ai essayé ta requête sur mes 2 tables (priority et status) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
    count( distinct( p.id ) ) as in_p,
    count( distinct( s.id ) ) as in_s  
    FROM `priority` p
    inner join `status` s
    on p.name=s.name and lower(p.name)='low'

    priority :
    Code sql : 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
     
     
    --
    -- Structure de la table `priority`
    --
     
    DROP TABLE IF EXISTS `priority`;
    CREATE TABLE IF NOT EXISTS `priority` (
      `id` smallint(2) NOT NULL AUTO_INCREMENT,
      `name` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    --
    -- Déchargement des données de la table `priority`
    --
     
    INSERT INTO `priority` (`id`, `name`) VALUES
    (2, 'high'),
    (0, 'low'),
    (1, 'medium');
    COMMIT;

    status :
    Code sql : 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
     
     
    --
    -- Structure de la table `status`
    --
     
    DROP TABLE IF EXISTS `status`;
    CREATE TABLE IF NOT EXISTS `status` (
      `id` smallint(3) NOT NULL AUTO_INCREMENT,
      `name` varchar(13) COLLATE utf8_bin NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    --
    -- Déchargement des données de la table `status`
    --
     
    INSERT INTO `status` (`id`, `name`) VALUES
    (0, 'assigned'),
    (1, 'cancelled'),
    (2, 'closed'),
    (3, 'in_progress'),
    (4, 'pending'),
    (5, 'resolved');
    COMMIT;
    ca donne 0 pour in_p au lieu de 1.
    Le souci est que justement name est la clé unique des 2 tables...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par laurentSc Voir le message
    ...En fait l'idée est de faire une seule fonction plutôt que une par table...
    Dès qu'il s'agit de trouver des idées de problématiques farfelues et/ou grotesques, on peut compter sur Laurent !

    • Si tu veux te compliquer la vie : BRAVO ! Tu as gagné !
    • Si tu espères un "gain de performance", c'est ridicule (négligeable)

    Ici, on part du principe que les tables A et B sont totalement indépendantes.
    Donc : pas de INNER JOIN ici, mais plutôt UNION.
    Dernière modification par Invité ; 09/02/2020 à 11h13.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Une (meilleure) solution :
    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
    <?php
    function isValInTable($val, $table):bool
    {
        global $bdd;
        $sql="SELECT COUNT(name) as total FROM `".$table."` WHERE LOWER(name) = :val";
        $prio=$bdd->select( $sql, [':val' => mb_strtolower($val)] );
        $total=$prio[0]['total'];
     
        return (bool)$total; // false si 0 (rien trouvé), true sinon
    }
    function isValInTableArray($val, $tableArr):bool
    {
    	foreach( $tableArr as $table )
    	{
    		if(isValInTable($val, $table)){ // on trouve une correspondance : true
    			return true;
    		}
    	}
    	return false; // sinon false
    }
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $val = 'machin';
    $yes_or_no = isValInTableArray($val, ['A','B']);
    Remarque :
    Il est inutile de faire une nouvelle connexion à chaque nouvelle fonction.
    On la fait une fois pour toutes en début de script $bdd=new MYPDO();, puis dans les fonctions on utilise la même : global $bdd;.

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par jreaux62 Voir le message
    Remarque :
    Il est inutile de faire une nouvelle connexion à chaque nouvelle fonction.
    On la fait une fois pour toutes en début de script $bdd=new MYPDO();, puis dans les fonctions on utilise la même : global $bdd;.
    Non, si c'est ma classe qu'il utilise, tu peux faire autant de new MYPDO() que tu veux, tu auras toujours qu'une seule et même connexion/instance de PDO

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 526
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 526
    Par défaut
    Oups laurent, je n'avais pas pris en considération que la valeur peut exister dans une table et pas l'autre, donc + la remarque de jreaux62 essaies ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select * from 
    (
        (select count(id) as result from priority where lower(name)=:val)  
        union 
        (select count(id) from `status` where lower(name)=:val) 
    ) as t

    ou bien directement et sans UNION (pour avoir deux colonnes):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT 
    (select count(id) from priority where lower(name)=:val) as inP ,
    (select count(id) from `status` where lower(name)=:val) as inS

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Oui, c'est vrai rawsrc. J'avais vu ça dans ton code mais l'avais oublié.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     public function __construct()
        {
            if (self::$pdo === null) {
                self::connect();
            }
            return self::$pdo;
        }
    J'avais déjà implémenté le conseil de jreaux62 et m'apprêtais à le remercier mais suis revenu en arrière vu que pas la peine (je viens à l'instant de te lire).
    Comme j'étais depuis hier soir sur un autre bug que je viens seulement de corriger, je vais maintenant me pencher sur le reste de la réponse de jreaux62 (et aussi sur le dernier post de toufik83).

    N'en déplaise à Jérôme, ce n'était ni pour compliquer, ni pour gagner en performance, mais pour simplifier (une seule fonction qui fait tout), sauf que ça n'a pas l'air de simplifier !

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    ...ce n'était ni pour compliquer, ni ..., ..., sauf que ça n'a pas l'air de simplifier !
    Ben non...
    Et c'est NORMAL !

    Tu gagnerais ENORMEMENT de TEMPS (et nous aussi) si tu te contentais de choses SIMPLES, SIMPLES et SIMPLES !
    Dans le code que j'ai proposé, chaque fonction effectue une/des action(s) SIMPLES.
    Bref : fais SIMPLE.

  12. #12
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Le meilleure solution de jreaux62 et la requête sans union de Toufik83 fonctionnent toutes les 2, mais vu que l'objectif de simplification n'est pas atteint (même si les fonctions de Jérôme sont simples, faire 2 fonctions est encore plus simple (pour ma petite tête)), donc je reste sur les 2 fonctions.
    Désolé de vous prendre du temps et merci.

    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
     
     
    static public function isPriority($val):bool
    {
        $bdd=new MYPDO();
        $sql="SELECT COUNT(name) as yes_or_no  FROM `Priority` WHERE LOWER(name) = :val";
        $prio=$bdd->select( $sql, [':val' => mb_strtolower($val)] );
        $yes_or_no=$prio[0]['yes_or_no'];//echo "validator 57 sql=".$sql."/prio=".$yes_or_no."/val=".$val."<br/>";
     
        return (bool)$yes_or_no;
    }
     
    static public function isStatus($val):bool
    {
        $bdd=new MYPDO();
        $sql="SELECT COUNT(name) as yes_or_no  FROM `Status` WHERE LOWER(name) = :val";
        $prio=$bdd->select( $sql, [':val' => mb_strtolower($val)] );
        $yes_or_no=$prio[0]['yes_or_no'];
     
        return (bool)$yes_or_no;
    }

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

Discussions similaires

  1. [AC-2016] Recherche d'une valeur dans plusieurs champs d'une même table
    Par fgk2000 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 06/06/2018, 20h42
  2. Vérifier présence d'une valeur dans une table
    Par yieiyiei dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 16/11/2016, 12h13
  3. Réponses: 8
    Dernier message: 19/11/2010, 10h19
  4. [SQL] Une requête dans plusieurs tables
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2005, 16h23
  5. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04

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