Usage de UNION dans une requete

Fredy07
Invité n'ayant pas de compte PHPfrance

18 sept. 2009, 05:40

Bonjour,

j'utilise une pagination dans un moteur de recherche, et quand je me place vers la 2eme page, il m'affiche le message que le mot clef est vide, message que j'ai mis pour verifier qu'il y ait un mot a chercher:
$word = $_POST['word'];

if (empty($word)){
echo("<font face=verdana size=2>mot cle est vide</font><br>"); 
echo("<a href=\"javascript:history.back()\"> Retourner </a>");
}

Fredy07
Invité n'ayant pas de compte PHPfrance

18 sept. 2009, 08:08

La portion du code de la requete est:
$query1 = "select description, url, title, hits from detail Where description LIKE '%$word%'";
$query1 .= " Union ";
$query1 .= "select description, url, title_ar, hits from detail_x Where description LIKE '%$word%'";

ViPHP
ViPHP | 1136 Messages

18 sept. 2009, 21:26

Hi ,

Si j'ai bien compris ,
tu as un "moteur de recherche" , dans lequel tu précise un mot clef .

Tu valide se formulaire , tu te retrouve avec les premiers résultats , sur ta page , et les liens vers la seconde troisième ect .. page si elles existent .

Ton problème , étant que lorsque tu cliques sur l'un des liens pour changer de page , ton mot clef disparait ( il n'est plu pris en compte ).

C'est ça ?

Il faut voir comment tu gères ton multipages , comment passes tu les paramètres lorsque tu navigues de l'une à l'autre .
De plus les données POST que tu as validés au niveau de ton moteur de recherche , n'existent plus à partir du moment ou tu envoies une nouvelle requête http au navigateur ( donc dés que tu cliques sur un lien ).

Plusieurs solutions s'offrent à toi , comme garder le/les mots clef en session ou passer ses mots clef entre chaque page .

Petit NB : Fais trés attention à sécuriser ta requête de recherche , échappes tes mots clef mysql_real_escape_string() + htmlentities() si tu affiches de nouveau les mots clefs saisies , car comme elle est là , l'on peut très facilement faire du dégât via des injections SQL .

Bonne continuation
Ch.

Fredy07
Invité n'ayant pas de compte PHPfrance

19 sept. 2009, 01:59

J'ai pratique cet exemple:

Fredy07
Invité n'ayant pas de compte PHPfrance

19 sept. 2009, 02:59

Voila mon code:
<?php
session_start();

$word = $_POST['word'];

if (empty($word)){
echo("<font face=verdana size=2>the word field is empty</font><br>"); //message qui s'affiche si le visiteur n'a pas rempli ce champ
echo("<a href=\"javascript:history.back()\"> Return </a>");
}
else
{
	

$messagesParPage=5; //Nous allons afficher 5 messages par page.

//Une connexion SQL doit être ouverte avant cette ligne...
$query = "select description, url, title from details Where description LIKE '%$word%'";
$query .= " Union ";
$query .= "select description, url, title from details_x Where description LIKE '%$word%'";

$result=mysql_query($query) or die (mysql_error());
$total = mysql_num_rows($result);

$donnees=mysql_fetch_assoc($result); //On range retour sous la forme d'un tableau.
//$total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
if ($total) {
	
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);

if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
     
     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else // Sinon
{
     $pageActuelle=1; // La page actuelle est la n°1    
}

$premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire

$query1 = "select description, url, title, hits from details Where description LIKE '%$word%'";
$query1 .= " Union ";
$query1 .= "select description, url, title_ar, hits from details_x Where description LIKE '%$word%'";
$query1 .= " ORDER BY hits DESC LIMIT $premiereEntree, $messagesParPage";

$result1=mysql_query($query1) or die (mysql_error());
	
	echo '<table width="500" align="center">'; // start table
	echo '<tr bgcolor="#dadeec">';
	echo '<td>Resultats "<font color="purple"><b>'.$word.'</b></font>" : ' .$total.'</td>';
	echo '</tr>';
	
		while ($row = mysql_fetch_array($result1)) {
		
		$color = ($total % 2) ? $bgcolor1 : $bgcolor2 ;
			
		$description = $row['description'];
		$title = $row['title'];
		$url = $row['url'];

$lg_max = 400; //nombre de caractère autoriser
if (strlen($description) > $lg_max)
{
$description = substr($description, 0, $lg_max);
$last_space = strrpos($description, " ");
$description = substr($description, 0, $last_space)."...";
}

// coloriser + souligner + mettre en gras le mot recherche
$description = str_replace ($word,'<b><u><font color="#33FF00">'.$word.'</font></u></b>', $description);

?>


  <tr bgcolor="<?php echo $color; ?>">
    <td>    
	<?php
	echo '<font color="red">'.$title_ar.'</font> >>>>>> <font color="green">'.$category.'</font><br>';
	?>
	</td>
  </tr>
  <tr bgcolor="<?php echo $color; ?>">
    <td>
    <?php
    echo strip_tags($description,'<b></b><u></u><font></font>'); // on autorise les <b> et </b>
    ?>
	</td>
  </tr>
  <tr bgcolor="<?php echo $color; ?>">
    <td>
	<?php
	echo $url;
	?>
	</td>
  </tr>
<?php
$total++;
	
	echo '<tr><td><hr class="HR01"></td></tr>';
			} // end while
			echo '</table>'; // end table
			} // end if
				

else
{
	echo 'aucun  resultat';
}



echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
{
     //On va faire notre condition
     if($i==$pageActuelle) //Si il s'agit de la page actuelle...
     {
         echo ' [ '.$i.' ] '; 
     }	
     else //Sinon...
     {
          echo ' <a href="index.php?menu=Search_Check&page='.$i.'">'.$i.'</a> ';
     }
}
echo '</p>';

} // end if empty


?>

ViPHP
ViPHP | 1136 Messages

19 sept. 2009, 10:38

Dés que tu changes de page ,
 echo ' <a href="index.php?menu=Search_Check&page='.$i.'">'.$i.'</a> ';
$_POST['word'] n'héxiste plus !

C'est donc normal qu'il te dise ce que que le mot clef n'est pas remplis .

ViPHP
ViPHP | 1136 Messages

19 sept. 2009, 10:46

De plus , le tuto que tu utilises , n'est pas exactement adapté , étant donné que c'est pour faire de la pagination d'un liver d'or , il n'y a donc pas de mot clef à gérer !

Voici un autre tuto , http://www.lephpfacile.com/howto/6-comm ... age-en-php

Idem ici il n'y a pas de mot clef , mais tu peux t'en inspirer , il faut passer le mot clef en paramètre GET entre chaque page , de la même façon que la position ( page courante ) est passé en paramétre .

Good luck ,

Ch.

Fredy07
Invité n'ayant pas de compte PHPfrance

20 sept. 2009, 19:08

J'ai pas pu le faire :non:

Fredy07
Invité n'ayant pas de compte PHPfrance

20 sept. 2009, 19:15

J'ai essaye avec GET mais puisque j'utilise les pseuo frames il m'affiche page par defaut:

index.php?word=test&search=GO