Programmer une fonction basique en AJAX
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
Bonjour,
Voici ma version
Page du forum avec le titre a entrer :
fichier ajaxgetfile.php
fichier topictitle.php
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.
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

- Messages: 2413
- Inscription: Ven Fév 11, 2005 19:36
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.
sert à quoi ? C'est quoi ton objectif en ajoutant ça ?
moi j'ai un
, match.. against... ressemblance WHERE ressemblance > ...
c'est plus propre.
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
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>...
Voilà ma contribution
formulaire
ajax.js
search_ajax.php
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
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
Dernière édition par jeroen le Ven Déc 21, 2007 14:37, édité 2 fois.
-

Patrice A. - Modérateur

- Messages: 2413
- Inscription: Ven Fév 11, 2005 19:36
- 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...
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

- Messages: 15905
- Inscription: Ven Avr 19, 2002 19:51
Merci xperienss et jeroen (je renouvelle mon excuse pour ce remerciement tardif...)
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
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
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 :
- Référencement et Web 2.0
- Google Web Toolkit, pour créer des applications en AJAX
- Yahoo Maps API
- Google rejoint le projet Open AJAX créé par IBM
- Fin de l'API Google Search SOAP
- Définition(s) du Web 2.0
- Google ferme l'API SOAP aux nouveaux développeurs
- Optimisation du référencement d'un site en AJAX
- Ajouter un moteur de recherche d'images sur son site
- Le futur de Google Universal Search décrit par Marissa Mayer
- Développer fonction en ajax
- programmer en php
- programmer un référencement
- Programmer de l'asp avec ??
- Programmer un déclancheur de lien
- Programmer a partir d'un pda
- [résolu] des soucis pour programmer mon htaccess
- Question basique !
- Réécriture basique.
- Rewriting basique
- Probleme basique de cgi
- utilisation (basique) de robostats
- Changer d'hébergement, question basique
- Question basique code HTML
- question <h> et <p> (html basique) :oops:
Consultez la description détaillée des produits ou services de Google suivants : Google Web Toolkit
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités





le forum