2013-10-24 2 views
0

매우 간단한 통계 스크립트를 만들려고합니다.PHP PDO 삽입이 없으면 지난 15 분

테이블이 data (ip, date, page)입니다. 지난 15 분 이후에 동일한 IP 및 페이지가없는 경우에만 ip 및 현재 페이지를이 테이블에 삽입하려고합니다.

는 여기에 내가 시도 마지막 SQL이다 :

INSERT INTO data (`ip` , `date` , `page`) 
SELECT (:ip , NULL , :page) 
WHERE NOT EXISTS (
    SELECT * FROM data 
    WHERE `ip` = :ip AND `page` = :page AND date BETWEEN timestamp(DATE_SUB(NOW(), INTERVAL 15 MINUTE)) AND timestamp(NOW()) 
) 

선택 내부 "없는 존재"단독으로 사용되는 경우 작동합니다. 도움을 주시면 감사하겠습니다. 이러한 질문에 나는 그것이 작동 얻을 관리

$sql = 'SELECT * FROM data 
    WHERE `ip` = :ip AND `page` = :page AND date BETWEEN timestamp(DATE_SUB(NOW(), INTERVAL 15 MINUTE)) AND timestamp(NOW())'; 
$sth = $pdo->prepare($sql); 
$sth->execute(array(':ip' => 'that ip', ':page' => 'that page')); 
if ($sth->rowCount() === 0) 
{ 
    $sql = 'INSERT INTO data (`ip` , `date` , `page`) 
VALUES (:ip , NULL , :page)'; 
    // etc. 
} 
+0

기본 키를 가지고 있습니까? 힌트 : 당신은 항상 프라이 머리 키를 가져야한다. (당신이 갖고 있지 않은 경우 MySQL은 당신을 위해 대리 키를 생성 할 것이다.) –

+0

기본 키가 없습니다. –

답변

0

, 감사 : PHP PDO INSERT WHERE NOT EXISTS statement not working 여기

은 "하지 존재하는"

+0

왜 -1, 주석없이 -1이 싫습니다 ... –

+0

tmp가 없으면 '모든 파생 테이블에 고유 한 별칭이 있어야합니다 .'라는 오류가 반환됩니다. 날짜가 자동 테이블 current_timestamp이기 때문에 NULL을 삽입합니다. –

+0

이 방법을 사용하면 유효성을 검사 할 수 있습니다. 전에 "select * from"을 사용하여 지금하고 싶은 것을 더 잘 이해합니다! – Asenar

-1

당신은이 SQL 쿼리를해야 할

유효하지 않습니다 작업 SQL :

INSERT INTO data (ip, date, page) 
SELECT * FROM (SELECT :ip , NULL, :page) as tmp 
WHERE NOT EXISTS (
    SELECT ip 
    FROM data 
    WHERE ip = :ip 
     AND page = :page 
     AND date >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) 
    LIMIT 1 
) 

문제는, 나는 확신 할 수 없다. 그것에 관하여 아주 것 및 나는 그것을 좋아하지 않는다 그래서 나는 정보를 더 찾아내는 것을 시도 할 것이다!

+1

둘 이상의 쿼리에서 테이블을 업데이트해야하는 경우 트랜잭션을 시작하는 것을 잊지 마십시오. 그렇지 않으면 경쟁 조건이 발생할 수 있습니다. – aspyct

+0

이 코드는 경쟁 조건의 대상이되어 많은 중복이 발생합니다. 트랜잭션이 거의 도움이되지 않을 것입니다 –

관련 문제