Lien avec ajout de clic

WRInaute discret
Bonjour
Je tourne en rond depuis des heures et n'arrive pas à m'en sortir et sollicite votre aide éclairée.

J'ai un lien de ce type :
Code:
echo "<a href='add-hit.php?link=$link' target='_blank'>$site_externe</a>; // lien vers un site avec ajout de clic en base de données
avec add-hit.php comprenant :
Code:
header("location: ".$_GET['link']); // ouverture du site externe dans un autre onglet
include ('connexion.php'); // connection à la base de données
@mysql_query("UPDATE table_sites SET hits=hits+1 WHERE web_adress='".$_GET['link']."'",$db); // ajout d'un clic pour le site externe

Ca marche parfaitement, mais le lien n'est pas dur !

J'ai essayé (en supprimant du add-hit.php le header) :
Code:
echo "<a href='$link' OnClick='window.open("."'add-hit.php?link=$link"."')' target='_blank'>$site</a>";
ou
Code:
echo "<a href='$link' OnClick='document.location.href=("."'add-hit.php?link=$link')'"." target='_blank'>$site</a>";
et bien d'autres ...

Lien en dur et ouverture ok, mais pas de click ajouté

Ca parait certainement simple pour beaucoup d'entre vous mais pour un amateur comme moi, c'est déjà du top niveau !

Merci de m'aider et bonne journée
 
WRInaute passionné
déjà tu devrais utiliser mysql_real_escape_string($_GET['link']) pour protéger ton paramètre dans l'UPDATE.

ensuite je mettrais le header à la fin (même si je ne suis pas sur que ca change grand chose à ton problème).

tu peux essayer d'ajouter après l'update cette ligne pour voir s'il n'y a pas d'erreur :
Code:
die(mysql_error());
 
WRInaute accro
Perso je ferais ça en ajax, de manière à faire un appel asynchrone sur la page add-hit.php quand quelqu'un clique sur le lien href. Avec prototype ou Jquery, ca va tout seul. J'avais fait ça pour un client, faudrait que je retrouve mes sources.
 
WRInaute impliqué
Salut,
As-tu essayé en remplaçant le onclick par onmousedown ?
Ou "mieux" : utiliser le fichier add-hit avec la redirection et :
Code:
echo '<a href="'.$link.'" onclick="document.location=add-hit.php?link='.$link .';return false;">'.$site_externe.'</a>';

(je ne suis pas sûr du document.location mais c'est l'idée)
 
WRInaute discret
Merci de vos réponses rapides

forty a dit:
déjà tu devrais utiliser mysql_real_escape_string($_GET['link']) pour protéger ton paramètre dans l'UPDATE.
Même si ne comprend pas bien cette commande, je l'ai rajouté, c'est ok !
RECTIFICATION : avec ma commande et fichier php d'origine, le clic n'est pas ajouté, revenu à @mysql_query, ça colle pour l'ajout clic

forty a dit:
ensuite je mettrais le header à la fin (même si je ne suis pas sur que ca change grand chose à ton problème).
Ca ne change rien

forty a dit:
die(mysql_error());
Pas de retour d'erreur

UsagiYojimbo a dit:
Perso je ferais ça en ajax
Oui, je vois ça partout dans mes recherches, mais n'y connais vraiment que pouic en ajax !
A moins que de me fournir un code tout prêt et LARGEMENT documenté ?

Merci à tous 2 et j'espère une solution prochaine
 
WRInaute passionné
as-tu essayé de remplacer mysql_query par die() pour voir si ton UPDATE est OK et si tu passes par là?
Code:
include ('connexion.php'); // connection à la base de données
die("UPDATE table_sites SET hits=hits+1 WHERE web_adress='".mysql_real_escape_string($_GET['link'], $db)."'"); // ajout d'un clic pour le site externe
 
WRInaute discret
Schwarzter Stern a dit:
Je t'ai pas conseillé l'ajax, tu t'es trompé de quote et t'as sauté mes suggestions au passage
Mea culpa, m'étais trompé de destinataire (ai corrigé ci-dessus), c'est UsagiYojimbo qui proposait l'ajax.
Mea culpa 2 (pas bien réveillé !), j'ai pas essayé ta commande avec le return false
... essai ... clic non ajouté
Pas plus en changeant par document.location.href

