Compteur de clic et enregistrement dans BDD

nanalala
Invité n'ayant pas de compte PHPfrance

06 juin 2012, 21:36

Bonsoir,
Je suis en train de faire un compteur de clic, sur 2 images, ces images changent aléatoirement à chaque fois que la page s'actualise.
Et j'aimerais savoir si il est possible de récupérer le nom de l'image cliqué, et d'enregistrer le nom de cette image dans une base de donnée?

J'ai déjà réussi à afficher les images aléatoirement, et a récupérer leur nom, voici mon code :
<?php
		$path = 'images/'; 
		$tab = scandir($path); 
		$tab = array_slice($tab, 2); 
		shuffle($tab); 
		$tab = array_slice($tab, 0, 3); 			

			$imageA = array_shift ( $tab );
			$imageB = array_shift ( $tab );
	
			$bout = '.';
			$trouve = strpos($imageA,$bout);
			$prixA = substr($imageA, 0, $trouve);
			
			$trouve = strpos($imageB,$bout);
			$prixB = substr($imageB, 0, $trouve);
			
?>
Ma base de donnée possède une table "compteur de clic" avec 4 colonnes : code_clic, emplacement (1 ou 2, 1 étant la photo du haut, et 2 la photo du bas), ip_internaute, et date. A chaque fois qu'un internaute clique sur l'une des images une nouvelle ligne est créée dans la base de donnée.
Il me faudrait donc une 5eme colonne indiquant le nom de l'image cliqué.

Mais je ne sais pas comment faire en sorte d'enregistrer le nom récupéré de l'image qui a été cliqué, et enregistrer seulement le nom de l'image cliqué et pas le nom de l'autre image. Est ce que quelqu'un peut m'aider.

Merci bien.

ViPHP
xTG
ViPHP | 7331 Messages

06 juin 2012, 22:00

Tu peux nous montrer ton code gérant le clic ?
En théorie il faut passer l'information en même temps que les autres et de la même façon. :)

nanalala
Invité n'ayant pas de compte PHPfrance

06 juin 2012, 22:18

Je suis jeune débutante en PHP, et donc j'ai cherché un peu sur internet de l'aide et trouvé ça sur un forum.
J'ai à peut près compris comment ça marche mais je ne saurais pas comment enregistrer le nom de l'image cliqué à partir de ce que j'ai là, car je ne saurais par refaire de la même manière.
  // on ouvre une requete sql pour récupérer les infos sur nos fichiers à télécharger
        $req = mysql_query("SELECT * FROM fichier_telechargeable WHERE id_fichier=1");
        $ligne = mysql_fetch_array($req);
        $IdFichier1 = intval($ligne['id_fichier']);
        $NomFichier1 = stripslashes($ligne['nom_fichier']);
        $LienFichier1 = stripslashes($ligne['lien_fichier']);
        mysql_free_result($req);
               
        // Script jqeury pour compter le clique
        echo '
        <script type="text/javascript">                
            // valable pour un seul lien à la fois
            $(document).ready(function(){
                $(\'a[rel="Lien1"]\').click(function() {
                    $.ajax({
                        type:\'POST\',
                        url: \'libs/compteur-clic.php\', // ici on appel le fichier PHP pour compter le clique
                        data: \'id=\'+$(this).attr("id"), // Ici, on récupère l\id de notre source (ne pas modifier)
                        async: false
                    });
                    return true;              
                });
            });
        </script>';                
        // lien de téléchargement
        echo '<div><a rel="Lien1" id="'.$IdFichier1.'" href="'.$LienFichier1.'">Cliquez ici pour télécharger le fichier <strong>'.$NomFichier1.'</strong> et je compte</a></div><br />';
        

ViPHP
xTG
ViPHP | 7331 Messages

07 juin 2012, 09:34

Code : Tout sélectionner

data: \'id=\'+$(this).attr("id"),
A remplacer par :

Code : Tout sélectionner

data: { id : $(this).attr("id"), url : $(this).attr("href") },
Et bingo tu transmets l'url concernée en même temps que l'id.

nanalala
Invité n'ayant pas de compte PHPfrance

07 juin 2012, 10:17

Voici les modifications que j'ai fait :
        $req = mysql_query("SELECT * FROM fichier_telechargeable WHERE id_fichier=1");
        $ligne = mysql_fetch_array($req);
        $IdFichier1 = intval($ligne['id_fichier']);
        $NomFichier1 = stripslashes($ligne['nom_fichier']);
        $LienFichier1 = "http://www.deezer.com";
        mysql_free_result($req);
               
        // Script jqeury pour compter le clique
        echo '
        <script type="text/javascript">                
            // valable pour un seul lien à la fois
            $(document).ready(function(){
                $(\'a[rel="Lien1"]\').click(function() {
                    $.ajax({
                        type:\'POST\',
                        url: \'libs/compteur-clic.php\', // ici on appel le fichier PHP pour compter le clique
                        data: { id : $(this).attr("id"), url : $(this).attr("href") }, // Ici, on récupère l\id de notre source (ne pas modifier)
                        async: false
                    });
                    return true;              
                });
            });
        </script>';                
        // lien de téléchargement
        echo "<a rel='Lien1' id=".$IdFichier1." href=".$LienFichier1." >"."<img src='images/" . $imageA . "' alt='Random Image' />"."</a>";
