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 :

Passer un tableau dans IN [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut Passer un tableau dans IN
    Dans un requête je dois mettre un IN, comme dans la requête suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            $sql = "SELECT
                        SUM(heures_nbr)  AS fulltime
                       FROM heures
                            INNER JOIN dossier
                               ON dossier.id_participant = heures.id_participant
                        WHERE heures_date BETWEEN '$annee-$mois-01' AND '$annee-$mois-$jours'
                        AND heures_schema IN ($item)
                        AND dos_groupe IN ($groupe)";
    Je tente de passer ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "'Horeca-Salle','Horeca-Cuisine','Horeca-Colectivite'"
    Bien évidement cela ne fonctionne pas, puisque je passe un string complet et non pas trois string comme cela devrais être.

    Quelle solution utilisez-vous?

    Merci.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 666
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Bien évidement cela ne fonctionne pas, puisque je passe un string complet et non pas trois string comme cela devrais être.
    c'est pourtant ce qu'il faut faire
    affiche la requête complète
    qu'est ce que tu as comme message d'erreur ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Par défaut
    il faut enlever les guillements (") et les remplacer par des parenthèses non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('Horeca-Salle','Horeca-Cuisine','Horeca-Colectivite')

  4. #4
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Bonjour, voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $db->heureEftMois($annee, $i+1, $jours , "'+','-'","'$nom_groupe'");
    Voici ce que génère PHP

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT calcul_l_deux('2009-1-01','2009-1-31','+','-','Horeca-Salle') as fulltime

    l'erreur est que j'ai un argument de trop, si je concatène le '+' et le '-', je me retrouve avec un schéma inexistant.

    Ps : avec les parenthèses c'est pas mieux.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Par défaut
    Je comprend pas trop ton problème... C'est juste le + et le - ? et que représente ces caractères ?

    Et que veux tu exactement..?

  6. #6
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Désolé,

    en fait en faisant comme ceci, je passe 5 paramètres, or je ne dois en avoir que 4.

    dans le IN

    ceci est différent de cela

    et c'est bien ce dernier qui dois passer.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Par défaut
    Et pourquoi dois-tu en avoir que 4 ? Tu peux pas changer ta fonction pour qu'elle admette 5 paramètres...

    Il y a vraiment un truc qui m'échappe...

    A quoi te serve ce + et ce - ?

  8. #8
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Citation Envoyé par Borowsky Voir le message
    Et pourquoi dois-tu en avoir que 4 ? Tu peux pas changer ta fonction pour qu'elle admette 5 paramètres...
    Ca c'est bon comme réponse, le principe du IN est bien de pouvoir passer un nombre inconnu de paramètre. Je ne peux pas changer de fonction au gré de mes besoins.

    le + et le - n'ont pas d'importance, imagine plutôt que je dois passer 'riri', 'fifi' et 'loulou'

  9. #9
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 666
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Bonjour, voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $db->heureEftMois($annee, $i+1, $jours , "'+','-'","'$nom_groupe'");
    Voici ce que génère PHP

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT calcul_l_deux('2009-1-01','2009-1-31','+','-','Horeca-Salle') as fulltime
    et tu voudrais que cette méthode "heureEftMois" génère quoi ?
    une requête dans ce genre ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT calcul_l_deux('2009-1-01','2009-1-31','\'+\',\'-\'','Horeca-Salle') as fulltime

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Par défaut
    Moi je laisse tomber...

    La seule façon dont j'utilise le IN c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT champs FROM table WHERE champ1 IN ('truc','machin','bidule');
    C'est tout ce que je sais ! Bonne chance !

  11. #11
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Citation Envoyé par mathieu Voir le message
    et tu voudrais que cette méthode "heureEftMois" génère quoi ?
    une requête dans ce genre ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT calcul_l_deux('2009-1-01','2009-1-31','\'+\',\'-\'','Horeca-Salle') as fulltime
    Quelque chose dans le genre oui, mais dans ton exemple je pense que les backSlach vont rester ?

  12. #12
    mon_nom_est_personne
    Invité(e)
    Par défaut
    si je comprend bien, calcul_l_deux est une fonction mysql non ? le probleme ne viendrais pas de la ? J'entends par la, que si c'est le cas, la concatenation de string pour faire la requete ne marchera pas. Tu vas donc devoir passer par une sorte de mysql explode.
    j'ai trouver cet article http://www.slickdev.com/2008/09/15/m...ed-string-ids/ ca pourrais peut-etre t'aider.

  13. #13
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Citation Envoyé par mon_nom_est_personne Voir le message
    si je comprend bien, calcul_l_deux est une fonction mysql non ? le probleme ne viendrais pas de la ? J'entends par la, que si c'est le cas, la concatenation de string pour faire la requete ne marchera pas.
    OUI oui oui ouiiiiiiiiiiiii, le problème est cerné, je teste ce soir ce bout de code.

  14. #14
    mon_nom_est_personne
    Invité(e)
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    OUI oui oui ouiiiiiiiiiiiii, le problème est cerné, je teste ce soir ce bout de code.
    la joie de ce post et quasiment palpable

  15. #15
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Voici le fruit de mes recherches, qui je dois le dire n'aboutit toujours pas.

    Alors suivant le lien de 'mon_nom_est_personne', j'adapte la function mais elle ne retourne qu'un champs vide.

    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
     
    DELIMITER $$
     
    DROP FUNCTION IF EXISTS `pontaury`.`splitAndTranslate`$$
    CREATE DEFINER=`root`@`localhost` FUNCTION `splitAndTranslate`(str TEXT, delim VARCHAR(124)) RETURNS text CHARSET latin1
        DETERMINISTIC
    BEGIN
    	DECLARE i INT DEFAULT 0;	-- total number of delimiters
    	DECLARE ctr INT DEFAULT 0;	-- counter for the loop
    	DECLARE str_len INT;		-- string length,self explanatory
    	DECLARE out_str text DEFAULT '';	-- return string holder
    	DECLARE temp_str text DEFAULT '';	-- temporary string holder
      	DECLARE temp_val VARCHAR(255) DEFAULT '';	-- temporary string holder for query
     
    		DROP TEMPORARY TABLE IF EXISTS tmpValeurs;
    		CREATE TEMPORARY TABLE tmpValeurs
    		(
    			id_valeur int(10) NOT NULL AUTO_INCREMENT,
    			valeur varchar(255) NOT NULL DEFAULT '',
    			PRIMARY KEY (id_valeur)
     
    		);
    -- INSERT INTO tmpValeurs (valeur) VALUES ('toto');
    -- INSERT INTO tmpValeurs (valeur) VALUES ('toto');
     
    	-- get length
    	SET str_len=LENGTH(str);	
     
    	SET i = (LENGTH(str)-LENGTH(REPLACE(str, delim, '')))/LENGTH(delim) + 1;	
    		-- get total number delimeters and add 1
    		-- add 1 since total separated values are 1 more than the number of delimiters
     
    	-- start of while loop
    	WHILE(ctr<i) DO
    		-- add 1 to the counter, which will also be used to get the value of the string
    		SET ctr=ctr+1; 
     
    		-- get value separated by delimiter using ctr as the index
    		SET temp_str = REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, ctr), LENGTH(SUBSTRING_INDEX(str, delim,ctr - 1)) + 1), delim, '');
     
    		-- query real value and insert into temporary value holder, temp_str contains the exploded ID    		
    		 SELECT valeur INTO temp_val FROM tmpValeurs WHERE id_valeur=temp_str;
     
    		-- concat real value into output string separated by delimiter
        		SET out_str=CONCAT(out_str, temp_val, ',');
    	END WHILE;
    	-- end of while loop
     
    	-- trim delimiter from end of string
    	SET out_str=TRIM(TRAILING delim FROM out_str);
    	RETURN(out_str);	-- return 
     
    END$$
     
    DELIMITER ;

    J'ai trouvé une procédure qui lui fais un explode en MySQL.
    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
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `pontaury`.`explode`$$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `explode`(IN input text,IN delim VARCHAR(10))
    BEGIN
    		DECLARE foundPos tinyint UNSIGNED;
    		DECLARE tmpTxt text;
    		DECLARE delimLen tinyint UNSIGNED;
    		DECLARE element text;
     
    		DROP TEMPORARY TABLE IF EXISTS tmpValues;
    		CREATE TEMPORARY TABLE tmpValues
    		(
    			`values` text NOT NULL DEFAULT ''
    		);
     
    		SET delimLen = length(delim);
    		SET tmpTxt = input;
     
    		SET foundPos = INSTR(tmpTxt,delim);
    		WHILE foundPos <> 0 DO
    			SET element = SUBSTRING(tmpTxt, 1, foundPos-1);
    			SET tmpTxt = REPLACE(tmpTxt, CONCAT(element,delim), '');
     
    			INSERT INTO tmpValues (`values`) VALUES (element);
     
    			SET foundPos = INSTR(tmpTxt,delim);
    		END WHILE;
     
    		IF tmpTxt <> '' THEN
    			INSERT INTO tmpValues (`values`) VALUES (tmpTxt);
    		END IF;
     
    		SELECT * FROM tmpValues;
    	END$$
     
    DELIMITER ;
    Malheureusement, je n'arrive pas à faire un CALL dans un IN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUM(heures) FROM Table_Heures WHERE schemas IN (CALL explode('+,-',','))
    Ne fonctionne pas !!!

    J'ai une erreur 1064 près de CALL

  16. #16
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 666
    Par défaut
    si tu as la chaine de caractère dans une variable PHP ça sera plus rapide d'utiliser la fonction http://php.net/explode pour créer la liste en PHP

  17. #17
    mon_nom_est_personne
    Invité(e)
    Par défaut
    Salut, je compter te conseiller de mettre ca dans une variable de requete et en lisant la page a ce sujet sur les site de mysql

    l'auteur fait un truc du genre:
    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
     
    mysql> SET @c = "c1";
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> SET @s = CONCAT("SELECT ", @c, " FROM t");
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> PREPARE stmt FROM @s;
    Query OK, 0 rows affected (0.04 sec)
    Statement prepared
     
    mysql> EXECUTE stmt;
    +----+
    | c1 |
    +----+
    |  0 |
    +----+
    |  1 |
    +----+
    2 rows in set (0.00 sec)
     
    mysql> DEALLOCATE PREPARE stmt;
    Query OK, 0 rows affected (0.00 sec)
    Ca peut etre une voix aussi.

    Si j'aurais eu idee de faire un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DELIMITER ;
    SET @explode = (CALL explode('+,-',','));
    SELECT SUM(heures) FROM Table_Heures WHERE schemas IN @explode
    ou il me semble que ca marche aussi mais a verifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUM(heures) FROM Table_Heures WHERE (CALL explode('+,-',',')) AS 'explode' AND schemas IN explode

  18. #18
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Bizare, je ne reçois plus les mails de ce post !!
    @mathieu un explode PHP, me renvoie un array, ce qui n'arrange pas mon affaire, ne pas oublier que j'appelle une méthode classe qui elle même fais appelle à une fonction MySQL.

    @mon_nom_est_personne toute les idées étais bien pensée, mais aucune ne donne la résultat escompté, le passage de variable me donne une erreur de syntaxe.

    Je vais voit dans le forum MySQL, comment on pourrais transformer la procédure en fonction.

    Encore un grand merci de votre aide.

  19. #19
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 666
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    ne pas oublier que j'appelle une méthode classe qui elle même fais appelle à une fonction MySQL.
    dans ton premier message tu ne parlais pas de cette fonction MySQL donc je ne savais pas quelle était ton problème principal

  20. #20
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    J'en parlais dans le 4iéme post, mais il est vrai que quand tu as le nez dedans cela te semble évident. Désolé

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

Discussions similaires

  1. Passer un tableau dans un trigger
    Par piotrr dans le forum jQuery
    Réponses: 3
    Dernier message: 11/01/2010, 09h48
  2. Passer un tableau dans un lien
    Par Giantrick dans le forum Langage
    Réponses: 9
    Dernier message: 18/05/2009, 01h32
  3. [AJAX] passer un tableau dans xhr.send() ?
    Par beegees dans le forum AJAX
    Réponses: 10
    Dernier message: 23/03/2009, 14h39
  4. Réponses: 1
    Dernier message: 28/12/2006, 17h02
  5. [Tableaux] Passer un tableau dans une requête HTTP ??
    Par haffouff dans le forum Langage
    Réponses: 2
    Dernier message: 09/05/2006, 17h17

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