Programmer une fonction basique en AJAX

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


xperienss
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 227
Inscription: Sam Jan 01, 2005 15:55

Message le Mar Déc 12, 2006 1:35

Bonjour,

Voici ma version


Page du forum avec le titre a entrer :
Code: Tout sélectionner
<script type="text/javascript">
function file(fichier){
   if(window.XMLHttpRequest) // FIREFOX
   xhr_object = new XMLHttpRequest();
   else if(window.ActiveXObject) // IE
   xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
   else
   return(false);
   xhr_object.open("GET", fichier, false);
   xhr_object.send(null);
   if(xhr_object.readyState == 4) return(xhr_object.responseText);
   else return(false);
}
// Get base url
url = document.location.href;
xend = url.lastIndexOf("/") + 1;
var base_url = url.substring(0, xend);
var ajax_get_error = false;
function ajax_do (url) {
   // Does URL begin with http?
   if (url.substring(0, 4) != 'http') {
      url = base_url + url;
   }
   // Create new JS element
   var jsel = document.createElement('SCRIPT');
   jsel.type = 'text/javascript';
   jsel.src = url;
   // Append JS element (therefore executing the 'AJAX' call)
   document.body.appendChild (jsel);
       return true;
}
function ajax_get (url, el) {
   // Has element been passed as object or id-string?
   if (typeof(el) == 'string') {
      el = document.getElementById(el);
   }
   // Valid el?
   if (el == null) { return false; }
   // Does URL begin with http?
   if (url.substring(0, 4) != 'http') {
      url = base_url + url;
   }
   // Create getfile URL
   getfile_url = base_url + 'ajaxgetfile.php?url=' + escape(url) + '&el=' + escape(el.id);
   // Do Ajax
   ajax_do (getfile_url);
   return true;
}
//VERIFiCATION DU TITRE
function verifTopicTitle(){
   var TopicTitle = document.getElementById('TopicTitleId').value;

   if(TopicTitle.length<3){ // SI TROP COURT
      document.getElementById('TopicTitlebox').innerHTML = '<font style="color:#cc0000"><img src="http://www.mon-site.com/images/no.gif" alt="" /> <b>'+TopicTitle +' :<\/b> votre titre est trop court<\/font><br/><br/>';
   
   }else if(TopicTitle.length>70){ // SI TROP LONG
      document.getElementById('TopicTitlebox').innerHTML = '<font style="color:#cc0000"><img src="http://www.mon-site.com/images/no.gif" alt="" /> <b>'+TopicTitle +' :<\/b> votre titre est trop long<\/font><br/><br/>';

   }else{
     url = 'topictitle.php?topictitle=' + escape(TopicTitle);
     ajax_get (url, 'TopicTitlebox');
   }
}
</script>

<font class="maj bold size12 fpostlink">Titre de votre sujet</font><br/>
<input type='text' size='60' maxlength='70' name='TopicTitle' id='TopicTitleId' value='{$data[TITLE]}' tabindex='1' class='forminput'  onBlur="verifTopicTitle();" /><br/>
<br/>
<div id="TopicTitlebox"></div>





fichier ajaxgetfile.php
Code: Tout sélectionner
<?php
// Get URL and div
if (!isset($_GET['url'])) { die(); } else { $url = $_GET['url']; }
if (!isset($_GET['el'])) { die(); } else { $el = $_GET['el']; }
// Make sure url starts with http
if (substr($url, 0, 4) != 'http') {
        // Set error
        echo 'alert(\'Security error; incorrect URL!\');';
        die();
}
// Try and get contents
$data = @file_get_contents($url);
if ($data === false) {
        // Set error
        echo 'alert(\'Unable to retrieve "' . $url . '"\');';
        die();
}
// Escape data
$data = str_replace("'", "\'", $data);
$data = str_replace('"', "'+String.fromCharCode(34)+'", $data);
$data = str_replace ("\r\n", '\n', $data);
$data = str_replace ("\r", '\n', $data);
$data = str_replace ("\n", '\n', $data);
?>
el = document.getElementById('<?php echo $el; ?>');
el.innerHTML = '<?php echo $data; ?>';