En fait je pense que je me suis mal exprimée, je ne souhaite pas récupérer le href (ici qui se trouve être le lien vers deezer) mais je veux récupérer le nom de mon image (. $imageA .) et je veux que ce nom s'enregistre dans ma colonne nom_fichier.

Il te manque je pense aussi un bout de code pour tout comprendre :
<?php
// variable permettant de savoir si le clique est valide pour comptabiliser
$ClicValide=true;

// petite vérification de la variable ID en provenance de notre fichier index.php
if (!isset($_POST['id'])) { 
    $_POST['id']=0; 
} else if (!is_numeric($_POST['id'])) { 
    $_POST['id']=0; 
}

// vérifie si le code source existe, autrement on retourne false
$req = mysql_query("SELECT COUNT(id_fichier) FROM fichier_telechargeable WHERE id_fichier=".intval($_POST["id"]));
$nb = mysql_fetch_row($req);
if($nb==0) { 
    $ClicValide=false; 
}

// si tous les tests sont concluants on enregistre le clic
if ($ClicValide) {
    // on ajoute le clique dans la base de données
    $insertion = mysql_query("INSERT INTO compteur_clic (`c_id_source`,`nom_fichier`,`c_date_clic`,`c_ip_visiteur`) VALUES (".intval($_POST['id']).",'".mysql_real_escape_string(date("Y-m-d"))."','".mysql_real_escape_string($_SERVER["REMOTE_ADDR"])."')") or die(mysql_error());
}
?>
Dans cette partie du code qui enregistre le clic dans la base de donnée j'ai ajouté ma colone "nom_fichier" pour qu'il enregistre donc le nom de mon image. Mais cela ne marche pas. Il me manque quelque chose dans $.ajax je pense mais je ne sais pas quoi. Quelque chose qui inscrit $imageA, en même temps que le clic.

Est ce que tu comprend mon problème? Je ne sais pas si j'ai bien était clair...

ViPHP
xTG
ViPHP | 7331 Messages

07 juin 2012, 10:20

Dans ce cas :

Code : Tout sélectionner

urlImg : $(this).find("img").attr("src")
Enfin, à tester.

nanalala
Invité n'ayant pas de compte PHPfrance

07 juin 2012, 10:31

En fait cela ne marche pas, mais cela ne vient pas du code que tu m'as donné mais cela vient du fait que j'ai rajouté la colonne "mon_fichier" dans mon mysql_query. Comment ça se fait? Parce que si je ne rajoute pas le nom de ma colonne ici il ne va pas enregistrer le nom de mon images dans ma colonne?
$insertion = mysql_query("INSERT INTO compteur_clic (`c_id_source`,`nom_fichier`,`c_date_clic`,`c_ip_visiteur`) VALUES (".intval($_POST['id']).",'".mysql_real_escape_string(date("Y-m-d"))."','".mysql_real_escape_string($_SERVER["REMOTE_ADDR"])."')") or die(mysql_error());
}

ViPHP
xTG
ViPHP | 7331 Messages

07 juin 2012, 10:35

Tu le rajoutes de la même façon que tu gères l'id. ;)

nanalala
Invité n'ayant pas de compte PHPfrance

07 juin 2012, 10:46

Oui mais comment avec 'intval"? Parce que cela ne marche pas.
    $insertion = mysql_query("INSERT INTO compteur_clic (`c_id_source`,`mon_fichier`,`c_date_clic`,`c_ip_visiteur`) VALUES (".intval($_POST['id']).",".intval($_POST['mon_fichier']).",'".mysql_real_escape_string(date("Y-m-d"))."','".mysql_real_escape_string($_SERVER["REMOTE_ADDR"])."')") or die(mysql_error());
Ce que je ne comprend pas c'est comment il sait que ce que je récupère avec
urlImg : $(this).find("img").attr("src")
il doit le mettre dans la colonne"mon_fichier"?

ViPHP
xTG
ViPHP | 7331 Messages

07 juin 2012, 10:51

Non tu récupères la valeur dans $_POST['urlImg'] et ce n'est pas un entier (int) !
Donc utilises mysql_real_escape_string().
A noter aussi qu'il renvoi le dossier et pas uniquement le nom de fichier. Donc tu peux utiliser la fonction basename() pour ne récupérer que le nom.

nanalala
Invité n'ayant pas de compte PHPfrance

07 juin 2012, 11:08

Yeah c'est presque bon. Je suis vraiment contente que tu m'aide.
En fait ça marche nickel et même pas besoin de la fonction basename(), il me récupère uniquement le nom du fichier et pas le dossier complet.

