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 :

comment faire un "SELECT à l'envers" (retrouver la clé qui correspond à telle valeur) [PDO]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut comment faire un "SELECT à l'envers" (retrouver la clé qui correspond à telle valeur)
    Bonjour à tous, je suis débutant et ai pour l'instant réussi des choses basiques avec pdo : select, update, etc.
    Dans ce que j'ai fait, j'ai toujours utilisé la manière "logique" de concevoir une bdd : "Pour l'id x, va me chercher telle valeur de telle clé".


    Là, j'aurais besoin de prendre le problème à l'envers. Ma structure (édulcorée) de base est la suivante:
    ID__pseudo__val1__val2__val3__val4
    1___pierre___4____ 1____0____0
    2___paul____2_____0____6____0

    Je voudrais qu'on me retourne - parmi val1 val2 val3 et val4 et pour un ID donné - le nom de la première clé dont la valeur est égale à 0.
    Ici, ce serait "val3" pour pierre et "val2" pour paul.

    Une idée? peut-être utiliser PDO::FETCH_KEY_PAIR et parcourir le tableau ensuite? Mais y aurait-il qqch d'encore plus "natif" ?

    L'idée derrière tout ça avec un exemple : les 4 val sont remplies > pierre supprime val2 qui se met à 0 > je voudrais que le prochain ajout dans la base soit automatiquement ici en val2 (première clé à 0).

    merci bcp!

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    En SQL simple, sans pocédures stockées ni quoi que ce soit, ça peut se faire avec des IF en une requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Renvoie false si aucune colonne n'est égale à 0
    SELECT 
        IF (val1 = 0, 'val1',
        IF (val2 = 0, 'val2', 
        IF (val3 = 0, 'val3',
        IF (val4 = 0, 'val4',false
    )))) AS colonne 
    FROM maTable
    WHERE pseudo = 'pierre';
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Merci! Je vais voir comment faire ça avec pdo.

    Parce que j'avais cherché mais je ne trouvais rien de simple. J'ai vu PDO::CUBRID, mais ça m'a l'air d'être une usine à gaz. Ou alors pdo getColumnMeta, mais c'est une fonction pas encore aboutie.

    Mais ta solution est parfaite, étant donné que je connais la structure de la base, pas la peine de s'embêter à la retrouver!

    ------------------

    Mon problème est le suivant :
    Chaque membre va remplir peu à peu ses 4 clés. A chaque clé remplie, un dossier est créé: val1 > ./1 val2> ./2 ...
    Si un membre a rempli 4 clés et qu'il décide de supprimer la 2 (par ex.), c'est là que ça bloque. Le dossier ./2 est supprimé mais laisse un trou dans la liste des fichiers.

    J'ai donc 2 options :
    *1* remplir le trou (avec un code comme le tien) à l'ajout d'une nouvelle clé (qui prendrait la place 2 dans mon exemple)
    *2* Au moment de la suppression, combler le trou. ça serait pas mal. Je n'aurais plus besoin de trouver if val1=0, if val2=0... puisque je sais laquelle vient d'être réinitialisée. Par contre, il me faut un code qui déplace toutes les clés après le "trou" et un autre qui renomme les dossiers :
    pour passer , au moment de la suppression de val2, de :
    clé >_______6___0___7___8
    dossier >___./1 _**__./3__./4
    A:
    clé >_______6___7___8___0
    dossier >___./1 _./2__./3__**

    (**= dossier supprimé)

    Je vais voir si la solution 2 est jouable aussi...

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Pour moi la solution 1 marcherait très bien et n'est pas pour autant moins propre que la deux. Windows par exemple ne déplace pas l'ensemble de ton disque dur à chaque fois que tu supprimes un fichier.

    La 2 est faisable aussi, pas de problème, mais tu vas avoir besoin d'une procédure stockée ou de créer une fonction php qui elle par contre nécessiter pas mal d'aller-retour entre ton code et ta base.

    Un exemple de ce qui pourrait se faire en php :
    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
     
    function suppression($id,$numColonne) {
     
        //Mise à jour jusqu'à la troisième colonne avec la colonne d'après
        for ($i = $numColonne; $i <= 3; $i++) {
            $colonne = "val" + $i;
            $colonneApres = "val" + $i + 1;
            $query = "UPDATE maTable SET $colonne = (SELECT $colonneApres FROM maTable WHERE id = $id) WHERE id = $id";
            // Execution de la requête (connect, query etc..)
        }
        // Mise à zéro de val4
        $query = "UDATE maTable SET val4 = 0 WHERE id = $id";   
        // Exécution etc...
    }

    Autre chose, il est impossible dans ton cas d'avoir la clef "0" (en effet, elle sera considérée comme non existante). Pour corriger cela, je te conseil plutôt d'utiliser la valeur "NULLE", c'est plus propre et plus clair.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Merci! J'étais en train de bidouiller qqch comme ça, mais c'est dur pour moi

    Alors, pour parler concrètement, mes val1 etc... sont en réalité des coordonnées de marqueurs ajoutés sur une map leaflet :
    lat1 lng1 pour le 1er marker, etc.. jusqu'à 10.

    Oui, évidemment, j'avais d'abord pensé à la *1*, car, comme tu dis, c'est lourd de tout déplacer. Mais je me suis rendu compte qu'il faudrait refaire aussi le reste de mon code. Notamment l'énumération des marqueurs pour leur affichage (A chacun est associé un popup qui va piocher dans ces fameux dossiers /1 ./2 etc...) Là, je me suis concocté une petite clé en base qui dit combien chaque membre a de marqueurs, ce qui me permet de faire ma boucle pour les afficher.

    Ce que j'étais en train de tenter quand tu a posté à la vitesse de l'éclair, mais qui ne marche 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
    //déplacement des clés et renommage des dossiers pour combler le "trou"
    if ($markerId<= 10) // si on a pas effacé le dernier marqueur possible
    {
    $clesToChange = 11 - $markerId;
    $deplacement = $bdd->prepare('UPDATE membre SET '.$lat_remplace.' = :lati_remplace, '.$lng_remplace.' = :longi_remplace WHERE id = :id');
    //français : remplace = remplacé et deplace = déplacé
     
    	while ($clesToChange >=1) // on fait 8 tours par ex. si on a supprimé le marqueur 2
    	{
    		$lat_remplace = 'lat'.$markerId;
    		$lng_remplace = 'lng'.$markerId;
    		$markerId++; // MAGIC!
    		$lat_deplace = 'lat'.$markerId;
    		$lng_deplace = 'lng'.$markerId;
    		$deplacement->execute(array( 'id' => $id, 'lati_remplace' => $lat_deplace, 'longi_remplace' => $lng_deplace ) );
    		$clesToChange--;
    	}
    }
    EDIT : c'est normal que ça marche pas, je confonds nom de la clé du remplacé et valeur de la clé!
    j'y retourne en m'inspirant de ton code

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Bon j'ai essayé mais rien y fait...

    En développant ma méthode, je pense que j'ai une mauvaise syntaxe dans le select :
    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
    if ($markerId <= 10) // si on a pas effacé le dernier marker possible
    {
    $clesToChange = 4 - $markerId;
    $deplace = $bdd->prepare('SELECT '.$lat_deplace.' = :lati_deplace, '.$lng_deplace.' = :longi_deplace FROM membre WHERE id = :id');
     //autre essai infructueux : $deplace = $bdd->prepare('SELECT lat_deplace, lng_deplace FROM membre WHERE id = :id AND lat_deplace = :lati_deplace AND lng_deplace = :longi_deplace');
    $remplace = $bdd->prepare('UPDATE membre SET '.$lat_remplace.' = :lati_remplace, '.$lng_remplace.' = :longi_remplace WHERE id = :id');
     
    	while ($clesToChange >=1) // on fait 8 tours par ex. si on a supprimé le marker 2
    	{
    		$lat_remplace = 'lat'.$markerId;
    		$lng_remplace = 'lng'.$markerId;
    		$markerId++; // MAGIC!
    		$lat_deplace = 'lat'.$markerId;
    		$lng_deplace = 'lng'.$markerId;
    		$deplace->execute(array( 'id' => $id, 'lati_deplace' => $lat_deplace, 'longi_deplace' => $lng_deplace ) );
    		while($r = $deplace->fetch(PDO::FETCH_ASSOC)) {
    			$newlat = $r[0]; // pas sur de ma technique ici, mais ne marche pas non
    			$newlng = $r[1]; // si on met en dur $newlat = 3; $newlng = 4; (valeurs au hasard pour test)
    		}
    		$remplace->execute(array( 'id' => $id, 'lati_remplace' => $newlat, 'longi_remplace' => $newlng ) );
    		$clesToChange--;
    	} 
    //on renomme les dossiers en fonction
    //...
    }

    Avec la tienne, je ne dois pas savoir exécuter ta query. Je me connecte à la base avec pdo, c'est peut-être pour ça? J'ai fait plusieurs essais (d'où les // ). Tu fais un SELECT dans un UPDATE, je ne savais pas qu'on pouvait, c'est cool! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function suppression($id,$numColonne) {
     
        //Mise à jour jusqu'à la neuvième colonne avec la colonne d'après
        for ($i = $numColonne; $i <= 9; $i++) {
            $colonne = "lat" + $i;
            $colonneApres = "lat" + $i + 1;
            $stmt = $bdd->query('UPDATE membre SET '.$colonne.' = (SELECT '.$colonneApres.' FROM membre WHERE id = '.$id.') WHERE id = '.$id.'');
             //autre essai infructueux : $query = "UPDATE membre SET $colonne = (SELECT $colonneApres FROM membre WHERE id = $id) WHERE id = $id";
    	 // $stmt = $bdd->query($query);
        }
        // Mise à zéro ...
    }
    suppression($id, $markerId);

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Y a des erreurs de ma part (j'avais pas pu le tester avant) :

    c'est "lat." et non "lat+"

    Le update ne peut marcher comme cela (on peut faire un SELECT dans un UPDATE, mais pas sur la même table qui est mise à jour) et est en fait beaucoup plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function suppression($id,$numColonne) {
     
        //Mise à jour jusqu'à la neuvième colonne avec la colonne d'après
        for ($i = $numColonne; $i <= 9; $i++) {
            $colonne = "lat" . $i;
            $colonneApres = "lat" . ($i + 1);
            $stmt = $bdd->query('UPDATE membre SET '.$colonne.' = '.$colonneApres.' WHERE id = '.$id);
    	 // $stmt = $bdd->query($query);
        }
        // Mise à zéro ...
    }
    suppression($id, $markerId);
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Yeah! après 2 jours dessus, ça commence à marcher! Merci pour ton aide.
    Ton code ne marchait pas du premier coup chez moi. Je ne veux pas trop m'avancer, mais quad tu me proposais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET '.$colonne.' = '.$colonneApres.' ...
    qui se traduit pour i=1 en N'as-tu pas fait, comme dans mon premier essai, l'amalgame entre nom de clé et valeur de la clé?
    (Excuse si je me trompe... je connais si mal les syntaxes).


    Voilà ce qui fonctionne chez moi :
    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
    for ($i = $markerId; $i <= 9; $i++) {
            $colonneLat = 'lat'.$i;
            $colonneLng = 'lng'.$i;
    		$j = $i + 1;
            $colonneLatApres = 'lat'.$j;
            $colonneLngApres = 'lng'.$j;
    		$copier = $bdd->prepare('SELECT '.$colonneLatApres.', '.$colonneLngApres.' FROM membre WHERE id = :id');
    		$copier->execute(array( 'id' => $id ) );
    		while ($donnees = $copier->fetch())
    		{	$valeurColonneLatApres = $donnees[$colonneLatApres];
    			$valeurColonneLngApres = $donnees[$colonneLngApres];	}
    		//$copier->closeCursor(); //utile?
     
    		$coller = $bdd->prepare('UPDATE membre SET '.$colonneLat.' = :lati , '.$colonneLng.' = :longi WHERE id = :id');
    		$coller->execute(array( 'id' => $id, 'lati' => $valeurColonneLatApres, 'longi' => $valeurColonneLngApres ) );
        };
    //mise à 0 de la colonne 10 qui ne peut pas rentrer dans la boucle
    $traiementLastColonne = $bdd->prepare('UPDATE membre SET lat10 = :lati , lng10 = :longi WHERE id = :id');
    $traiementLastColonne->execute(array( 'id' => $id, 'lati' => 0, 'longi' => 0 ) );
    Par contre, mystère, si je mets ça dans une fonction comme dans les codes qu'ont a mis avant et que je lance la fonction, rien ne se passe... peut-être un pb de string à la place de number dans les var qu'on passe à la fonction...

    Pour NULL, merci. J'avais essayé de mettre à NULL les coordonnées non encore définies, mais j'avais du mal à tester ça en JS ( c'est peut-être impossible d'ailleurs) et ça empêchait ma boucle de tourner (celle qui énumère les markers pour les afficher sur la carte).

    En tout cas, merci bcp. J'ai le cerveau en bouillie avec tout ça et je n'aurais jamais trouvé seul ta manière de faire simple et efficace (j'étais parti sur une boucle while avec un nombre $clesToChange qui se décrémentait... enfin bref). ça paraît évident quand on voit ton idée finale, mais c'est plus dur de la trouver!

    Donc, bon, je vais essayer de pousser la solution *2* jusqu'au bout. Il me reste le gros point de faire la même chose avec les dossiers!
    J'y go et je me permettrai de te demander ton aide précieuse si "rien ne se passe"

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Voilà, done. Merci bcp!

    Si ça peut intéresser qqn d'autre, voici le code final (épuré pour lecture facile) pour combler les trous dans les clés et dans les dossiers.

    Après mise à 0 de la clé2 et avoir effacé son dossier sur le serveur - comblons les trous :
    Pour passer de :
    clé bdd____________________________cle1_cle2_cle3_cle4
    valeur clé___________________________6___0___7____8
    dossier correspondant à chaque clé____./1 _**__./3__./4 (** = dossier supprimé)
    A:
    clé bdd____________________________cle1_cle2_cle3_cle4
    valeur clé___________________________6___7___8___0
    dossier____________________________./1 _./2__./3__** (** = plus de dossier puisque déplacement de tous les dossiers)
    FAIRE :
    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
    <?php
     
    //$id est le numéro attibué au membre dans la base
     
    //connexion à la base avec PDO
     
    //on supprime le dossier de la clé qui vient d'être remise à sa default value
    function deleteDir($path)
    {
    	//fction custom obligatoire car rmdir() ne marche pas s'il y a des fichiers dans le dossier qu'on veut effacer
        return is_file($path) ?
                @unlink($path) :
                array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
    }
    deleteDir('mon/chemin/'.$i$);
     
    //principe : si cle 2 effacée : la 3 prend la valeur de la 2, la 4 celle de la 3
    for ($i = $cleId; $i <= 3; $i++) { //Mise à jour jusqu'à la 3è colonne avec la colonne d'après
    	$colonne = 'cle'.$i;
    	$j = $i + 1;
    	$colonneApres = 'cle'.$j;
     
    	$copier = $bdd->prepare('SELECT '.$colonneApres.' FROM matable WHERE id = :id');
    	$copier->execute(array( 'id' => $id ) );
    	while ($donnees = $copier->fetch())
    		{	//while inutile ici car une seule valeur est retournée,
    		$valeurColonneApres = $donnees[$colonneApres]; // mais utile si on étend l'exemple pour modifier, 
    		}	//par ex, des paires de clé (ex: latitude1 longitude1)
    	$copier->closeCursor(); //utile?
     
    	$coller = $bdd->prepare('UPDATE matable SET '.$colonne.' = :valeur WHERE id = :id');
    	$coller->execute(array( 'id' => $id, 'valeur' => $valeurColonneApres ) );
     
    	//on renomme les autres dossiers en fonction
    	$cleIdApres = $i + 1;
    	$path = 'mon/chemin/'.$i;
    	$pathApres = $id.'/'.$cleIdApres;
    	rename ($pathApres , $path); // ex: si clé 2 effacée, renomme dossier 30/3 en 30/2 et 30/4 en 30/3  (où 30 est un id de membre)
    };
     
    //mise à 0 de la clé4 qui ne peut pas rentrer dans la boucle - pour le dossier, pas de soucis, ./5
    $traiementLastCle = $bdd->prepare('UPDATE matable SET lat10 = :lati , lng10 = :longi WHERE id = :id');
    $traiementLastCle->execute(array( 'id' => $id, 'lati' => 0, 'longi' => 0 ) );
     
    ?>

  10. #10
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Tant mieux

    Pour tes réflexions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET lat1 = lat2 ...
    N'as-tu pas fait, comme dans mon premier essai, l'amalgame entre nom de clé et valeur de la clé?
    (Excuse si je me trompe... je connais si mal les syntaxes).
    Non ce n'est pas ça le problème, ça marche très bien, je fais prendre la valeur de la colonne lat2 à la colonne lat1. Ca ne marche pas pour toi car tu utilises les requêtes préparées, il échappe avec des guillemets ce que tu lui passe en paramètre et ne comprends donc plus les noms de colonnes comme telles (qui ne peuvent être entourées de guillemets).

    Par contre, mystère, si je mets ça dans une fonction comme dans les codes qu'ont a mis avant et que je lance la fonction, rien ne se passe... peut-être un pb de string à la place de number dans les var qu'on passe à la fonction...
    Ma fonction en tout cas partait du principe que l'on prenait un int en paramètre.

    Pour NULL, merci. J'avais essayé de mettre à NULL les coordonnées non encore définies, mais j'avais du mal à tester ça en JS ( c'est peut-être impossible d'ailleurs) et ça empêchait ma boucle de tourner (celle qui énumère les markers pour les afficher sur la carte).
    Il est possible de tester un null en javascript avec :
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Merci!

    Je me disais bien que tu savais ce que tu écrivais, mais je ne savais pas pour cette histoire de guillemets avec les requêtes preparées.

    Pour la fonction, j'ai bien compris que tu entendais des INT en paramètres. Moi mes variables sont des variables de session ou post. Il faut que je vérifie si il n'y en a pas en string. Bon mais ça marche sans déclarer de fonction... bizarre

    Merci pour les 3 = pour tester NULL, j'avais pas du tenter!

    * Je voulais aussi développer l'option *1*, car elle était bien séduisante. Tu m'avais fait ce super code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Renvoie false si aucune colonne n'est égale à 0
    SELECT 
        IF (val1 = 0, 'val1',
        IF (val2 = 0, 'val2', 
        IF (val3 = 0, 'val3',
        IF (val4 = 0, 'val4',false
    )))) AS colonne 
    FROM maTable
    WHERE pseudo = 'pierre';
    Mais comme je suis une bille, je ne voyais pas bien comment le faire avec la syntaxe pdo. En fait, pas de soucis, j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $query = "
    SELECT 
        IF (lat1 = 0, 'lat1',
        IF (lat2 = 0, 'lat2', 
        IF (lat3 = 0, 'lat3',
        IF (lat4 = 0, 'lat4',false
    )))) AS colonne 
    FROM membre
    WHERE pseudo = 'vinz'";
    $req = $bdd->query($query);
    echo ($quelleColonne = $req->fetchColumn());
    Et ça roule. Je vais essayer de faire ça avec les requêtes préparées.

    Merci pour tout! Je me suis fait remonter les bretelles, car je n'avais pas encore mis 'résolu' C'est parce que je voulais aussi aller au bout de cette option *1*. Super c'est ok now!

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Pour clore cette discussion, voici le code final de la solution *1* avec requête préparée et test sur couple de clés.
    Retourne 'couple4' par exemple si les clés lat4 ET lng4 sont = à 0. Si ça aide qqn...

    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
    $query = "
    SELECT 
        IF (lat1<>lng1 = 0, 'couple1',
        IF (lat2<>lng2 = 0, 'couple2',
        IF (lat3<>lng3 = 0, 'couple3',
        IF (lat4<>lng4 = 0, 'couple4',
        IF (lat5<>lng5 = 0, 'couple5',
        IF (lat6<>lng6 = 0, 'couple6',
        IF (lat7<>lng7 = 0, 'couple7',
        IF (lat8<>lng8 = 0, 'couple8',
        IF (lat9<>lng9 = 0, 'couple9',
        IF (lat10<>lng10 = 0, 'couple10',false
    )))))))))) AS colonne 
    FROM membre
    WHERE id = :id";
    $req = $bdd->prepare($query);
    $req->bindParam(':id', $id, PDO::PARAM_INT);
    $req->execute();
    echo ($quelleColonne = $req->fetchColumn()); // donne par exemple couple4 si lat4 ET lng4 sont = à 0
    Merci bcp à Spartacusply pour son aide.

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

Discussions similaires

  1. [XL-2010] Comment faire un cells.select sans la premiere ligne ?
    Par Denis_67 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/08/2014, 13h56
  2. Comment faire pour que SELECT retourne 0 s'il est vide
    Par Chacha35 dans le forum Développement
    Réponses: 4
    Dernier message: 14/10/2009, 13h58
  3. [C#] Comment faire un simple SELECT à SQL Server ?
    Par Rodie dans le forum Accès aux données
    Réponses: 15
    Dernier message: 30/10/2006, 18h04
  4. Comment faire ma requête SELECT ?
    Par MaTHieU_ dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/07/2006, 16h23
  5. comment faire un insert, + select + update dans la meme requete
    Par jam92400 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2006, 18h33

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