fichier topictitle.php
Code: Tout sélectionner
<?php
include "../conf.php";
header("Content-type: text/html; charset=ISO-8859-1");


function epure_mots_cles($tableau) {
  $liste_mots = file("../stopwords.txt"); // fichier avec mot courant
  if (!$liste_mots){
   die("Impossible d'ouvrir le fichier stopwords.txt !<br>\n");
  }
  if (!count($liste_mots)) { //Aucun mot clé non pertinent.
   return $tableau;
  }
  foreach ($tableau as $mot) {
   $ajouter = true;
   foreach ($liste_mots as $pas_interessant) {
     if (trim($pas_interessant) == $mot) {
   $ajouter = false;
   break;
     }
   }
   if ($ajouter) {
     $epures[] = $mot;
   }
  }
  return $epures;
}

function convertit_regexp($mot) {
  $mot = ereg_replace("ë","e",$mot);
  $mot = ereg_replace("é","e",$mot);
  $mot = ereg_replace("è","e",$mot);
  $mot = ereg_replace("ê","e",$mot);
  $mot = ereg_replace("ç","c",$mot);
  $mot = ereg_replace("ô","o",$mot);
  $mot = ereg_replace("ö","o",$mot);
  $mot = ereg_replace("ù","u",$mot);
  $mot = ereg_replace("û","u",$mot);
  $mot = ereg_replace("â","a",$mot);
  $mot = ereg_replace("à","a",$mot);
  $mot = ereg_replace("ï","i",$mot);
  $mot = ereg_replace("î","i",$mot);
  return addslashes($mot);
}


$topictitle = $_GET['topictitle'];//on recupère le titre en GET via AJAX
$mots_cles = split(" ", $topictitle);//on explose la chaine des mots de recherche
$mots_cles_clean = epure_mots_cles($mots_cles);//on compare les mots de recherche avec la liste des mots interdits du fichier txt

for ($i = 0; $i < count($mots_cles_clean); $i++) {
   $mots_cles_clean[$i] = convertit_regexp($mots_cles_clean[$i]);//on converti les caractères spéciaux et accents
   $requete = "SELECT tid,title,MATCH (title)
            AGAINST ('%".$mots_cles_clean[$i]."%') AS score
            FROM ibf_topics
            WHERE MATCH (title)
            AGAINST ('%".$mots_cles_clean[$i]."%')
            AND state='open'";
            //AND posts >= '1'";
}

$resultatnombre_reponse = mysql_query($requete);
$nombre_reponse = mysql_num_rows($resultatnombre_reponse);//nombre de réponses

if($nombre_reponse > 1){ //si resultat on affiche la div
   $affichage = "<div style='border-top:2px solid #cc0000;border-bottom:2px solid #cc0000;border-left:1px dotted #cc0000;border-right:1px dotted #cc0000;padding-top:2px;padding-bottom:2px;padding-left:5px;padding-right:5px;color:#cc0000'>
   Attention, des sujets similaires ont déjà été postés sur le forum.<br\/>
   Merci de bien vouloir vérifier que votre question n'a pas déjà été traitée dans un des sujets suivants :<br\/>
   <ul class='assis'>";
   
   $requete .= " LIMIT 0,10";//limite d'affichage
   
   $resultatrecherche = mysql_query($requete);
   
   while($lignerecherche = mysql_fetch_array($resultatrecherche)){
      $title = stripslashes($lignerecherche['title']);

      $affichage .= "<li><a href='http:\/\/www.mon-site.com\/forum\/index.php?showtopic=".$lignerecherche['tid']."' target='_blank'>".$title."<\/a><\/li>";
   }
   $affichage .= "<\/ul><\/div><br/><br/>";
   
   die ($affichage);
}
?>