forty a dit:
as-tu essayé de remplacer mysql_query par die() pour voir si ton UPDATE est OK et si tu passes par là?
essayé >>> pas réagi
essayé en faisant :
Code:
echo "<script>alert('je suis passé par ici')</script>"; 
include ('_connexion.php');
mysql_real_escape_string("UPDATE ".$table_prefix."sites SET hits=hits+1 WHERE web_adress='".mysql_real_escape_string($_GET['link'])."'",$db);
echo "<script>alert('je suis passé par là')</script>";
Ni alert au début, ni à la fin, on n'entre donc pas dans add-hit.php, ni avec window(open), ni avec document.location.href
ET C'EST LA TOUT LE PROBLEME !
 
WRInaute discret
>>> forty
A moins que tu n'aies relu le message de 8h29, ma solution originale (sans lien en dur) n'ajoute pas de clic si on change mysql_query par mysql_real_escape_string

Etonnant, Google connait déjà ce message !
 
WRInaute discret
Bien sûr, pas de pb (c'est ma version originale que vous verrez donc sans lien en dur)
L'ajout de clic n'est implémenté que sur les liens de l'annuaire
J'entend déjà crier 1 de plus, non c'est 1 de moins qui regroupera un ancien annuaire + un topsites
Je vous donne un lien rewrité (ajout de clic non implémenté sur random site)
Pardon pour l'anglais mais quand sera fini, je ferai une version française pour mon site bilingue
Et je n'ai ajouté que quelques liens pour le tester
Or donc : http://www.animated-gifs.eu/1two/animated-gifs-2.html
Et n'hésitez pas à me faire des remarques sur ce qui existe déjà
 
WRInaute accro
Code:
function count_click(link)
{
	var xhr_object = null;
	if(window.XMLHttpRequest) // Firefox
	xhr_object = new XMLHttpRequest();
	else if(window.ActiveXObject) // Internet Explorer
	xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	else { // XMLHttpRequest non supporté par le navigateur
	alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");return}
	xhr_object.open("GET", "add-hit.php?link="+link, false); 
}

Il te suffit ensuite d'appeler cette fonction JS dans ton évènement onclick, ce qui aura pour effet d'exécuter de manière asynchrone ton script add-hit.php, en lui passant l'url à incrémenter. Pour la partie add-hit.php, ce que tu as déjà devrait donc marcher sans souci.

Bien sûr il y aurait moyen d'améliorer ce script, notamment en utilisant un framework ajax du genre prototype ou jquery.
 
WRInaute passionné
chamagne a dit:
>>> forty
A moins que tu n'aies relu le message de 8h29, ma solution originale (sans lien en dur) n'ajoute pas de clic si on change mysql_query par mysql_real_escape_string

Etonnant, Google connait déjà ce message !
j'ai pas dis de remplacer mysql_query par mysql_real_escape_string mais de l'utiliser. Cette fonction permet de protéger les paramètres d'une instruction mysql (gère entre autre les paramètres contenant une quote).
il fallait donc comprendre :
Code:
@mysql_query("UPDATE table_sites SET hits=hits+1 WHERE web_adress='".mysql_real_escape_string($_GET['link'],$db)."'",$db); // ajout d'un clic pour le site externe
 
WRInaute discret
Ah, que la sieste fut bonne !
furty a dit:
j'ai pas dis de remplacer mysql_query par mysql_real_escape_string mais de l'utiliser
Quand je vous dis que ne suis qu'un newbie !
Non pas remplacé mais utilisé (hors le 1er ,$db) qui était de trop), c'est ok et fonctionne de la même façon

>>> UsagiYojimbo
Dans un moment vais tester cette fonction javascript
 
WRInaute discret
UsagiYojimbo a dit:
function count_click(link)
...
Je résume :
1. Création de add-hits.js tel que tu l'as donné (sans en changer une lettre, sinon ajout de alert en entrée et sortie)
2. Fichier add-hit.php (avec alert en entrée et sortie) :
Code:
echo "<script>alert(\"je suis entré dans add-hit.php\")</script>"; 
include ('_connexion.php');
@mysql_query("UPDATE table_sites SET hits=hits+1 WHERE web_adress='".mysql_real_escape_string($_GET['link'])."'",$db);
echo "<script>alert(\"je suis sorti de add-hit.php\")</script>";
3. Dans le head de ma page ajouté :
Code:
<script type="text/javascript" src="add-hits.js"></script>
4. Dans ma page, appel de la fonction sur le lien vers page externe :
Code:
echo "<a href='$link' onclick='return count_click($link);' target='_blank'>$site</a>";
Résultat : pas de clic ajouté, aucune des 4 alertes ne s'est présentée
 
WRInaute accro
Vu que c'est en asynchrone, tu ne peux pas fonctionner comme ça. Pour tester ce qui se passe dans le fichier que tu appelles en Ajax, je te conseille davantage de faire des echo et d'utiliser l'extension Firefox Firebug pour pouvoir avoir accès à ces echos.
 
WRInaute discret
Vu que c'est en asynchrone, tu ne peux pas fonctionner comme ça. Pour tester ce qui se passe dans le fichier que tu appelles en Ajax, je te conseille davantage de faire des echo et d'utiliser l'extension Firefox Firebug pour pouvoir avoir accès à ces echos.
Bonjour
Viens d'installer firebug mais ne sais pas trop comment y voir ce qui se passe, mais vais me plonger dans la doc (...)
Ai supprimé les alert des fichiers add-hits.js (ta fonction) et de add-hits.php (maj base de données)
Commande dans ma page :
Code:
echo "<a href='$link' target='_blank' onClick='count_click($link);'>$site</a>";
ou
echo "<a href='$link' target='_blank' onClick='javascript:count_click($link);'>$site</a>
ou idem avec onmousedown
aucune n'ajoute de clic en BD
la fonction countclick n'est pas effectuée (ton fichier js apparaît bien dans firebug)
Que je l'appelle dans le fichier externe ou que je l'inclue en totalité dans le <head>
On ne doit pas être loin du but, mais !!!
 
WRInaute accro
$link est une chaîne, elle doit donc être protégée (avec des quotes par exemple) quand tu l'appelles en tant que paramètre JS.

Tu n'as pas d'erreur JS sur Firefox (dans la console d'erreur) ?
 
WRInaute discret
Bonsoir
$link est une chaîne, elle doit donc être protégée (avec des quotes par exemple) quand tu l'appelles en tant que paramètre JS.
Tu n'as pas d'erreur JS sur Firefox (dans la console d'erreur) ?
J'ai donc changé ma commande en :
Code:
echo "<a href='$link' target='_blank' onclick='count_click(".'$link'.");'>$site</a>";
>>> clic non ajouté
Console d'erreurs firefox (le newbie ne savait même pas que ça existait !) >>> $link non défini !!! (suit le nom de la page)
Ajouté un echo "$link"; juste avant la commande ci-dessus et pas de pb, $link est bien défini ??? d'ailleurs le href fonctionne, suis-je bête !
 
WRInaute accro
Essaye ceci...

JavaScript:

Code:
function click_counter(lnk) {
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","/click_counter.php?link="+lnk,true);
xmlhttp.send();
}

Lien sortant:

Code:
echo '<a href="'.$link.'" onclick="javascript: click_counter('.$link.');">'.$link.'</a>';

click_counter.php:

...ta petite query, avec éventuellement quelques contrôles d'usage (ip, cookie, etc...).
NB: sécurise bien $link et ta query, ou travaille avec un identifiant numérique à la place de l'URL.
 
WRInaute discret
Bonjour à tous
HawkEye a dit:
Essaye ceci...
Essayé ton code et ta commande >>> pas de clic ajouté >>> $link non défini dans la console d'erreur
Essayé le code de UsagiYojimbo et ta commande >>> pas de clic ajouté >>> $link non défini dans la console d'erreur
Dur, dur d'être un amateur, j'en rêve la nuit !
Ma commande :
Code:
echo '<a class="snap_shots" href="'.$link.'" target="_blank" onclick="javascript: count_click('.$link.');"><span style="font-size:10pt;">'.$site.'</span></a><br />';
Voir en ligne (mais pas encore intégré au site) : http://www.animated-gifs.eu/1two/animated-gifs-2.html
Peux vous envoyer le code complet de ma page si nécessaire
Merci de vos efforts et bon weekend
 
WRInaute discret
Ne cherchez plus, CA MARCHE !

LA SOLUTION

Dans le head de ma page :
Code:
<script type="text/javascript" src="add-hit.js"></script>
Dans le body :
Code:
echo "<a href='$link' target='_blank' onclick='allera(\"add-hit.php?link=$link\"); return false;'>$site</a>";
Avec add-hit.js :
Code:
function allera(link)
    {
        window.open(link);
    }
et add-hit.php :
Code:
<?
include ('_connexion.php');
@mysql_query("UPDATE ".$table_prefix."sites SET hits=hits+1 WHERE web_adress='".mysql_real_escape_string($_GET['link'])."'",$db);
?>
<script type="text/javascript">
        window.location ="<?php echo $_GET['link'];?>";
</script>
Ca pourra servir à d'autres
J'ai pas mal appris avec ce pb et en ressort moins bête (juste un tout petit peu !)
Merci à tous de vous être investi dans mes problèmes
 
Discussions similaires
Haut