2011-10-17 16 views
5

Necesito crear un contador para la sección miembro (cuente el número de veces que un usuario inició sesión).El contador no se incrementa en PHP/MySQL

Tengo el siguiente guión (counter.php):

<?php 
    $conn = mysql_connect("localhost", "myuser", "mypass"); 
    mysql_select_db("test"); 

    $sql = "SELECT views FROM members WHERE mid = " . $_GET['mid'];  
    $result = mysql_query($sql); 
    if (!$result) 
     { 
     mail(ADMIN, 'Cannot Get: ' . mysql_error(), mysql_error()); 
     } 
    while ($row = mysql_fetch_assoc($result)) 
     { 
     $count = $row['views']++; 
     } 
    $query = "UPDATE members SET views = '$count' WHERE mid = " . $_GET['mid']; 
    mysql_query($query); 
    mysql_close($conn); 

    // show the logo using header() and readfile(); // that part work 
?> 

DB:

CREATE TABLE `members` (
    `mid` int(11) NOT NULL AUTO_INCREMENT, 
    `views` int(11) DEFAULT '0', 
    /* etc...*/ 
    PRIMARY KEY (`mid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Ahora, lo que hago en mi archivo .htaccess es:

RewriteEngine On 
RewriteRule ^img/logo([0-9]+).jpg$ /counter.php?mid=$1 [L] 

pero por alguna razón mi contador no cuenta correctamente. ¿Qué me estoy perdiendo?

+1

Asegúrese de aprender todo sobre inyección SQL y filtrado de entrada. – grossvogel

+0

De hecho. No intente poner el id 'mid = 1; delete% 20from% 20members; -' en la url. :) – GolezTrol

+0

Pensé que '([0-9] +)' impedirá eso, ¿no? – Tech4Wilco

Respuesta

12

Se podría probablemente sólo simplificar y hacer lo siguiente:

$query = "UPDATE members SET views = views + 1 WHERE mid = " . $_GET['mid']; 
mysql_query($query); 

if (mysql_affected_rows() == 0) { 
    mail(ADMIN, 'Cannot Get: ' . mysql_error(), mysql_error()); 
} 

mysql_close($conn); 

No hay necesidad de hacer comprobación inicial.

+0

+1 No solo es más eficiente que hacer dos consultas, pero el bloqueo de la base de datos ayudará a evitar que se cuenten varias solicitudes simultáneas como 1. – grossvogel

+0

No es necesario hacer 2 llamadas a la base de datos. Me gusta gracias – Tech4Wilco

+0

Pensamiento inteligente. Menos riesgo en problemas con conteos simultáneos de hecho. – GolezTrol

5

uso esta

$count = $row['views'] + 1; 

o

$count = ++$row['views']; 

o

$query = "UPDATE members SET views = views + 1 WHERE mid = " . $_GET['mid']; 

sintaxis:

$x = 1; 
$count = $x++; 
// $count = 1 

$x = 1; 
$count = ++$x; 
// $count = 2 
+0

+1 No veo lo que está mal con esto. Downvoter, ¿te importa iluminarnos? – grossvogel

+0

Al principio, no se solucionó la causa real del problema. Pero parece estar bien después de que él haya copiado mi respuesta. ;-) Aunque todavía podría deshacerse de mi voto negativo, porque al menos la respuesta ahora resuelve el problema, aunque podría hacer un poco más de explicación. – GolezTrol

+0

@GolezTrol: Ya veo. Su respuesta tiene una mejor explicación de incremento previo y posterior. Te he votado. – grossvogel

2

El problema está en la línea

$count = $row['views']++; 

Esta realidad dice:
- Asignar el valor de fin de contar
$ - vistas incremento.

pero que desea:

$count = ++$row['views']; 

que dice:
- vistas incremento.
- Asignar el valor (incrementado) de la vista a $ count

Una diferencia sutil. : ~)

Cuestiones relacionadas