8791 sujets

Développement web côté serveur, CMS

Bonjour,
Ce petit moteur de recherche fonctionne bien mais il ne m'affiche que les deux premiers champs (nomcompo et oeuvre) et pas professeur.nom dans les résultats...

Merci de votre aide.

<?php require_once('Connections/cours.php'); ?>
<?php
mysql_select_db($database_cours, $cours);
//On determine l'expression a rechercher
if(isset($_GET['recherche']))
{
        $rec = $_GET['recherche'];
}
else
{
        $rec = 'chopin';
}
//On determine le type de recherche
if(isset($_GET['type']))
{
        if($_GET['type']=='un')//Un des mots
        {
                $type = 1;
        }
        elseif($_GET['type']=='tout')//Tout les mots
        {
                $type = 2;
        }
}
else
{
        $type = 2;//type par defaut: L'expression exacte
}
//On determine si on doit surligner les mots dans les resultats
if(!isset($_GET['surligner']) or $_GET['surligner']!='true')
{
        $surligner = true;
}

$req = 'SELECT cours.nomcompo, cours.oeuvre, professeurs.nom FROM cours, professeurs WHERE cours.professeurID=professeurs.id AND';
if($type==1)
{//ayant un des mots dans leurs informations
        $mots = explode(' ',$rec);//En separre lexpression en mots cles
        foreach($mots as $mot)
        {
                $req .= ' cours.oeuvre LIKE "%'.$mot.'%" OR cours.nomcompo LIKE "%'.$mot.'%" OR professeurs.nom LIKE "%'.$mot.'%" OR';
        }
        $req .= ' 1=0';
}
elseif($type==2)
{//ayant tout des mots dans leurs informations
        $mots = explode(' ',$rec);//En separre lexpression en mots cles
        foreach($mots as $mot)
        {
                $req .= ' (cours.oeuvre LIKE "%'.$mot.'%" OR cours.nomcompo LIKE "%'.$mot.'%" OR professeurs.nom LIKE "%'.$mot.'%" )  AND';
        }
        $req .= ' 1=1';
}
$req .= ' order by nomcompo asc';
$requete = mysql_query($req) or die(mysql_error());

?>


<form action="" method="get">
Expression &agrave; rechercher: <input type="text" name="recherche" value="<?php echo $rec; ?>" /><br />
Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="tout"<?php if($type==2){echo 'checked="checked"';} ?> />
 Tout les mots
 <input type="submit" value="Rechercher" />
</form>
<h2>R&eacute;sultats</h2>
<table>
        <tr>
                <th>Compositeur</th>
                <th>Oeuvre</th>
                <th>Professeur</th>
        </tr>
<?php
//On affiche les resultats
while($req = mysql_fetch_array($requete))
{
?>
        <tr>
                <td><?php echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $req['nomcompo']); ?></td>                
                <td><?php
                echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $req['oeuvre']); ?></td>
                <td><?php 
				echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $req['professeurs.nom']); ?></td>
        </tr>
<?php
}
?>
</table>

Modifié par whynote (03 Nov 2010 - 12:12)
Bonjour,
c'est normal, tu essaies d'imprimer le champs professeurID qui n'est pas appelé dans ta requête

<td><?php echo $req['cours.professeurID']; ?></td> 


tu devrais écrire:


<td><?php echo $req['cours.professeurs.nom']; ?></td> 


si je ne m'abuse.
En fait, j'avais déjà modifié ça en rajoutant même le surlignage:
<td><?php 
				echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $req['professeurs.nom']); ?></td>


Mais il ne m'affiche que les deux premiers champs
Modifié par whynote (03 Nov 2010 - 11:27)
Lorsque je teste la requete dans phpadmin ca fonctionne sans problème

Affichage des lignes 0 - 29 (368 total, Traitement en 0.0009 sec.)
SELECT cours.nomcompo, cours.oeuvre, professeurs.nom
FROM cours, professeurs
WHERE cours.professeurID = professeurs.id
En fait, même si je rajoute un autre champ de la table cours dans ma requête (à la place de professeurs.nom) il ne me l'affiche pas. Il m'affiche que deux champs...
Une solution ?
Salut,

C'est personnel, je n'aime pas utiliser les nom entiers des tables, je préfère faire des alias, et en plus pour la compréhension c'est plus pratique.


SELECT nomcompo, oeuvre, nom FROM cours AS c, professeurs AS p WHERE c.professeurID=p.id


Avec cette requête, tu devrais déjà être capable d'afficher tout ce que tu veux, et tu auras comme résultat 'nomcompo', 'oeuvre', 'nom' à la place des résultats aux nom complexes (imagine tu change le nom d'un table, il y aurait tout à vérifier !

Comme je ne suis pas sur à 200% que ça marche, si la première ne fonctionne pas tu peux essayer :


SELECT c.nomcompo AS nomcompo, c.oeuvre AS oeuvre, p.nom AS nom FROM cours AS c, professeurs AS p WHERE c.professeurID=p.id


Ca devrais sortir le même résultat.

Si cela fonctionne, il faut voir la suite de tes SQL qui doivent bloquer les résultats.

Est-ce que tu peux faire un echo d'une requête SQL entière pour que l'on puisse voir ce qu'il bloque ? (echo $req; à la fin de la fabrication de ta requête)