Cela fonctionne parfaitement bien.


Juste ma requete pour comparer le titre et ceux de la base qui ne me satisfait pas.
Si qq1 a une idée de ce qui cloche dans ma requete...
Merci

Xp.
Dernière édition par xperienss le Mar Déc 12, 2006 21:58, édité 1 fois.


Patrice A.
Modérateur
Modérateur
 
Messages: 2413
Inscription: Ven Fév 11, 2005 19:36

Message le Mar Déc 12, 2006 15:46

where match ... against...
sert à quoi ? C'est quoi ton objectif en ajoutant ça ?
moi j'ai un
, match.. against... ressemblance WHERE ressemblance > ...

c'est plus propre.


xperienss
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 227
Inscription: Sam Jan 01, 2005 15:55

Message le Mar Déc 12, 2006 18:25

Dj_Apx a écrit:where match ... against...
sert à quoi ? C'est quoi ton objectif en ajoutant ça ?
moi j'ai un
, match.. against... ressemblance WHERE ressemblance > ...

c'est plus propre.


C'est justement ma question sur ma requete dont je ne suis pas sûr...
comment l'écrirais tu ? (si c'est pas trop demandé?)

Xp :D

Edit:
J'oubliais, pour voir le résultat de mon script :
-http://www.compta-online.com/forum/index.php?act=Post&CODE=00&f=38
Essayez de taper par exemple un titre de sujet "comptable" puis de cliquer hors du champ du <input>...

jeroen
WRInaute accro
WRInaute accro
 
Messages: 2384
Inscription: Ven Aoû 30, 2002 13:35

Message le Mar Déc 12, 2006 19:45

Voilà ma contribution :wink:

formulaire
Code: Tout sélectionner
<!-- Appel des fonctions JS -->
<script type="text/javascript" src="ajax.js"></script>

<!-- Formulaire champ text appelle  -->
<input type="text" name="head" id="head" onblur="loadData();">

<!-- Zone pour l'affichage des résultats connexes -->
<div id="sujets_connexes"></div>


ajax.js
Code: Tout sélectionner
function loadData()
   {
   if (document.getElementById('head').value.length > 2)
      {
      sendData('head='+ escape(document.getElementById('head').value), 'search_ajax.php');
      }
   else
      {
      document.getElementById('sujets_connexes').innerHTML = '';
      }
   }

function sendData(data, page)
   {
   if(window.ActiveXObject)
      {
      //Internet Explorer
      var XhrObj = new ActiveXObject("Microsoft.XMLHTTP") ;
      }
    else
          {
      var XhrObj = new XMLHttpRequest();
      }
   
   //définition de l'endroit d'affichage:
   var content = document.getElementById("sujets_connexes");
   
   //Ouverture du fichier en methode POST
   XhrObj.open("POST", page);

   //Ok pour la page cible
   XhrObj.onreadystatechange = function()
      {
      if (XhrObj.readyState == 4 && XhrObj.status == 200)
      content.innerHTML = XhrObj.responseText ;
      }   

   XhrObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
   XhrObj.send(data);
   }


search_ajax.php
Code: Tout sélectionner
<?php
// connexion à la base de donnée
...

// envoie du header qui va bien
header('Content-type: text/html; charset=ISO-8859-1') ;

if(!empty($_POST['head']))
   {
   $motcle=addslashes($_POST['head']);
   $motcle=eregi_replace("(tous|les|mots|à|ecarter|de|la|recherche)","",$motcle);
$liste=sql_gettab("SELECT head, MATCH (head,body) AGAINST (\"".$motcle."\") as sim FROM forum WHERE MATCH (head,body) AGAINST (\"".$motcle."\")>4.5 ORDER BY sim DESC LIMIT 0,5");

   if (!empty($liste))
      {
      echo"<ul>";
      foreach ($liste as $line)
         {
         echo "<li><a href=\"...\">".$line[head]."</a></li>";
         }
                echo "</ul>";
      }
   }
