2011-08-07 25 views
0

我在PHP中構建了一個自定義IPN處理程序,它驗證Paypal在回發中發送的數據,然後將其中的一些插入到sqlite數據庫中。爲什麼我的自定義IPN處理腳本停止執行?

腳本的每個部分都工作過。 交易報告爲有效,並記錄。一切正常,直到第32行,它調用一個自定義函數。

這裏的第32行: $sql = insert_query_builder("PP_Data", $keywords);

,這裏是函數的定義方式,在require()「d文件:

function insert_query_builder($table, $keywords, $info = NULL) { 
     $sql_1 = "INSERT INTO $table ("; 
     $sql_2 = ") VALUES ("; 
     foreach ($keywords as $num => $keyword) { 
      if (isset($info)) { 
       if ($num != (count($keywords - 1))) { 
        $sql_2 .= $db->quote($info[$keyword]) . ", "; 
        $sql_1 .= $keyword . ", "; 
       } else { 
        $sql_2 .= $db->quote($info[$keyword]) . ")"; 
        $sql_1 .= $keyword; 
       } 
      } else { 
       if ($num != (count($keywords - 1))) { 
        $sql_2 .= $db->quote($_POST[$keyword]) . ", "; 
        $sql_1 .= $keyword . ", "; 
       } else { 
        $sql_2 .= $db->quote($_POST[$keyword]) . ")"; 
        $sql_1 .= $keyword; 
       } 
      } 
     } 
     $sql = $sql_1 . $_sql_2; 
     return $sql; 
} 

此代碼工作過。它生成的SQL語句隨後在DB上使用,並且它負責數據庫中的某一行。

即便如此,它現在卻失敗了。該腳本適用,否則。

您可以找到所有使用的三個文件和日誌文件的完整副本。 正如你所看到的,它不會在自定義函數

之後寫入任何內容,並且當我在最後一個工作file_put_contents()之後立即停止工作。

任何想法?做一個php -f IPNrx.php不會給出輸出,並且記錄一個無效的事務,就像它應該那樣,但它不會測試該邏輯的那個分支。

編輯:有三個問題,其中兩個致命,一個陰沉。

首先,if語句應該閱讀if ($num != (count($keywords) - 1)),而不是if ($num != (count($keywords - 1)))

二,$ db對象是不是函數的範圍內,所以我需要在功能

第三頂部添加global $db ,最後還有一個額外的下劃線; $sql = $sql_1 . $_sql_2;應該是$sql = $sql_1 . $sql_2;

感謝一百萬人。沒有你的幫助,我從來沒有找到這些。

+0

檢查PHP錯誤日誌 –

+0

我以前檢查過它,但沒有任何有用的東西,除了關於設置時區(我照顧的)的警告。儘管如此,我正在使用tail來檢查它,現在我發現我錯過了一大堆致命錯誤,所有這些都與定義我的自定義函數的文件的第48行中的'不支持的操作數'有關。奇怪的是,第48行只是一個if語句。 'if($ num!=(count($ keywords - 1))){'並且錯誤僅在三小時前開始顯示 – FitzmorrisPR

+0

我發現我認爲是原始問題。那些if語句應該是:'if($ num!=(count($ keywords) - 1))'此外,由於某種原因,$ db'對象不可用。我必須通過$ GLOBALS數組訪問它。這意味着每一個我有'$ db-> quote($ somevar)'的地方'我需要''GLOBALS ['db'] - > quote($ somevar)''完成這兩個更改後,擺脫這個錯誤下劃線George Cummins指出,一切都很好。 – FitzmorrisPR

回答

0

該行引用了一個不存在的變量:

$sql = $sql_1 . $_sql_2; 

應該是:

$sql = $sql_1 . $sql_2; 

因此,查詢是無效的。在執行SQL查詢之後應該檢查輸出(例如,mysql_error())。

+1

哦,嘿! _that_在那裏有多久了?謝謝你的收穫。但是,我進去修復它,並再次進行測試。它仍然像以前一樣在第32行靜靜地停止執行。我將嘗試把我的調試金絲雀放到被調用的函數中。我會看看如果我能得到任何有用的信息 – FitzmorrisPR

+0

,那麼在if語句的else部分中會關閉括號。但額外的下劃線肯定是個問題 – FitzmorrisPR

+0

@FitzmorrisPR:我忽略了這一點。固定。 –