Seulement ça marche uniquement lorsque mon image est fixe et mon lien aussi comme ici :
$req = mysql_query("SELECT * FROM fichier_telechargeable WHERE id_fichier=1");
        $ligne = mysql_fetch_array($req);
        $IdFichier1 = intval($ligne['id_fichier']);
        $NomFichier1 = stripslashes($ligne['nom_fichier']);
        $LienFichier1 = "http://www.deezer.com";
        mysql_free_result($req);
               
        // Script jqeury pour compter le clique
        echo '
        <script type="text/javascript">                
            // valable pour un seul lien à la fois
            $(document).ready(function(){
                $(\'a[rel="Lien1"]\').click(function() {
                    $.ajax({
                        type:\'POST\',
                        url: \'libs/compteur-clic.php\', // ici on appel le fichier PHP pour compter le clique
                        data: { id : $(this).attr("id"), urlImg : $(this).find("img").attr("src") }, // Ici, on récupère l\id de notre source et le nom de limage(ne pas modifier)
                        async: false
                    });
                    return true;              
                });
            });
        </script>';                
        // lien de téléchargement
        echo '<div><a rel="Lien1" id="'.$IdFichier1.'" href="'.$LienFichier1.'" ><img src ="7750.jpg"></a></div><br />';

Mais dès que mon image et mon lien sont liée et changent à chaque actualisation de page, là cela ne marche pas, et quand je dis que ça marche pas, c'est que le compteur ne marche pas, il ne comptabilise plus le nombre de clic, comme si ne comprenait pas que je cliquais sur l'image et du coup il n'enregistre rien dans ma base de donnée. voici mon code :
<?php
		$path = 'images/'; 
		$tab = scandir($path); 
		$tab = array_slice($tab, 2); 
		shuffle($tab); 
		$tab = array_slice($tab, 0, 3); 			

			$imageA = array_shift ( $tab );
			$imageB = array_shift ( $tab );
			$imageC = array_shift ( $tab );
	
			$bout = '.';
			$trouve = strpos($imageA,$bout);
			$prixA = substr($imageA, 0, $trouve);
			
			$trouve = strpos($imageB,$bout);
			$prixB = substr($imageB, 0, $trouve);
			
			$trouve = strpos($imageC,$bout);
			$prixC = substr($imageC, 0, $trouve);
			
?>

        $req = mysql_query("SELECT * FROM fichier_telechargeable WHERE id_fichier=1");
        $ligne = mysql_fetch_array($req);
        $IdFichier1 = intval($ligne['id_fichier']);
        $NomFichier1 = stripslashes($ligne['nom_fichier']);
        $LienFichier1 = "http://www.glamuse.com/-p-$prixA.html";
        mysql_free_result($req);
               
        // Script jqeury pour compter le clique
        echo '
        <script type="text/javascript">                
            // valable pour un seul lien à la fois
            $(document).ready(function(){
                $(\'a[rel="Lien1"]\').click(function() {
                    $.ajax({
                        type:\'POST\',
                        url: \'libs/compteur-clic.php\', // ici on appel le fichier PHP pour compter le clique
                        data: \'id=\'+$(this).attr("id"), // Ici, on récupère l\id de notre source (ne pas modifier)
                        async: false
                    });
                    return true;              
                });
            });
        </script>';                
        // lien de téléchargement
        echo "<div id='pub_flottante_main_container_1'>"."<a rel='Lien1' id=".$IdFichier1." href=".$LienFichier1." >"."<img src='images/" . $imageA . "' alt='Random Image' />"."</a>"."</div>" ;
			?>

Est ce que tu as une idée d'où cela pourrait venir ou pas?
Parce que j'ai fait exactement pareil que si mon image et lien étaient fixe, j'ai juste changé avec le nom de mes variables "$imageA et $prixA"

ViPHP
xTG
ViPHP | 7331 Messages

07 juin 2012, 11:32

Le dossier images tel que je le disais précédemment ?
Car dans ton exemple fixe tu ne charges pas une image se trouvant dans un sous-dossier, donc il n'y a que le nom de l'image qui est envoyé.
C'est pour cela que cela marche. ;)

nanalala
Invité n'ayant pas de compte PHPfrance

07 juin 2012, 11:40

Oui mais dans cette version je ne me suis pas encore occupée de récupérer le nom de mon image, j'ai commencé simplement avec ce que j'avais à la base, puis je comptais rajouté ce qu'on a vu petit à petit mais là déjà c'est tout le système du compteur de clic qui ne marche pas. Et c'est ça que je ne comprend pas...

ViPHP
xTG
ViPHP | 7331 Messages

07 juin 2012, 11:44

Une erreur javascript de générée ?
Qu'en est-il du code PHP utilisé ?

nanalala
Invité n'ayant pas de compte PHPfrance

07 juin 2012, 11:46

Aucune erreur, le compteur ne fonctionne pas c'est tout. Mais je me demande si cela ne viendrait pas du fait que j'ai divisé mon code PHP initial en trois parties, est ce possible?