2013-03-21 3 views
1

나는 그것이 발생할 때마다 두 번 실행되는 쿼리를 사용합니다. 파일 전후에 로깅을 추가하고 스크립트를 실행하기 전에 파일을 지 웠습니다.INSERT INTO는 한 번 호출되었지만 두 번 실행됩니다 (루프가 아님).

다른 쿼리를 게시해야한다고 생각하지 않습니다.이 쿼리는 한 번만 호출됩니다.

코드 : 너무 실행 된 후이 두 번 호출 된 경우에도 즉시 return이 있음을

file_put_contents(
    $_SERVER['DOCUMENT_ROOT'].'/PDOErrors.txt', 
    "\n\nImmediately before ban query 1. ".date('r ')." (1)", 
    FILE_APPEND); 

$sth=$Mdbh->query(" 
    INSERT INTO 
     banned_IP 
    SET 
     ip_add  = '$ip', 
     proxy_ip = '$proxy_ip' 
"); 
$sth->execute(); 

file_put_contents(
    $_SERVER['DOCUMENT_ROOT'].'/PDOErrors.txt', 
    "\n\nBanned the user using query1. ".date('r ')." (2)", 
    FILE_APPEND); 

return 999; 

참고가 '아무튼 각 실행에 대한 진단 데이터를 표시 할 내 PDOErrors.txt 파일, 티.

PDOErrors.txt에 첫 번째 진단 데이터가 실행되지만 두 번째 진단 데이터는 실행되지 않습니다! 여기

내가 언급해야 PDOErrors.txt

Immediately before ban query 1. Thu, 21 Mar 2013 13:38:56 +0800 (1) 

exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '127.0.0.1' for key 'ip_add'' in /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper/public/includes/classes/loginAttempt.class.php:137 
Stack trace: 
#0 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/includes/classes/loginAttempt.class.php(137): PDOStatement->execute() 
#1 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/includes/classes/login.class.php(980): loginAttempt->recordLoginAttempt(Array) 
#2 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/ajax/login.user.php(25): Login->doLogin(Array) 
#3 {main} 

의 사본 각 실행 전에 완전히 비어 banned_IP 데이터베이스 테이블이.

이 개발 환경은 쿼리의 로그 아래 볼 수 있듯이 나는 또한 모든 쿼리를 기록하고 있습니다 :

708 Query  INSERT INTO 
         banned_IP 
       SET 
         ip_add   = '127.0.0.1', 
         proxy_ip  = '' 

708 Query  INSERT INTO 
         banned_IP 
       SET 
         ip_add   = '127.0.0.1', 
         proxy_ip  = '' 
708 Quit 

내가 쿼리 한 번으로 호출되는 것을 나는 만족 해요 생각 PDOErrors.txt에는 두 세트의 진단 데이터가 포함됩니다. 오류 메시지는 빈 데이터베이스 테이블에서 쿼리를 처음 실행할 때 생성 된 것으로 나타납니다. 이걸 일으키는 원인이 될 수 있니?

+0

내 페이지에 스크립트가 있었다, 한 번이 문제 같은이 있던 보이는 슬라이더 이미지를 기반으로 슬라이더 이미지를로드하고 각 이미지에 대한 새로운 요청이 있었고 URL 재 작성 때문에 모든 것이 내 index.php를 먼저 가리킨 다음로드되었습니다. 이 팁이 당신의 시스템 오작동이 정확히 무엇인지 확신 할 수 없기를 바랍니다. – MahanGM

+0

고마워요. @MahanGM, Firebug에 따라 제 경우에 적용되는지 모르겠지만 단 하나의 http 요청 만 보내지 만 귀하의 의견에 감사드립니다. –

+0

해결 방법을 찾았습니다. 데이터베이스 테이블은 unique로 인덱스 된 ip_add를 가졌지 만, 자동 증분 값을 가진'id' 컬럼을 추가했을 때 갑자기 에러가 발생하지 않았습니다. 스크립트가 두 번 이상 실행되면 PDOErrors.txt가이를 보여줄 것이므로 MySQL의 버그 여야합니다. 나는 이것이 거의 실행되지 않는 과정이기 때문에이 해결 방법이 나를 위해 충분하다고 생각한다. –

답변

2

PDO-> query는 쿼리를 실행하고 PDOStatement 객체를 반환 할 것이므로 이제이 오류를 일으키는 반환 된 PDOStatement를 다시 실행합니다.

사용 PDO->> PDOStatement 객체를 반환 한 다음 문을 실행하거나 PDO-를 사용하는 쿼리를 준비하고 PDOStatement을 실행하지 마십시오

관련 문제