2010-11-27 78 views
15

Tengo una página action.php en el que corro una consulta SQL a través del código, por lo que cada vez que se ve la página de la consulta se ejecuta como sus páginas como contar vistasPHP: Detectar Actualizar página

<?php 
mysqli_query("UPDATE ****"); 
?> 

El problema es cuando la página se actualiza, la consulta se ejecuta & PÁGINA REFRESH se cuenta como una VISTA DE LA PÁGINA que quiero evitar.

      Pregunta: cómo evitarlo?

Lo que estoy buscando es una solución sencilla para que pueda comprobar

if(page was refresh) //some condition 
{ 
do 
} 
+0

¿hay algún atributo $ _SERVER [ ''] que sería diferente cuando una La página se dirige desde un enlace y la página se actualiza. Si es así, no hay problema para resolver este – Moon

+0

@Junaid Saeed: solo para que quede claro, ¿no desea contar cuando un usuario navega fuera de la página y luego navega hacia atrás? –

+0

No hay ningún cambio en la matriz $ _SERVER para la actualización de la página, por lo que se puede hacer mediante la sesión – Naresh

Respuesta

3

he resuelto el problema ... HURRAHHH con ninguna sesión & no hay galletas

la solución es una combinación de PHP: AJAX: JavaScript

la consulta que desea ejecutar en la carga de página & que no está en la página Actualícela como v IA AJAX llamada digamos que mi función por hacer eso es

function runQUERY() 
{ 
    xmlhttp=new XMLHttpRequest(); 
    xmlhttp.open("POST","doIT.php",false); 
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
    xmlhttp.send(); 
} 

y puedo simplemente marque con Javascript que la página es una nueva carga o su una actualización de la siguiente manera

<head> 
<script type="text/javascript"> 
function checkRefresh() 
{ 
    if(document.refreshForm.visited.value == "") 
    {   
     // This is a fresh page load 
      alert ('Fresh Load'); 
     document.refreshForm.visited.value = "1"; 
      ..call you AJAX function here 
    } 
    else 
    { 
     // This is a page refresh 
     alert ('Page has been Refreshed, The AJAX call was not made'); 

    } 
} 
</script>  
</head> 

<body onLoad="checkRefresh()"> 

<form name="refreshForm"> 
<input type="hidden" name="visited" value="" /> 
</form> 

</body> 
</html> 

y en su doIT.php sencillo añadir su código PHP que usted iba a poner en la página normal de

<?php 
mysql_query("UPDATE---------"); 
//put any code here, i won't run on any page refresh 
?> 
+4

Esto supone que los valores de formulario se conservan después de una actualización; esto es cierto en Firefox y IE, pero no en Chrome. – casablanca

+0

Bueno, entonces creo que es el problema de Google coincidir con los pasos al caminar ... y no seguir haciendo una pasarela .. pensando 'oh, puedo hacer esto porque ahora soy muy especial' – Moon

+5

No creo que este comportamiento te ' volver a ver en FF e IE es parte de cualquier estándar, y podría estar sujeto a cambios, inconsistente entre versiones de esos navegadores, no a prueba de futuro, etc. Cookie parece una solución mucho más confiable. –

6

Si sólo desea que se ejecute una vez para un usuario, me gustaría establecer una cookie de sesión y luego usar un if() declaración.

<?php 
session_start(); 

if (!$_SESSION['loaded']) 
{ 
    // insert query here 
} 

$_SESSION['loaded'] = true; 

?> 
+1

una vez que se haya fijado $ _SESSION ['loaded'] No podré hacer esta comprobación en ninguna otra página o en la misma página con diferentes parámetros como si tuviera las páginas de sanguijuelas ... a menos que la sesión se destruya y ii destruya la sesión si mi usuario está conectado, él \ ella será desconectada ... y esta sintaxis que usted ha dado arriba no funcionará ... la sintaxis correcta es Moon

+0

lo he solucionado, he publicado la solución de esto como respuesta a mi propia pregunta .. – Moon

11

No se puede detectar directamente una actualización de la página, pero se puede utilizar una cookie para simular lo que quiere:

if (isset($_COOKIE['action'])) { 
    // action already done 
} else { 
    setcookie('action'); 
    // run query 
} 

Dependiendo de sus necesidades, también tiene que decidir cuándo retirar el cookie y/o realizar la acción nuevamente.

1

Puede guardar una cookie que se asociará con la presente página y, si se hace clic en algún enlace, actualice la cookie con el nuevo nombre de página. Suponiendo que lo anterior se hace en Javascript, puede enviar esta actualizaciónInformación de cookies al servidor para notificar sobre un nuevo golpe de página.

U otro enfoque podría ser, puede especificar un encabezado HTTP que especifica después de cuánto tiempo se ha cumplido el caché en una página y de esa manera, el navegador incluso no le envíe una solicitud sobre carga de la página/actualización.

Ver http://www.mnot.net/cache_docs/#IMP-SCRIPT para obtener información sobre CACHING

Además, echa un vistazo a Etag vs expira en HTTP - ETag vs Header Expires

+0

Estoy de acuerdo con la cookie, pero cuando expresamente * refresca * una página, un navegador normalmente solicitará la página desde el servidor otra vez independientemente de la configuración de caché. – deceze

0

Aquí está la detección de actualización de la página utilizando la sesión simple, probarlo

<?php 
session_start(); 
if (!empty($_SESSION['count'])) 
{ 
session_destroy(); 

    //Code to run on Page Refresh 
} 
else 
$_SESSION['count']=1; 
?> 
1
//here you get the url behind the domain. 
    $currentPage = $_SERVER['REQUEST_URI']; 

    //if the session current page is not set. 
    if(!isset($_SESSION['currentPage'])){ 

     //set the session to the current page. 
     $_SESSION['currentPage'] = $currentPage;  
    } 

    //check if the session is not equal to the current page 
    if($_SESSION['currentPage'] != $currentPage){ 

     // if it's not equal you set the session again to the current page. 
     $_SESSION['currentPage'] = $currentPage; 

     //set the query you want to use 
    } 
20

me encontré con este fragmento here, y funcionó perfectamente para mí:

$pageWasRefreshed = isset($_SERVER['HTTP_CACHE_CONTROL']) && $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0'; 

if($pageWasRefreshed) { 
    //do something because page was refreshed; 
} else { 
    //do nothing; 
} 
+1

No funciona con el navegador Chrome y la solicitud POST. – user1032531

+0

Una solicitud POST no puede "actualizarse". Solo se puede enviar de nuevo. Por lo tanto, Chrome lo hace de la manera correcta y no envía los encabezados de caché equivalentes. @ user1032531 – Hafenkranich

3

Mejor wa y para detectar la actualización de la página. o no? (Ctrl + F5, F5, Ctrl + R, Introduzca)

$pageRefreshed = isset($_SERVER['HTTP_CACHE_CONTROL']) &&($_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0' || $_SERVER['HTTP_CACHE_CONTROL'] == 'no-cache'); 
if($pageRefreshed == 1){ 
    echo "Yes page Refreshed"; 
}else{ 
    //enter code here 
    echo "No"; 
} 
+0

Esto funciona, pero no en Chrome – Mesabloo

+0

A por el esfuerzo. (= – zero8

Cuestiones relacionadas