2011-10-17 13 views
5

Devo creare un contatore per la sezione membri (contare il numero di volte che un utente ha effettuato il login).Il contatore non incrementa in PHP/MySQL

Ho il seguente script (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; 

Ora, quello che faccio nel mio file .htaccess è:

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

ma per qualche ragione il mio contatore non conta correttamente. Cosa mi manca?

+1

Assicurati di sapere tutto sull'iniezione SQL e sul filtro di input. – grossvogel

+0

Infatti. Non provare a inserire id 'mid = 1; elimina% 20da% 20members; -' nella url. :) – GolezTrol

+0

Ho pensato che il '([0-9] +)' lo impedirà, non è così? – Tech4Wilco

risposta

12

Si potrebbe probabilmente solo semplificare e procedere come segue:

$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); 

Non c'è bisogno di fare il check iniziale.

+0

+1 Non solo è più efficiente rispetto a due query, ma il blocco del database consente di evitare che più richieste simultanee vengano conteggiate come 1. – grossvogel

+0

Non è necessario effettuare 2 chiamate al database - Mi piace grazie – Tech4Wilco

+0

Pensiero intelligente. Meno rischi su problemi con conteggi simultanei in effetti. – GolezTrol

5

uso questo

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

o

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

o

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

sintassi:

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

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

+1 Non vedo cosa c'è di sbagliato in questo. Downvoter, ti interessa illuminarci? – grossvogel

+0

Inizialmente non è stato possibile risolvere la causa effettiva del problema. Ma sembra ok dopo aver copiato la mia risposta. ;-) Anche se potrebbe ancora annullare il mio downvote, perché almeno la risposta ora risolve il problema, anche se potrebbe fare con un po 'più di spiegazione. – GolezTrol

+0

@GolezTrol: Capisco. La tua risposta ha una spiegazione migliore di pre e post-incremento. Ti ho svalutato. – grossvogel

2

Il problema è nella linea

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

Questo dice in realtà:
- Assegnare il valore di vista a $ contare
- viste incremento.

ma si desidera:

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

che dice:
- viste incremento.
- Assegna il valore (incrementato) della vista a $ count

Una sottile differenza. : ~)