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 :

Requête sql dans une fonction php [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut Requête sql dans une fonction php
    Bonjour,
    j'ai une requête qui recherche les identifiants d'auteurs enregistrés dans ma base de données, en les plaçant dans une chaîne qui débute par array(
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $resauteur2='array('; // ouvre la chaîne
    			$auteur='SELECT * FROM utilisateurs WHERE auteur>0 ';
    			$sqlauteur=mysql_query ($auteur) or die ('Erreur SQL !'.$auteur.'<br />'.mysql_error());
    			while($dataauteur = mysql_fetch_array($sqlauteur))
    			{
    				$resauteur2=$resauteur2 . $dataauteur['auteur'].','; // écrit une virgule après chaque item
    			}
    			$l=strlen($resauteur2)-1;
    			$resauteur2=substr($resauteur2,0,$l).')'; // enlève la dernière virgule et ferme la parenthèse
    Si je fais un écho echo $resauteur2; j'obtiens le bon résultat, à savoir : array(23,18,21,65,12,2,104,78,134,136,6,59,5,79,14,216,60,133,51,115)

    Je veux maintenant utiliser ce résultat pour rechercher dans ma base de données tous les articles qui ne sont pas attribués à ces auteurs-là:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $selaut='SELECT * FROM article_auteur WHERE identifiant_article="'.$id_article.'"';
    	$sqlaut=mysql_query ($selaut) or die ('Erreur SQL !'.$selaut.'<br />'.mysql_error());
    	while($dataaut = mysql_fetch_array($sqlaut))
    	{
    if(! in_array($dataaut['identifiant_auteur'],$resauteur2))
    							 {echo $resultat;}
    						}
    ça ne fonctionne pas alors que, si j'écris le même code en remplaçant ma variable $resauteur2 par sa valeur, ça marche :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $resauteur2b=array(23,18,21,65,12,2,104,78,134,136,6,59,5,79,14,216,60,133,51,115);
    $selaut='SELECT * FROM article_auteur WHERE identifiant_article="'.$id_article.'"';
    	$sqlaut=mysql_query ($selaut) or die ('Erreur SQL !'.$selaut.'<br />'.mysql_error());
    	while($dataaut = mysql_fetch_array($sqlaut))
    	{
    if(! in_array($dataaut['identifiant_auteur'],$resauteur2))
    							 {echo $resultat;}
    						}
    Je n'arrive pas à comprendre. Je serais heureuse si quelqu'un pouvait m'aider.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    tu peux réunir tes 2 requêtes sql en une seule requête.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $selaut='SELECT * FROM article_auteur WHERE identifiant_article="'.$id_article.'"
     AND identifiant_auteur NOT IN (SELECT auteur FROM utilisateurs WHERE auteur>0) ';
    	$sqlaut=mysql_query ($selaut) or die ('Erreur SQL !'.$selaut.'<br />'.mysql_error());
    	while($dataaut = mysql_fetch_array($sqlaut))
    	{
     
          //affichage 
    	}

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut Merci
    Merci d'avoir répondu à mon problème.
    je teste.

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut Merci à Armel, mais le problème persiste
    J'ai testé de différentes manières, parce que la requête fait partie d'une série de requête imbriquées. J'ai délimité la série qui m'intéresse ici. Si j'écris selon le code que vous m'avez envoyé
    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
     $liste='SELECT identifiant,titre,lienpage FROM articles2 ORDER BY identifiant DESC';
    			$sqlliste=mysql_query ($liste) or die ('Erreur SQL !'.$liste.'<br />'.mysql_error());
    			while($dataart = mysql_fetch_array($sqlliste))
    			{
    				$id_article=$dataart['identifiant']; echo $id_article.'<br />';
    				$titre=$dataart['titre'];
    				$lienpage=$dataart['lienpage'];
     
    				$mots='SELECT * FROM article_mots WHERE identifiant_article="'.$id_article.'"';
    				$sqlmots=mysql_query ($mots) or die ('Erreur SQL !'.$mots.'<br />'.mysql_error());
    				$datamot = mysql_fetch_array($sqlmots);
    				if(empty($datamot))
    				{	
     
    					$selaut2='SELECT * FROM article_auteur WHERE identifiant_article="'.$id_article.'"
     							AND identifiant_auteur NOT IN (SELECT auteur FROM utilisateurs WHERE auteur>0) ';
    							$sqlaut2=mysql_query ($selaut2) or die ('Erreur SQL !'.$selaut2.'<br />'.mysql_error());
    							$dataaut2 = mysql_fetch_array($sqlaut2);
    						if(!empty($dataaut2['identifiant']));
    							{echo '<li><a href="'.$lienpage.'">'.$titre.' (identifiant: '.$id_article.')</a></li>';}
    				}
    			}
    il m'affiche bien tous les articles qui ne sont pas liés à des mots-clé, mais ne trie pas ceux dont l'auteur ne fait pas partie de la liste.
    Par ailleurs, désolée, mais je n'ai pas compris comment activer la coloration du code???
    Merci d'avance pour votre réponse.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut j'essaie de reformuler le problème
    j'ai 3 tables: articles2, article_auteur et article_mot
    elles sont reliées entre elles par
    articles2.identifiant=article_auteur.identifiant_article=article_mot.identifiant_article
    je cherche les articles qui
    • n'ont pas de correspondance dans la table article_mot
      et qui, dans la table article_auteur correspondent à un identifiant_auteur qui ne fait pas partie d'une liste, générée par la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT auteur FROM utilisateurs WHERE auteur>0
    je dois avoir une erreur dans l'imbrication des 3 étapes. Je n'arrive pas à trouver, ça fait 3 jours que je suis dessus.
    Merci d'avance pour votre aide.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 384
    Points
    1 384
    Par défaut
    Dans le premier cas $resauteur2 est égal à une chaine de caractères. Dans le deuxième, il est égal à un tableau.
    Il faut utiliser la fonction "eval" pour que la chaine de caractères devienne véritablement un tableau.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    le fait d'enchaîner les requêtes les unes les autres posent un problème de performance car cela t'oblige pour chaque requête à retourner toutes les lignes d'une table, y compris celles qui ne sont pas pénitentes.Or dans un environnement relationnel comme mysql où les tables sont généralement reliées entre elles soient par des clés étrangères soient par des tables associatives on doit pouvoir ressortir une information présente dans plusieurs tables en faisant une ou plusieurs jointures(JOIN |LEFT JOIN...), ce qui revient à écrire une seule requête.

    je cherche les articles qui
    n'ont pas de correspondance dans la table article_mot
    et qui, dans la table article_auteur correspondent à un identifiant_auteur qui ne fait pas partie d'une liste, générée par la requête
    là aussi il est inutile de refaire une requête ça augmente la complexité de ton algorithme, il te suffit de faire une jointure externe(JOIN LEFT|RIGHT) entre la table article_auteur et la table article.
    Après tu peux nous expliquer globalement ce que souhaites faire comme fonctionnalité(en nous fournissant la structure des tes tables) on pourrai t'aider à écrire la requête qu'il te faut.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par armel18 Voir le message
    ..., y compris celles qui ne sont pas pénitentes.....
    Alleluya !
    Louons le Grand Codeur !


    N.B. Ma remarque serait-elle im...pertinente ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    je plussoie ta remarque et pourtant j'étais sincèrement convaincu d'avoir choisi le bon mot proposé par le correcteur orthographique

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut imbrication difficile
    Merci beaucoup pour vos réponses. Je suis tout à fait d'accord que ma façon de faire en imbriquant les requêtes n'est pas élégante - et pas très rapide. J'ai encore beaucoup à apprendre. J'ai essayé avec des tables jointes, mais jusqu'ici je n'ai pas réussi, car, si j'ai dit qu'il y a 3 tables imbriquées, il y en a en fait 5.
    1. une table "utilisateurs", qui contient un champ "auteur" qui est une valeur numérique
    2. cette valeur numérique correspond à l'identifiant de la table "auteurs"
    3. cette valeur se retrouve sous le nom "identifiant_auteur" dans une table liant les articles et les auteurs : "article_auteur"
    4. le champ "identifiant_article" de cette dernière table correspond au champ "identifiant" de la table "articles2"
    5. le même champ "identifiant_article" se retrouve dans la table "article_mot" reliant les articles à des mots-clé

    il y a ensuite plusieurs requêtes imbriquées:
    • une requête doit chercher dans la table "auteurs" les lignes qui correspondent aux auteurs qui ne se retrouvent pas dans la table "utilisateurs"
    • une requête doit chercher dans la table "article_auteur" les lignes qui correspondent à ces auteurs-là
    • un requête doit chercher les articles qui correspondent à ces auteurs (table "articles2")
    • et finalement une requête doit rechercher parmi ces articles que ceux qui n'ont pas de correspondance dans la table "article_mot"

    J'ai essayé par tous les bouts, je n'arrive pas au tri final: celui qui ne liste que des articles qui ne correspondent à aucun mot-clé et ne sont écrit que par des auteurs qui ne sont pas listés dans la table "utilisateurs". Si quelqu'un pouvait me donner la solution, ça serait vraiment génial. Merci d'avance

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut youppie
    grâce à l'astucieuse simplification indiquée par Armel18 (merci encore !), en la combinant deux fois avec un inner joint, ça marche :
    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
    	 $selart='SELECT a.identifiant identifiant, a.titre titre,a.lienpage lien
    		 FROM articles2 a 
    		 INNER JOIN article_auteur aa
    		 ON a.identifiant=aa.identifiant_article
    		 WHERE a.identifiant NOT IN (SELECT identifiant FROM article_mots WHERE identifiant_article=a.identifiant)
    		 AND aa.identifiant_auteur NOT IN (SELECT auteur FROM utilisateurs WHERE auteur>0)
     
    		 ORDER BY a.identifiant DESC';
    			$sqlart=mysql_query ($selart) or die ('Erreur SQL !'.$selart.'<br />'.mysql_error());
    			while($dataart = mysql_fetch_array($sqlart))
    			{
    		 		$id_article=$dataart['identifiant'];
    				$titre=$dataart['titre'];
    				$lienpage=$dataart['lienpage'];
    			  echo '<li><a href="'.$lienpage.'">'.$titre.' (identifiant: '.$id_article.')</a></li>'; 
    			}

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

Discussions similaires

  1. requête sql dans une fonction
    Par Monsieur Griboux dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/05/2013, 19h40
  2. [MySQL] Impossibilité d'utiliser une requête MySQLi dans une fonction PHP
    Par Sestifer dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 10/01/2012, 14h40
  3. [PHP 5.0] Exécuter une requête SQL dans une fonction Javascript
    Par PrinceMaster77 dans le forum Langage
    Réponses: 13
    Dernier message: 08/07/2011, 04h53
  4. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37

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