2011-10-17 13 views
5

Potrzebuję utworzyć licznik dla sekcji członków (policzyć ile razy użytkownik był zalogowany).Licznik nie zwiększa się w PHP/MySQL

Mam następujący scenariusz (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; 

Teraz, co zrobić w moim pliku .htaccess jest:

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

ale z jakiegoś powodu mój licznik nie liczy się poprawnie. czego mi brakuje?

+1

Pamiętaj, aby dowiedzieć się wszystkiego o wstrzykiwaniu SQL i filtrowaniu danych wejściowych. – grossvogel

+0

Rzeczywiście. Nie próbuj umieszczać id 'mid = 1; delete% 20from% 20members; -' w adresie URL. :) – GolezTrol

+0

Myślałem, że '([0-9] +)' zapobiegnie temu, to nie? – Tech4Wilco

Odpowiedz

12

można prawdopodobnie tylko uproszczenie go i wykonaj następujące czynności:

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

Nie trzeba zrobić wstępną kontrolę.

+0

+1 Nie tylko jest to bardziej wydajne niż wykonywanie dwóch zapytań, ale blokowanie bazy danych zapobiega wielokrotnym jednoczesnym żądaniom liczonym jako 1. – grossvogel

+0

Nie ma potrzeby wykonywania 2 połączeń z bazami danych - podoba mi się to dzięki – Tech4Wilco

+0

Inteligentne myślenie. Mniejsze ryzyko wystąpienia problemów z jednoczesnym liczeniem. – GolezTrol

5

zastosowanie tego

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

lub

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

lub

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

Składnia

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

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

+1 Nie widzę, co jest nie tak z tym. Downvoter, czy chcesz oświecić nas? – grossvogel

+0

Najpierw nie udało się rozwiązać rzeczywistej przyczyny problemu. Ale wydaje się, że jest w porządku po tym, jak skopiował moją odpowiedź. ;-) Mimo, że nadal może to zrobić, cofnij moje poparcie, ponieważ przynajmniej odpowiedź teraz rozwiązuje problem, chociaż może to zrobić z nieco większym wyjaśnieniem. – GolezTrol

+0

@GolezTrol: Rozumiem. Twoja odpowiedź ma lepsze wyjaśnienie przed i po inkrementacji. Przegapiłem cię. – grossvogel

2

Problem polega na linii

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

To rzeczywiście mówi:
- przypisać wartość celu $ liczyć
- widoki przyrost.

Ale chcesz:

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

który mówi:
- widoki przyrost.
- Przypisywanie (zwiększanej) wartości widoku do $ count

Subtelna różnica. : ~)

Powiązane problemy