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 :

appel de fonction et requete sql


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut appel de fonction et requete sql
    Bonjour,

    j'aimerai crée un tableau avec des catégories et des sous-catégories.Pour ne pas mélanger le php et le html , j'ai mis les requêtes sql dans une page à part.De cette manière c'est plus clair pour lire les lignes de code.J'arrive a afficher les titres de catégories, mais je n'arrive pas à afficher les sous catégories liées a la catégorie par l' "id" de la catégorie.

    En effet, pour afficher les sous catégories, je dois tenir compte de la boucle ("foreach") que j'ai fait pour afficher toutes les infos de la table catégories y compris l'id de la catégorie.Si je fais une appel de fonction dans laquelle j'ai mis la requête pour afficher les sous catégories.J'ai un message d'erreur. En gros il ne sait pas d'où vient " $cat['id'] ". Je ne sais pas ce que je dois mettre dans la fonction pour que l'id de la catégorie soit reconnue.Je crois que je dois mettre une boucle foreach dans la fonction "souscat()" (cette fonction est dans la page "categorie.func.php").

    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
    <?php
     
    //La fonction qui affiche les catégories du forum
    function infos_cat(){
    	global $db;
    	$categories=$db->query("SELECT * FROM categories") or die ('Erreur SQL !<br />'.mysql_error());
    	$cats=$categories->fetchAll(PDO::FETCH_ASSOC); 
    	return $cats;
    }
     
    //la fonction qui recherche les forums liés à la catégorie
    function souscat(){
    	global $db;
    }
    ?>
    categories.php
    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
    56
    <?php
     
    //appel de la fonction
    $cats=infos_cat();
    //var_dump($cats);
     
    ?>
     
    <p><a href="index.php?page=add"> Creer une discussion </a></p>
     
    <?php foreach($cats as $cat):?>
     
    <table class="table table-bordered" >
     
    	<thead>
    		<tr>
    			<th > <?php echo utf8_encode($cat['titre']);?></th>
    			<th>dernier message</th>
    		</tr>
    	</thead>
     
    	<tbody>
    	<?php 
     
    	//cette requete (ci-dessous) marche si je la met dans la boucle foreach.
    	//Mais si je la met dans une autre page categorie.func.php et que j'appelle la fonction 
    	//il ne reconnait pas l'id de la categorie (categorie_id={$cat['id']})
     
     
    	//requete pour afficher les sous titres
     
    	/*$sql="select * from forum where categorie_id={$cat['id']}";
    	$rows=$db->query($sql);
    	$forums = $rows->fetchall();*/
     
     
    	foreach($forums as $forum):?>
    			<tr>			
    				<!--titre forum-->
    				<td width="30%">
    					<a href="#"><?php //echo $forum['titre'];?></a>
    				</td>
     
    				<!--dernier topic-->
    				<td width="30%"> 
     
    				</td>
    			</tr>
    	<?php endforeach; ?>
     
    	</tbody>
     
    <!--fin table-->	
    </table>
     
    <?php endforeach; ?>
    Je suis vraiment bloque.Merci de m'aider.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne sais pas comment est organisée ta base de donnée mais le plus efficace est de lire toutes les sous-catégories et de les classer dans un tableau PHP indexé par la catégories principales.
    Les requêtes SQL dans des boucles c'est très mauvais en performance.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    merci pour le conseil

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    toujours pas de reponse

  5. #5
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Tu peux passer des paramètres à une fonction. C'est même une base de l'informatique.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //la fonction qui recherche les forums liés à la catégorie
    function souscat($id){
    	global $db;
    ... requête SQL qui utilise $id
    }

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ... dans ta page principale
    $sous_cat = souscat($cat['id']);
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    toujours pas de reponse
    Mon "conseil" était une réponse puisqu'il te débarassait de ton problème.
    C'est que tu cherches à faire est mauvais.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    le conseil éclairé du sieur sabotage est à suivre à la lettre.
    Fait une seule requête pour tout et ensuite traite les données en PHP pour le rendu.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SELECT categories.*, sous_categories.*
        FROM categories c
             LEFT JOIN sous_categories sc ON sc.id_categorie = c.id
    ORDER BY
           c.id, sc.id
    Quelque chose dans ce genre, à adapter à ta structure de base de données

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    merci d'avoir pris le temps de me répondre. j'ai trouve une solution.Il fallait mettre l id de la catégorie en paramètre de fonction, quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    souscat($id){
    ....requete sql
    }
    Dans ma page principale j'ai défini une variable $id.J'ai écrit $id=$cat['id']; Ensuite j'ai juste utilise $id dans ma requête sql.Du coup ça marche.

    Juste une question,c'est une peu ambiguë pour moi,peut on mettre un tableau($cat['id']) dans une variable?

    Sinon merci de votre aide.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Même si ma solution marche,j'aimerai utiliser la bonne methode car les requêtes dans une boucle c'est déconseillé comme le dit "sabotage".
    Mais je ne vois pas comment faire autrement.

    J'aimerai utilisé une méthode pour afficher les résultats sans passer par des boucles.Mais là je sais pas comment faire.Je vous envoie une image de ma base de données en pj (table catégorie et forum) pour que vous voyez sa structure.Dites moi si je dois réorganiser ma base de données ou pas.Au niveau code
    j'aimerai un petit exemple car c'est abstrait pour moi.
    Images attachées Images attachées   

  10. #10
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par sisi1234 Voir le message
    Bonjour,

    merci d'avoir pris le temps de me répondre. j'ai trouve une solution.Il fallait mettre l id de la catégorie en paramètre de fonction, quelquechose du genre

    souscat($id){
    ....requete sql
    }

    Dans ma page principale j'ai défini une variable $id.J'ai écrit $id=$cat['id'];Ensuite j'ai juste utilise $id dans ma requête sql.Du coup ça marche.

    Juste une question,c'est une peu ambigue pour moi,peut on mettre un tableau($cat['id']) dans une variable?

    Sinon merci de votre aide.
    C'est exactement ce que j'avais écrit message #5... Comme tu ne semblais pas savoir qu'on pouvait passer des paramètres à une fonction je n'avais pas jugé bon de te donner une solution à la @sabotage.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    essaie avec ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT categories.*, forum.*
        FROM categories c
             LEFT JOIN forum f ON f.categorie_id = c.id
    ORDER BY
           categories.titre, forum.titre_f
    La problématique des menus imbriquée a déjà été maintes et maintes fois abordée sur ce forum, je t'invite à chercher un peu et au pire tu trouveras ici un fil de discussion abordant en détail ce problème.
    On ne gère pas les menus comme un tableau mais comme une liste...

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Oui mais je ne veux pas faire des menus imbriques et je veux afficher un tableau avec des catégories et sous catégorie.Pour avoir un visuel de ce que je cherche a faire j'ai fait une capture d'écran. Le problème est que pour afficher le tableau, j ai fait deux boucles (une boucle dans une boucle) et dans chaque boucle j'ai mis une requête.Je sais que c'est pas la bonne manière.J'ai essaye en faisant une jointure mais je vois pas l'intérêt car je suis oblige de faire des boucles.Comment je peux faire sans boucles ?il faut au moins une boucle et une requête.
    Images attachées Images attachées  

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    personne n'a dit qu'il ne fallait pas de boucle.

  14. #14
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Une possibilité à partir d'une seule requête SQL. Pour les besoins de l'exemple j'ai simulé le résultat de la requête comme étant un array. Mais c'est le principe qui compte.

    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
    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
    <?php
    $array   = array();$array[] = array('forum'=>'Automobiles','SousForum'=>'De Dion Bouton','Discussion'=>'Puis je mettre du SP95 dans ma DDB de 1918 ?','id'=>5030);
    $array[] = array('forum'=>'Automobiles','SousForum'=>'Renault','Discussion'=>'Ma 4L V6','id'=>12040);
    $array[] = array('forum'=>'Automobiles','SousForum'=>'Volvo','Discussion'=>'Problème de frein','id'=>12536);
    $array[] = array('forum'=>'Automobiles','SousForum'=>'Peugeot','Discussion'=>'604 Turbo tunnée','id'=>75603);
    $array[] = array('forum'=>'Matériel','SousForum'=>'Moniteurs','Discussion'=>'Que pensez vous du LKO 256P ?','id'=>2567);
    $array[] = array('forum'=>'Matériel','SousForum'=>'Imprimantes','Discussion'=>'Problème avec une EPSON XP215','id'=>1234);
    $array[] = array('forum'=>'Matériel','SousForum'=>'Desktop','Discussion'=>'Compaq 286','id'=>890);
    $array[] = array('forum'=>'Matériel','SousForum'=>'Laptop','Discussion'=>'ASUS SeaShell PC1215','id'=>12346);
    $array[] = array('forum'=>'Programmation','SousForum'=>'PHP','Discussion'=>'Comment faire un programme PHP','id'=>500);
    $array[] = array('forum'=>'Programmation','SousForum'=>'C++','Discussion'=>'Comment faire un programme C++','id'=>1200);
    $array[] = array('forum'=>'Programmation','SousForum'=>'Delphi','Discussion'=>'Comment faire un programme Delphi','id'=>236);
    $array[] = array('forum'=>'Programmation','SousForum'=>'Python','Discussion'=>'Comment faire un programme Python','id'=>703);
    ?>
    <style type="text/css">
    <!--
    table {font-family:verdana}
    .h {background-color:red;color:white}
    .d1 {width:300px}
    .d2 {width:600px}
    -->
    </style>
    <?php
    $savForum  = "";
    reset($array);
    $subArray  = current($array);
    while ($subArray)
    {
     if ($subArray['forum'] != $savForum)
     {
      //---- Nouveau forum on ouvre un nouveau tableau
      $savForum = $subArray['forum'];?>
      <table>
       <tr class="h"><td class="d1"><?php print $subArray['forum'];?></td><td class="d2">Dernier message</td></tr><?php
     }?>
       <tr>
        <td><?php print $subArray['SousForum'];?></td>
        <td><?php print $subArray['Discussion'];?></td>
        </tr><?php
     $subArray = next($array);
     if ($subArray['forum'] != $savForum)
     { 
      //---- On change de forum donc on ferme le tableau?>
      </table>
      <br/><?php
     }
    }
    ?>

    Voici le rendu. (il y a des liens qui ne figurent pas dans le code ci-dessus car bien que j'aie décoché la conversion de liens, elle se faisait tout de même)

    Nom : Capture20170922_001.JPG
Affichages : 1707
Taille : 85,6 Ko

    Nom : Capture20170922_002.JPG
Affichages : 1588
Taille : 22,2 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    merci, je vais essayer ta méthode.

Discussions similaires

  1. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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