2010-03-05 77 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經常插入-4個重複行,而不是我期望的1。

沒有循環,沒有重定向...只是一個非常簡單的頁面加載。坦率地說,我相信這是我上次試圖這樣做時發生的。

更新只在生產

這並不在我的本地開發環境發生......(嚇人)。兩者共享完全相同的代碼......這可能是一個服務器的東西?

UPDATE NUMBER 2 我發現這似乎是在頁面打開和關閉時發生的。 AKA - 我檢查頁面打開時,腳本記錄搜索,然後...然後我檢查在頁面加載完畢的時候,和腳本似乎登錄搜索有作爲......

GAHHH

+0

您是否搜索過日誌? – thetaiko 2010-03-05 00:38:33

+2

爲什麼...錯誤? – johnnietheblack 2010-03-05 00:41:27

回答

0

我確定問題是,谷歌機器人跟隨一個人的網頁,以確定哪個谷歌廣告顯示觸發第二頁面加載,因此創建一個鏡像數據庫插入。有時會在單個頁面加載多次。

感嘆。 cmon google。

2

您的代碼示例沒有真正瞭解可能導致此問題的原因。

您的搜索結果分頁?如果是這樣,你確定只有滿足這些條件時才插入該行嗎?

  • 用戶是在第1
  • 用戶加載頁面1爲第一次。

這可能是你要麼將每個頁面負載,或者您是第1頁,這會導致重複,如果用戶訪問第2頁,並決定回到第1

+0

Andrew ...是的,我很抱歉 - 這裏有太多的代碼,我試圖挑選最相關的代碼。要回答你的問題......我一直在進行測試,搜索結果只產生一頁結果......大約2-3個結果。所以雖然我做了分頁...理論上它不應該做出不同的...對嗎? 請讓我知道,如果我可以給更多的信息,將有助於...我只是不想發佈我的整個頁面 – johnnietheblack 2010-03-05 00:58:07

0

總是插入診斷這個(IMHO)最好的方法是在查詢發生時簡單地將你的db查詢記錄到/ tmp中的一個文件中。你應該可以在你的db類中做到這一點。如果你使用fopen/fwrite進行日誌記錄,請確保你使用追加「a」模式而不是「w」,否則重複頁面請求會覆蓋日誌,並且你將無法判斷查詢是否運行多次。我經歷過好幾次頁面加載的次數達到2-3次,我不希望因爲我忘記了一些重定向。數據庫查詢日誌應該可以幫助您查看是否有格式錯誤的插入語句,或者是否有重複的插入語句正在運行。

+0

扎克,好主意......這就是我學到的東西。事實上,整個頁面上的整個查詢集都是每個負載運行兩次(或更多)。 沒有單個重定向...並且查詢不在循環中:( – johnnietheblack 2010-03-05 02:19:32

0

如果診斷代碼段越來越運行多次,並且你已經確定有沒有重定向頁面,則可以使用debug_backtrace看到調用堆棧是什麼您的功能後。控制器我不會重新定向,但它可能會在不同位置多次調用一段代碼。在多次調用的部分中使用調試回溯,然後當您退出調用堆棧時,在調用之前添加一行日誌記錄以說明「輸入函數」,然後在調用之後添加「離開函數」。

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"; 

最後,我想從我的筆記本電腦WGET-ING的URL,我的PHP腳本,它只在PHPMyAdmin中產生了一個新條目。然後我有了嘗試其他瀏覽器的天才想法。結果發現,由於某種原因,Chrome多次肆意點擊該頁面。放一個

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

在mysql_query行後解決了這個問題。如果我遵循良好的做法並在處理POST輸入後立即重定向到着陸頁,我甚至不會注意到這一點,因爲我最終打算這樣做。