2017-05-01 3 views
0

내 사이트 방문자에 대한 통계 스크립트를 만들려고합니다. 이를 위해 방문자의 IP를 날짜 및 경과 횟수와 함께 기록합니다. 첫 번째 방문 인 경우 데이터베이스의 모든 레코드에서 하지만 하루에 1 인당 1 패스를 계산하고 싶습니다. 는 IP가 이미 존재 경우, 날짜가 하루 다른 : 우리는 (+1)을 전달하는 수를 오늘의 날짜를 지정하고 증가 내가 뭘하려고 오전중복 삽입 키 업데이트 IF 문

.

문제 : 날짜가 다른 날짜와 다를 경우 변경되지만, IP가 이미 계산 된 경우에도 통과 횟수가 계속 증가합니다.

날짜 변경 ... 여기

내 테이블 구조 그것은 단지 다음날 수행해야

:

$IP_NewGuest = $_SERVER['REMOTE_ADDR']; 

$Today = date('d/m/Y'); 


$SQL = "INSERT INTO `ChartsGuests` (`IP_Guest` , `Date`, `Total`) VALUES ('".$IP_NewGuest."' , '".$Today."', 1) 
     ON DUPLICATE KEY UPDATE  
     Date = IF(Date != '".$Today."', VALUES(Date), '".$Today."'), 
     Total = IF(Date != '$Today', VALUES(Total), Total + 1)"; 



$REQ = $DB->prepare($SQL); 
$REQ->execute() or die(var_dump($REQ->errorInfo())); 

// echo $SQL; 
:

다음
-- 
-- Table structure for table `ChartsGuests` 
-- 

CREATE TABLE `ChartsGuests` (
    `IP_Guest` varchar(39) NOT NULL, 
    `Date` varchar(10) NOT NULL, 
    `Total` int(11) NOT NULL, 
    PRIMARY KEY (`IP_Guest`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB DEFAULT CHARSET=utf8; 

코드입니다

날짜가 바뀌면 다음 날에만해야합니다 ... 어디에 문제가 있는지 알 수 없습니다. 나는 "이중화 키"를 "IF"와 함께 사용하는 것은 이번이 처음입니다 ...

미리 감사드립니다!

+1

사용 https://piwik.org/을 더 많은 것을 얻게 될 것이고 바퀴를 재발 명할 필요가 없을 것입니다 .. 또한 SQL 매개 변수가 무엇인지 배우면 코드가 훨씬 안전합니다 – user3791372

+0

** 경고 ** : 이것은 심각한 [SQL injection 버그] (http : /bobby-tables.com/)'$ _GET' 데이터가 쿼리 내에서 사용되기 때문입니다. 가능하면 ** prepared statements **를 사용하십시오. 이것들은 [mysqli] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)와 [PDO] (http://php.net/manual/)에서 매우 간단합니다. en/pdo.prepared-statements.php) 어디에서 사용자가 제공 한 데이터는 나중에 사용되는 것에 따라'bind_param' 또는'execute'를 사용하여 채워지는'?'또는': name' 지시자로 지정됩니다. **'$ _POST' 또는'$ _GET' 데이터를 쿼리에 직접 입력하지 마십시오. – tadman

+1

MySQL은 날짜를 ISO-8601 형식으로, 즉 'YYYY-MM-DD'로 선호합니다. 비표준 형식을 사용하면 문제가 많으며 정렬 문제가 발생할 수 있으며 색인을 생성 할 수 없습니다. 데이터를 표시 할 때 원하는 형식으로 언제든지 형식을 지정할 수 있습니다.이 설정은 국가 별 설정이나 기본 설정에 따라 매우 특수한 경우가 많습니다. – tadman

답변

1

당신의 문제는 중복 키가 IP 주소에있는 것이지만 귀하의 테이블은 IP 주소/날짜 콤보마다 정말 고유합니다. 결과적으로 후일 방문은 전날의 행을 덮어 씁니다.

두 논리 필드에 합성 고유 키를 포함하도록 테이블의 논리를 변경하면 쿼리는 새로운 (IP, 날짜) 콤보에 대한 삽입을 생성하고 이미 본 (IP, 날짜) 콤보에 대한 업데이트를 생성합니다 .

당신은, 당신은 (현재 날짜 나 PHP) 조건을 필요로하지 않으며, 당신은 그냥 당신의 SQL 만들 수 수정 경우


INSERT INTO `ChartsGuests` (`IP_Guest` , `Date`, `Total`) 
VALUES ('".$IP_NewGuest."' , CURDATE(), 1) 
ON DUPLICATE KEY UPDATE Total = Total + 1)"; 
 
+0

내가 필요로하는 것은 하루에 한 번씩 각 IP 주소를 세고 마지막 방문 날짜를 갖는 것입니다. 나는 해결책이 훨씬 더 쉽다고 생각하고 또한 그것도 처리 할 수 ​​있다면 나를 맞을 것이다.나는 그것을 잘 설명 할 지 모르겠다. (내 영어로 변명해라, 나는 영어로 내 생각을 표현하기가 쉽지 않다.) –

+0

명확히하기 : 만약 10 명의 IP가 하루에 10 번씩 10 일간 방문한다면, 10 행 또는 100 행을 원하십니까? – Yahel

+0

마지막 방문 날짜 및 총 방문 횟수와 함께 각 IP에 대해 1 행 ... –