2011-10-17 33 views
5

Tôi cần tạo bộ đếm cho phần thành viên (đếm số lần người dùng đăng nhập).Số lượt truy cập không tăng trong PHP/MySQL

tôi đã kịch bản sau đây (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; 

Bây giờ, những gì tôi làm trong tập tin .htaccess của tôi là:

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

nhưng vì lý do nào đó, bộ đếm của tôi không được đếm chính xác. Tôi đang thiếu gì?

+1

Đảm bảo tìm hiểu tất cả về tính năng lọc SQL và lọc đầu vào. – grossvogel

+0

Thật vậy. Đừng cố gắng đặt id 'mid = 1; xóa% 20from% 20members; -' trong url. :) – GolezTrol

+0

Tôi nghĩ rằng '([0-9] +)' sẽ ngăn chặn điều đó, nó không? – Tech4Wilco

Trả lời

12

Bạn có thể có lẽ chỉ đơn giản hóa nó và làm như sau:

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

Không cần phải thực hiện kiểm tra ban đầu.

+0

+1 Không chỉ hiệu quả hơn việc thực hiện hai truy vấn, mà việc khóa cơ sở dữ liệu sẽ giúp ngăn không cho nhiều yêu cầu đồng thời được tính là 1. – grossvogel

+0

Không cần phải thực hiện 2 cuộc gọi cơ sở dữ liệu - Tôi thích cảm ơn – Tech4Wilco

+0

Suy nghĩ thông minh. Ít rủi ro về các vấn đề với số lượng đồng thời thực sự. – GolezTrol

5

sử dụng này

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

hoặc

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

hoặc

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

cú pháp:

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

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

+1 Tôi không thấy có gì sai với điều này. Downvoter, chăm sóc để khai sáng cho chúng tôi? – grossvogel

+0

Không thể giải quyết nguyên nhân thực sự của vấn đề lúc đầu. Nhưng có vẻ ok sau khi anh ấy sao chép câu trả lời của tôi. ;-) Mặc dù nó vẫn có thể làm Undone downvote của tôi, bởi vì ít nhất là câu trả lời bây giờ giải quyết vấn đề, mặc dù nó có thể làm với một chút giải thích thêm. – GolezTrol

+0

@GolezTrol: Tôi hiểu rồi. Câu trả lời của bạn có lời giải thích tốt hơn về trước và sau tăng dần. Tôi đã upvoted bạn. – grossvogel

2

Vấn đề là trong dòng

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

này thực sự nói:
- Gán giá trị của điểm đến $ đếm
- xem tăng dần.

Nhưng bạn muốn:

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

Mà nói:
- xem tăng dần.
- Gán giá trị (tăng) của chế độ xem thành $ count

Sự khác biệt tinh tế. : ~)

Các vấn đề liên quan