2010-03-05 5 views
1

가 나는 사용자가 내 사이트에 만들고있는 검색을 추적하려는 결정, 그래서 나는 몇 가지 간단한 필드 '검색'라는 MySQL의 테이블을 생성하고, 모델 (클래스) 촉진하기 위해 저장된 검색의 삽입 및 관리PHP 신비 별도의 DB 삽입

검색을 저장 모델의 기능은 다음과 같습니다

public function create() { 
    $q = $this->db->query("INSERT INTO 
           `searches` (
            `section`, 
            `keywords`, 
            `results`, 
            `location`, 
            `date` 
           ) VALUES (
            %s, 
            %s, 
            %s, 
            %s, 
            %s 
           )", 
           $this->section, 
           $this->keywords, 
           $this->results, 
           $this->location, 
           date('Y-m-d G:i:s')); 
    $this->id = $this->db->last_insert($q); 
} 

... 그리고 페이지가로드 내 컨트롤러에 내가 가서 :

/* lets save the search if there is one */ 
    if(isset($_GET['q'])) { 
     $search = $this->load->model('Searches_Single',null); 
     $search->set('section','sale'); 
     $search->set('keywords',$_GET['q']); 
     $search->set('results',$grand_total); 
     $search->set('location',$this->location->id); 
     $search->create(); 
     unset($search); 
    } 

무엇 나를 이해할 수없는되는 것은 1이다 내가 예상 한 바로 1 대신에 -4 개의 복제 행이 삽입되는 경우가 종종 있습니다.

더 루프, 아니 리디렉션 ... 그냥 아주 간단한 pageload이 없습니다. 솔직하게, 나는 이것을 시도한 마지막 시간에 이런 일이 일어난 것으로 믿습니다.

UPDATE만을 생산

이 내 로컬 개발 환경에서 발생하지 않습니다 ... (무서운). 두 코드 모두 똑같은 코드를 공유합니다 ...이 코드가 서버 일 수 있습니까?

업데이트 번호 2 페이지 열기 및 닫기에서 이러한 현상이 나타나는 것으로 나타났습니다. AKA - 나는 페이지가 열리는 시간을 확인하고 ... 스크립트는 다음 검색을 기록 ... 그리고 나는 페이지가 로딩 완료 시간을 확인하고 스크립트뿐만 아니라 거기에 검색을 기록 할 것으로 보인다

GAHHH

+0

로그를 검색 했습니까? – thetaiko

+2

... 오류가 있습니까? – johnnietheblack

답변

0

내가 결정한 문제는 페이지로 이동하여 표시 할 Google 광고를 결정하는 사람이 두 번째 페이지로드를 트리거하여 미러 된 DB 삽입을 만드는 것입니다. 때로는 한 번에 여러 번로드됩니다.

한숨. cmon google.

2

코드 예제는 실제로이 문제의 원인에 대해 많은 정보를 제공하지 않습니다.

은 검색 결과 페이지를 매긴? 그렇다면 해당 조건이 충족 될 때만 행을 삽입 하시겠습니까?

  • 사용자 페이지 1
  • 처음로드 사용자 페이지 1이다.

당신이 중 하나를 각 페이지로드에 삽입하거나 사용자가 방문하는 페이지 2 페이지 1

+0

Andrew ... 예. 미안 해요. 내가 가장 적절한 코드를 선택하려고했습니다. 귀하의 질문에 대답하기 위해 ... 나는 어쨌든 한 페이지 만 결과를 생성하는 검색에 대해 테스트 해왔다 ... 약 2-3 개의 결과. 그래서 페이지 매기기를하는 동안 ... 이론적으로 다른 것을 만들지 않아야합니다 ... 맞습니까? 내가 도움이 될만한 정보를 줄 수 있는지 알려주세요 ... 전 단지 내 전체 페이지를 게시하고 싶지 않았습니다. – johnnietheblack

0

에 돌아와하기로 결정하면 중복을 야기 페이지 1, 항상 삽입되었는지하는 것이 가능하다 이 (IMHO)를 진단하는 가장 좋은 방법은 쿼리가 발생할 때 db 쿼리를/tmp에있는 파일에 기록하는 것입니다. db 클래스에서이 작업을 수행 할 수 있어야합니다. fopen/fwrite를 사용하여 로그하려면 "w"대신 append "a"모드를 사용하십시오. 그렇지 않으면 중복 된 페이지 요청이 로그를 덮어 쓰게되고 쿼리가 여러 번 실행되고 있음을 알 수 없게됩니다. 몇 번이나 페이지가 2-3 번로드되는 것을 경험했습니다. 리디렉션 때문에 잊어 버렸습니다. db 쿼리 로그는 잘못된 형식의 insert 문이 있는지 또는 중복 된 insert 문이 실행 중인지 확인하는 데 도움이됩니다. 코드의 섹션이 실행 여러 번 받고 있으며, 더 리디렉션이없는 결정했다면, 당신은 호출 스택이 기능에 뭐가 있는지 debug_backtrace을 사용할 수 있습니다 진단 후

+0

Zak, 좋은 생각 ... 여기 배운 내용이 있습니다. 실제로 전체 페이지의 전체 쿼리 집합은로드 당 두 번 (또는 그 이상) 실행됩니다. 리디렉션이 하나도 없으며 쿼리가 루프에 없습니다. ( – johnnietheblack

0

. 컨트롤러가 방향을 바꾸지 않아도되지만 다른 위치에서 코드 섹션을 여러 번 호출 할 수 있습니다.여러 번 호출되는 섹션에서 디버그 백 트레이스를 사용하고 호출 스택에서 나와 단계에서 호출하기 전에 "함수 입력"이라고 말한 로깅 행을 추가하고 호출 후에 "함수를 떠난다"라고 말하십시오.

1

추가되는 행이 삽입되는 것과 비슷한 문제가있었습니다. Perl의 명령 줄에서 INSERT 쿼리를 실행하면 문제가 없지만 작성할 수있는 PHP 스크립트는 하나의 행을 삽입하지 않습니다. 심지어 다른 물리적 서버를 시도하고 가상 머신, 모두가 간단한 가능한 코드를 시도하도록까지 갔다 : 결국

<?php 
mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error()); 
mysql_select_db("ci3") or die(mysql_error()); 
mysql_query("INSERT INTO trialsets (text) VALUES('values')"); 
header('Location: http://5.87.12.89/~tsbertalan/done.html') ; 

echo "done"; 

을, 나는 내 노트북에서 내 PHP 스크립트에 대한 URL을 WGET이 - 보내고 시도 , PHPMyAdmin에 새로운 항목이 하나만 생성되었습니다. 그런 다음 다른 브라우저를 사용해 보려는 천재적인 생각이 들었습니다. 크롬은 몇 가지 이유로 페이지를 여러 번 치고있었습니다. 는 mysql_query 라인이 문제를 해결 한 후

header('Location: http://5.87.12.89/~tsbertalan/done.html') ; 

라인 바로 퍼팅. 좋은 연습을 수행하고 POST 입력을 처리 한 직후 착륙 페이지로 리디렉션하면 결국 알았을 것입니다.