Contador de clics sin reinicio (con php)
Resueltoletocest Mensajes publicados 34 Estado Miembro -
Hola,
me gustaría que en mi sitio, las personas interesadas en un proyecto se contaran al hacer clic en un botón.
He encontrado el script en html/java, pero el contador se restablece a cero cuando se sale de la página.
He entendido que necesito usar php para mantener el número mostrado, pero no tengo idea (soy un manitas, pero no un campeón campeón).
¿Alguien podría explicarme (de forma sencilla) cómo hacerlo? Con ejemplos de scripts, por favor.
Estoy pidiendo mucho, lo sé, pero aprendo rápido...
Atentamente,
18 respuestas
-
Soy yo de nuevo. Acabo de ver que quizás debería usar Ajax. Pero aparte de Sófocles, Ajax...
-
Hola,
Entonces sí, necesitarás JavaScript, AJAX y un lenguaje de servidor (como PHP).
Luego, la primera pregunta que debes hacerte es: ¿dónde quieres almacenar los datos de este contador? ¿en una base de datos o en un simple archivo?
Si es en una base de datos, también necesitarás aprender SQL para poder hacer consultas INSERT o UPDATE.
Aquí hay ejemplos de scripts JavaScript (jQuery) AJAX: https://codes-sources.commentcamarche.net/source/102253-exemple-ajax-en-jquery
Seguramente encontrarás algunos más simples en cualquier lugar de la web...
Vuelve a vernos con tus intentos si encuentras algún problema... veremos cómo ayudarte a solucionarlo.
.
Cordialmente,
Jordane -
Muchas gracias. Ya encontré un ejemplo en otro sitio, con php y todo. El contador se muestra pero no se incrementa. Voy a mirar tu enlace y estoy seguro de que acabaré juntando las piezas. Hasta pronto. Gracias de nuevo.
-
Hola,
aquí hay algunos archivos que encontré para mi contador. Según lo que entiendo, los datos se registran en archivos (PHP5 y clickcount.data) y no en una base de datos. ¿Es correcto?
1) Índice
<?xml version="1.0" encoding="iso-8859-15"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>AJAX : Ejemplo de cliente</title> <script type="text/javascript" src=""></script> </head> <body> <p> <a href="" onclick="gestionClic(); return false;">¡Haz clic aquí!</a> (Número de clics : <span id="nbr_clics"> <?php $str = @file_get_contents('compteur/clickcount.data'); if($str !== FALSE) echo unserialize($str); else echo 0; ?></span>) </p> </body> </html>2) /compteur/clickcount.data
03) /compteur/compteur.php5
<?php sleep(1); $nbr = 1; $str = @file_get_contents('clickcount.data'); if($str !== FALSE) $nbr = unserialize($str)+1; header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); echo $nbr; file_put_contents('clickcount.data', serialize($nbr)); ?>4) /js/compteur-click.js
var http; // Nuestro objeto XMLHttpRequest function createRequestObject() { var http; if(window.XMLHttpRequest) { // Mozilla, Safari, ... http = new XMLHttpRequest(); } else if(window.ActiveXObject) { // Internet Explorer http = new ActiveXObject("Microsoft.XMLHTTP"); } return http; } function gestionClic() { document.getElementById('nbr_clics').innerHTML = '<em>Cargando...</em>'; http = createRequestObject(); http.open('get', '.compteur/compteur.php5', true); http.onreadystatechange = handleAJAXReturn; http.send(null); } function handleAJAXReturn() { if(http.readyState == 4) { if(http.status == 200) { document.getElementById('nbr_clics').innerHTML = http.responseText; } else { document.getElementById('nbr_clics').innerHTML = "<strong>No disponible</strong>"; } } }Tengo varios problemas:
aunque los archivos PHP5 y clickcount.data se incrementan, el resultado es No disponible.
He visto la línea de código en el archivo compteur-click.jsExtractos:
(...)
function handleAJAXReturn() { if(http.readyState == 4) { if(http.status == 200) { document.getElementById('nbr_clics').innerHTML = http.responseText; } else { document.getElementById('nbr_clics').innerHTML = "<strong>No disponible</strong>"; } }(...)
no sé qué está mal y qué debo cambiar.Además, quise, con Kompozer, modificar el texto, la capitalización de los caracteres, etc. en la página principal (índice), y todo desapareció. Lo cual es un problema porque, por supuesto, deseo insertar este contador en un rincón de la página principal con un texto que lo anuncie y lo acompañe.
Asimismo, al actualizar el índice, con fileZilla, parece que la incrementación no continúa desde el día anterior, lo que, en este caso, es un gran problema, ya que quiero modificar regularmente la página principal (índice) y mantener la incrementación.
Esto es donde estoy. Está avanzando...
Si es útil, la dirección es
http://letaucestnous.lescigales.org -
Hola,
aquí hay archivos que encontré para mi contador. Según lo que entiendo, los datos están registrados en archivos (PHP5 y clickcount.data) y no en una base de datos. ¿Es correcto?
1) Índice
<?xml version="1.0" encoding="iso-8859-15"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>AJAX : Ejemplo de cliente</title> <script type="text/javascript" src="""></script> </head> <body> <p> <a href="" onclick="gestionClic(); return false;">¡Haz clic aquí!</a> (Número de clics : <span id="nbr_clics"> <?php $str = @file_get_contents('compteur/clickcount.data'); if($str !== FALSE) echo unserialize($str); else echo 0; ?></span>) </p> </body> </html>2) /compteur/clickcount.data
0 -
3) /contador/contador.php5
<?php sleep(1); $nbr = 1; $str = @file_get_contents('clickcount.data'); if($str !== FALSE) $nbr = unserialize($str)+1; header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); echo $nbr; file_put_contents('clickcount.data', serialize($nbr)); ?>4) /js/contador-click.js
var http; // Nuestro objeto XMLHttpRequest function createRequestObject() { var http; if(window.XMLHttpRequest) { // Mozilla, Safari, ... http = new XMLHttpRequest(); } else if(window.ActiveXObject) { // Internet Explorer http = new ActiveXObject("Microsoft.XMLHTTP"); } return http; } function gestionClic() { document.getElementById('nbr_clics').innerHTML = '<em>Cargando...</em>'; http = createRequestObject(); http.open('get', '.contador/contador.php5', true); http.onreadystatechange = handleAJAXReturn; http.send(null); } function handleAJAXReturn() { if(http.readyState == 4) { if(http.status == 200) { document.getElementById('nbr_clics').innerHTML = http.responseText; } else { document.getElementById('nbr_clics').innerHTML = "<strong>N/D</strong>"; } } } -
Tengo varios problemas:
aunque los archivos PHP5 y clickcount.data se incrementan, el resultado es N/A.
He visto la línea de código en el archivo contador-click.jsExtractos:
(...)function handleAJAXReturn() { if(http.readyState == 4) { if(http.status == 200) { document.getElementById('nbr_clics').innerHTML = http.responseText; } else { document.getElementById('nbr_clics').innerHTML = "<strong>N/A</strong>"; } } (...)(...)
no sé qué está mal y qué debo cambiar.Además, quise, con Kompozer, modificar el texto, la capitalización de los caracteres, etc. en la página principal (index), y todo desapareció. Lo cual es un problema porque, por supuesto, quiero insertar este contador en un rincón de la página principal con un texto que lo anuncie y lo acompañe.
Asimismo, al actualizar index, con fileZilla, parece que la incrementación no continúa la del día anterior, lo cual es, para el caso, un gran gran problema, ya que quiero modificar regularmente la página principal (index) y mantener la incrementación.
Esto es en lo que estoy. Está avanzando... (lo hice en varios mensajes porque completo no pasaba)
-
Comienza por renombrar tu archivo compteur.php5 a compteur.php
Luego, reemplaza tu código JS por este
var http; // Nuestro objeto XMLHttpRequest var urlAjax = './compteur/compteur.php'; function createRequestObject() { if(window.XMLHttpRequest) { // Mozilla, Safari, ... http = new XMLHttpRequest(); } else if(window.ActiveXObject){ // Internet Explorer http = new ActiveXObject("Microsoft.XMLHTTP"); } return http; } function gestionClic() { document.getElementById('nbr_clics').innerHTML = '<em>Cargando...</em>'; http = createRequestObject(); http.open('get', urlAjax, true); http.onreadystatechange = handleAJAXReturn; // Manejo de Errores: http.onerror = function(error){ console.error( 'Error AJAX', error ); } http.send(null); } function handleAJAXReturn() { if(http.readyState == 4) { if(http.status == 200){ document.getElementById('nbr_clics').innerHTML = http.responseText; } else { document.getElementById('nbr_clics').innerHTML = "<strong>N/A</strong>"; console.error( 'Error AJAX', http.status, http.responseText ); } } }Y recuerda mirar en la consola de tu navegador lo que se muestra cuando haces clic en tu botón..
-
¡Formidable! ¡Funciona! ¿Y va a permanecer así aunque modifique el índice? Por lo demás, haré pruebas, y si tienes algunas ideas... ¡Muchas gracias!
-
El problema que me queda es la modificación del formato (tamaño del texto, posiblemente del botón, etc.) para insertar este contador en una esquina de la página principal con un texto que lo anuncie y lo acompañe. Con Kompozer, cambié el texto y todo desapareció en línea. Raro...
-
Acabo de regresar al sitio y el número de clics no se muestra. Solo se muestra si hago clic en el botón (con +1). Es molesto porque me gustaría que el número (de participantes) siempre se mostrara. Es importante.
-
La frase es
$str = @file_get_contents('clickcount.data');(sin contador/) que he reemplazado por
$str = file_get_contents('./clickcount.data');(sin @) pero no ha cambiado nada
-
¿Estás seguro del camino?
¿Puedes modificar el código así?
<?php $cmptFile = __DIR__ . '/clickcount.data'; if(!file_exists($cmptFile)){ echo "Error .. Archivo " . $cmptFile . "faltante o no encontrado..."; } else { $str = file_get_contents($cmptFile); var_dump($str); // el tiempo de las pruebas para ver qué contiene tu variable if($str !== FALSE) { echo unserialize($str); } else { echo 0; } } ?>-
No estoy seguro de nada (¿camino?) Reemplacé el php por tu código, el resultado es bastante curioso... (ver la imagen)

No estoy seguro de nada (¿camino?) He reemplazado el php por tu código, el resultado es bastante curioso, y desaparece cuando se recarga la página.
Esto da:
Somos: cadena(5) "i:13;" 13
(la cursiva soy yo)
He reinstalado el php anterior que funcionaba muy bien (Estamos: 14), pero que desaparece a cada carga de la página.
Sin embargo, no entiendo mucho tu comentario. No estoy intentando gran cosa, solo estoy tomando trozos de código aquí y allá... No he insertado el trozo de código
<body onload="gestionClic(nbr_clics);"> <!-- ...... -->porque no sabría dónde ponerlo.
Gracias por tu respuesta. De hecho, los archivos no son muy diferentes a los primeros que mostré (con tus modificaciones).
Hay 4 archivos (quizás los ponga en varias veces);
1) index.html
2) /compteur/compteur.php
3) /compteur/clickcount.data
4) /js/compteur-click.js
y primero...
1) index.html (el paso del contador)
(...)
</div> <div> <script type="text/javascript" src=""></script> <p style="text-align: center;"><a href="" onclick="gestionClic(); return false"><img style="border: medium none ;" src=""></a> <br> </p> <p style="text-align: center;"><big><big>(Estamos: <span id="nbr_clics"> <?php $str = @file_get_contents('compteur/clickcount.data'); if($str !== FALSE) echo unserialize($str); else echo 0; ?></span>)(...) es extraño que la dirección de la fuente src (una imagen) haya desaparecido del código aquí.
2) /compteur/compteur.php
<?php sleep(1); $nbr = 1; //$str = @file_get_contents('clickcount.data'); $str = file_get_contents('./clickcount.data'); if($str !== FALSE) $nbr = unserialize($str)+1; header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); echo $nbr; //file_put_contents('clickcount.data', serialize($nbr)); file_put_contents('./clickcount.data', serialize($nbr)); ?>-
3) /contador/clickcount.data
04) /js/contador-click.js
var http; // Nuestro objeto XMLHttpRequest var urlAjax = './contador/contador.php'; function createRequestObject() { if(window.XMLHttpRequest) { // Mozilla, Safari, ... http = new XMLHttpRequest(); } else if(window.ActiveXObject){ // Internet Explorer http = new ActiveXObject("Microsoft.XMLHTTP"); } return http; } function gestionClic() { document.getElementById('nbr_clics').innerHTML = '<em>Cargando...</em>'; http = createRequestObject(); http.open('get', urlAjax, true); http.onreadystatechange = handleAJAXReturn; // Manejo de Errores: http.onerror = function(error){ console.error( 'Error AJAX', error ); } http.send(null); } function handleAJAXReturn() { if(http.readyState == 4) { if(http.status == 200){ document.getElementById('nbr_clics').innerHTML = http.responseText; } else { document.getElementById('nbr_clics').innerHTML = "<strong>N/A</strong>"; console.error( 'Error AJAX', http.status, http.responseText ); } } }El contador funciona muy bien, se incrementa y todo. El único problema (molesto) es que desaparece en cada carga de la página.
¿Tu archivo se llama index.html ?
Es sorprendente... es raro que la configuración del servidor permita la ejecución de código PHP en un archivo .html.
Renómbralo como index.php ... debería funcionar mejor.
Si sigue sin funcionar, publícanos el código COMPLETO de tu archivo index.php así como el código fuente generado de este. (para obtener el código fuente generado, debes mostrar la página en tu navegador y luego usar el atajo de teclado CTRL+u, copiarlo y pegarnos aquí)
.
Atentamente,
JordaneNo funciona más... Estoy perdido en todos mis archivos. Los he intentado todos y, (creo) los que he puesto de ayer, cuando hago clic en la imagen del contador, la página sube arriba.
No puedo poner el enlace del sitio, pero haciendo el listo:
letaucestnous punto lescigales punto org (por ahora con index.html ya que funcionaba) para que lo veas por ti mismo si es posible
Acabo de darme cuenta de que hay un lío en los mensajes, porque escribía mensajes que no aparecían, pero que de hecho aparecieron más tarde. Y como lo intenté varias veces... Con respecto a HTML o PHP, el contador funciona para ambos, pero la codificación de la página para PHP es un poco enredada. Estoy dispuesto a poner la página entera del índice y su código fuente, no sabía que diferían.
Además, intenté reemplazar una imagen en lugar de "clic aquí", había logrado hacerlo y ya no puedo (el contador ya no funciona - de hecho funcionaba, debe ser la suerte del principiante).
Así que, empecemos de nuevo:
1) index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head> <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> <title>Índice maqueta</title> </head><body style="width: 94px;"> <div style="position: absolute; left: 36px; top: 356px; height: 68px; width: 587px;"><big><big style="font-weight: bold;">Capa 1 ¿Qué es esto?</big></big><br> </div> <div style="position: absolute; left: 228px; top: 303px; height: 46px; width: 137px; z-index: 1;"><big>Capa 4</big><br> </div> <div style="position: absolute; left: 744px; top: 362px;"><big><big style="font-weight: bold;">Capa 2 Artículos</big></big><br> </div> <div style="position: absolute; left: 644px; top: 275px; height: 51px; width: 185px;"><big> <big style="font-weight: bold;">Capa 7</big></big><br> </div> <div style="position: absolute; left: 374px; top: 7px;"><big> <img style="width: 250px; height: 250px;" alt="" src=""></big><br> </div> <big> <br> </big> <div style="position: absolute; left: 115px; top: 113px;"><big style="font-weight: bold; font-family: Curlz MT;"><big><big>Sitio en construcción....</big></big></big><br> </div> <big><br> </big> <div style="position: absolute; left: 552px; top: 504px; height: 262px; width: 318px;"> <div style="text-align: center;"><big> <big style="font-weight: bold;">¡Contemos!</big></big><br> <big><big style="font-weight: bold;">Si desea manifestar su participación en <span style="font-style: italic;"><br> el lazo somos nosotros</span>, </big></big><br> </div> <div> <script type="text/javascript" src=""></script> </head> <body> <p> <a href="" onclick="gestionClic(); return false;">¡Haga clic aquí!</a> (Estamos: <span id="nbr_clics"> <?php $str = @file_get_contents('compteur/clickcount.data'); if($str !== FALSE) echo unserialize($str); else echo 0; ?></span>) </big></big></p> ;</div> <br> </div> <div style="position: absolute; left: 417px; top: 309px;"><big> Capa 6</big><br> </div> <div style="position: absolute; left: 56px; top: 315px; width: 135px; text-align: center;"><big><big> Capa 5</big></big><br> </div> <div style="position: absolute; left: 746px; top: 423px;"><big><big>Capa 3 Sitios</big></big><br> </div> </body></html>2) código fuente index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head> <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> <title>Índice maqueta</title> </head><body style="width: 94px;"> <div style="position: absolute; left: 36px; top: 356px; height: 68px; width: 587px;"><big><big style="font-weight: bold;">Capa 1 ¿Qué es esto?</big></big><br> </div> <div style="position: absolute; left: 228px; top: 303px; height: 46px; width: 137px; z-index: 1;"><big>Capa 4</big><br> </div> <div style="position: absolute; left: 744px; top: 362px;"><big><big style="font-weight: bold;">Capa 2 Artículos</big></big><br> </div> <div style="position: absolute; left: 644px; top: 275px; height: 51px; width: 185px;"><big> <big style="font-weight: bold;">Capa 7</big></big><br> </div> <div style="position: absolute; left: 374px; top: 7px;"><big> <img style="width: 250px; height: 250px;" alt="" src=""></big><br> </div> <big> <br> </big> <div style="position: absolute; left: 115px; top: 113px;"><big style="font-weight: bold; font-family: Curlz MT;"><big><big>Sitio en construcción....</big></big></big><br> </div> <big><br> </big> <div style="position: absolute; left: 552px; top: 504px; height: 262px; width: 318px;"> <div style="text-align: center;"><big> <big style="font-weight: bold;">¡Contemos!</big></big><br> <big><big style="font-weight: bold;">Si desea manifestar su participación en <span style="font-style: italic;"><br> el lazo somos nosotros</span>, </big></big><br> </div> <div> <script type="text/javascript" src=""></script> </head> <body> <p> <a href="" onclick="gestionClic(); return false;">¡Haga clic aquí!</a> (Estamos: <span id="nbr_clics"> <?php $str = @file_get_contents('compteur/clickcount.data'); if($str !== FALSE) echo unserialize($str); else echo 0; ?></span>) </big></big></p> ;</div> <br> </div> <div style="position: absolute; left: 417px; top: 309px;"><big> Capa 6</big><br> </div> <div style="position: absolute; left: 56px; top: 315px; width: 135px; text-align: center;"><big><big> Capa 5</big></big><br> </div> <div style="position: absolute; left: 746px; top: 423px;"><big><big>Capa 3 Sitios</big></big><br> </div> </body></html>Todo esto es bastante complicado, disculpa.
Hasta pronto,
-
Uhhh...
Para empezar... tienes varias etiquetas <head> </head> en tu código... ¡no es posible!
Y en las etiquetas <head>... no deberías tener código html... solo las etiquetas meta, el título de tu página y, eventualmente, la carga de tus scripts JS
Script JS, por cierto... que no se carga ya que su etiqueta src está vacía!
Confirmo .. el hecho de que tu archivo sea index.html y no .php .. el código php no se interpreta ....
Es por eso que el contador no se muestra.
¿Puedes, además de tu index.html .. crear en la misma carpeta un archivo index.php y avisarme cuando esté hecho?
Hay que ir a ver en la url: https://letaucestnous.lescigales.org/index.php si funciona.
Si realmente no puedes modificar tu archivo a .php ... en ese caso no tendrás más remedio que hacer un ajax para leer la información y mostrarla en tu página. ( Podrás basarte fuertemente en el script que utilizaste para incrementar el número de clics .. )
En tu js, hacer una función getclic
var http; // Nuestro objeto XMLHttpRequest var urlAjax = './compteur/compteur.php'; var urlAjax2 = './compteur/compteur2.php'; function createRequestObject() { if(window.XMLHttpRequest) { // Mozilla, Safari, ... http = new XMLHttpRequest(); } else if(window.ActiveXObject){ // Internet Explorer http = new ActiveXObject("Microsoft.XMLHTTP"); } return http; } function gestionClic() { document.getElementById('nbr_clics').innerHTML = '<em>Cargando...</em>'; http = createRequestObject(); http.open('get', urlAjax, true); http.onreadystatechange = handleAJAXReturn; // Manejo de errores: http.onerror = function(error){ console.error( 'Error AJAX', error ); } http.send(null); } function getClic() { document.getElementById('nbr_clics').innerHTML = '<em>Cargando...</em>'; http = createRequestObject(); http.open('get', urlAjax2, true); http.onreadystatechange = handleAJAXReturn; // Manejo de errores: http.onerror = function(error){ console.error( 'Error AJAX', error ); } http.send(null); } function handleAJAXReturn() { if(http.readyState == 4) { if(http.status == 200){ document.getElementById('nbr_clics').innerHTML = http.responseText; } else { document.getElementById('nbr_clics').innerHTML = "<strong>N/A</strong>"; console.error( 'Error AJAX', http.status, http.responseText ); } } }Y crear un segundo archivo php
<?php // './compteur/compteur2.php'; sleep(1); $nbr = 0; //$str = @file_get_contents('clickcount.data'); $str = file_get_contents('./clickcount.data'); if($str !== FALSE) { $nbr = unserialize($str); } header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); echo $nbr; ?>Y en tu archivo index.html, hacer llamada a la función getClic cuando la página haya terminado de cargar
document.addEventListener("DOMContentLoaded", function() { getClic(); // llamamos a la función getClic una vez que la página ha cargado });-
-
Vas a decir que exagero, pero ¿cómo hago para poner una imagen en lugar de "haz clic aquí"? Lo había conseguido, pero ya no funciona... Esta es mi última pregunta, lo juro.
Es un poco aburrido esto del código de la página. Abrí una nueva pestaña para mostrar de nuevo el sitio, y los signos cabalísticos en lugar de las letras acentuadas han vuelto a aparecer...
-
Para la codificación, hay que usar utf8
ver aquí :
https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8
Luego, para tu imagen, debes ponerla en tu etiqueta <a>
<a href="" onclick="gestionClic(); return false;"> <img src="" alt="¡Haz clic aquí!"/> </a> (Estamos: <span id="nbr_clics"> <?php $str = @file_get_contents('compteur/clickcount.data'); if($str !== FALSE) echo unserialize($str); else echo 0; ?></span>) -
-
-