?>


Le script recherche les similitudes sur le titre (head) et le contenu (body) de tous les messages de la base

Evidement le champ HEAD de la base doit être défini en FULLTEXT
FULLTEXT KEY `head` (`head`,`body`)

Faites en bon usage

[edit]
Vous pouvez tester là : -skitour.fr/forum/new.php en tapant "test" dans le champ titre :wink:
Dernière édition par jeroen le Ven Déc 21, 2007 14:37, édité 2 fois.


AW
WRInaute accro
WRInaute accro
 
Messages: 2274
Inscription: Mar Mai 31, 2005 14:41

Message le Mar Déc 12, 2006 19:51

Merci xperienss et jeroen, pour l'instant j'en ai pas l'utilité mais je vais enfin pouvoir taguer ce post dans mes bookmarks en étant sur d'avoir le code qui va bien avec 2 exemples interessants :wink:


Patrice A.
Modérateur
Modérateur
 
Messages: 2413
Inscription: Ven Fév 11, 2005 19:36

Message le Mar Déc 12, 2006 20:19

Code: Tout sélectionner
      $sql=mysql_query("SELECT a.topic_id,a.topic_title, 
         (
         MATCH (
         `topic_title`
         )
         AGAINST (
         '".mysql_escape_string($mots_titre_page)."'
         )
         ) AS num
         FROM `phpbb_topics` a, `phpbb_forums` d 
         where
            d.forum_id=a.forum_id
            and a.topic_id !=$topic_id
            and d.auth_read=0
         ORDER BY num DESC
         LIMIT 0 , 5");

Chez moi ça donne :
recherche les ID, les titres, et le taux de ressemblance avec mes mots-clefs
DES sujets
QUI sont dans un forum ouvert au public
ET ne sont pas le sujet incriminé
trouve-moi les 5 premiers.

(tu peux limiter le taux de ressemblance une fois la liste récupérée)
Code: Tout sélectionner
      while($resultat=mysql_fetch_assoc($sql))
      {
         if($resultat['num'])
         { // sinon num=0 => aucun sujet qui ressemble.

Pour chaque sujet
SI le taux de ressemblance n'est pas nul
ALORS...


xperienss
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 227
Inscription: Sam Jan 01, 2005 15:55

Message le Mar Déc 12, 2006 20:24

jeroen a écrit:Evidement le champ HEAD de la base doit être défini en FULLTEXT
FULLTEXT KEY `head` (`head`,`body`)


Ah oui !
Dans mon script, c'est également une recherche FULLTEXT sur le champ "title"... sinon ca ne peut pas marcher.


Merci Jeroen et Dj_Apx pour vos scripts et requete qui m'interesse particulièrement.
Je vais tester.

Xp



EDIT: @Jeroen : Très belle intégration sur ton site. Bravo.


WebRankInfo
Administrateur du site
Administrateur du site
 
Messages: 15905
Inscription: Ven Avr 19, 2002 19:51

Message le Mer Déc 13, 2006 8:18

Merci xperienss et jeroen (je renouvelle mon excuse pour ce remerciement tardif...)


xperienss
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 227
Inscription: Sam Jan 01, 2005 15:55

Message le Mer Déc 13, 2006 18:51

Merci à toi Olivier !
Je fais de l'ajax depuis des mois et cette fonctionnalité sur mon forum ne m'était même pas venue à l'idée.

Je l'ai mis en place il y a deux semaines et déjà j'ai une baisse sensible des nouveaux sujets (et toujours autant de messages) donc cela doit fonctionner pour les internautes...

Dans le même style je viens de créer un sujet avec un script tout fait d'un formulaire de contact en PHP/AJAX
http://www.webrankinfo.com/forums/viewtopic_64319.htm
Si certains veulent le commenter / critiquer...

Xp

Programmer une fonction basique en AJAX

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités