2012-01-17 281 views
9

這一直困擾着我最後兩個小時(接近三個小時) - 它只在一個平臺上顯現。爲什麼在Windows上運行PHP而不是在CentOS上只顯示此行?

下面是一個SQL表的方案:

CREATE TABLE cache (url     TINYTEXT, 
        data    MEDIUMTEXT, 
        retrieval_timestamp INT, 
        ttl     INT) 

現在,我的PHP代碼使用SQLite的PDO驅動程序在磁盤上創建一個數據庫文件。上面的SQL語句被執行並且表被創建。到目前爲止這麼好 - 我的所有測試機器都能成功執行該語句。

接下來,我將數據插入表中 - 再次,所有機器插入數據都沒有錯誤。由於SQLite將數據庫存儲在文件中,我只能在SQLite Database Browser中打開它並驗證是否插入了數據。

問題出現在這裏:我無法在運行PHP 5.2的CentOS機器上檢索數據。

下面是我使用的PHP代碼(並記住它工作在PHP 5.3在Windows上):

$statement = $this->database->prepare('SELECT data FROM cache WHERE url = ? AND retrieval_timestamp + ttl >= ?'); 

$statement->bindValue(1, $url); 
$statement->bindValue(2, time(), PDO::PARAM_INT); 

$statement->execute(); 

在CentOS的機器,上面的代碼執行不返回任何錯誤。但不是返回預期的行(其他機器以相同的查詢返回)我什麼也沒有 - 沒有行。如果我將SELECT data更改爲SELECT data, retrieval_timestamp + ttl,我實際上可以查看錶達式的結果並手動將其與當前時間戳進行比較 - 並且數據確實滿足條件,因此應該將結果返回到

如果我刪除WHERE條款的第二部分,預期數據返回,但當然,這違背了表:)

我在做什麼錯的目的是什麼?


更新:它變得怪異 - 當我手動使用query代替prepare並指定參數,它的工作原理(CentOS的機器上)。所以它看起來是準備好的語句的問題。

這裏是SQLite的文件:http://dl.dropbox.com/u/31080052/test.sqlite
這是我上運行的查詢:

SELECT data FROM cache WHERE url = 'c' AND retrieval_timestamp + ttl >= 1326780275 

回答

0

或多或少在黑暗中刺:你嘗試過改變問題的標誌爲「 :值「?即:

$statement = $this->database->prepare('SELECT data FROM cache WHERE url = :url AND retrieval_timestamp + ttl >= :rval'); 
$statement->bindValue(":url", $url); 
$statement->bindValue(":rval", time(), PDO::PARAM_INT); 

$statement->execute(); 
+0

是的,我害怕我做了 - 沒有區別。 – 2012-01-17 17:53:26

0

我沒有看過你連接SQLite的文件,但檢查正在使用的驅動程序/擴展版本 - SQLite中添加某些功能從一個版本到下一個。請在下面的文檔鏈接中查看有關遷移的部分。我很確定操作系統的差異不會使SQL停止工作。

http://www.sqlite.org/docs.html

1

你檢查是否時鐘兩臺機器上同步?

+0

是的,我確信這兩個時鐘是同步的(我已經重複檢查過) - 儘管它確實不會有什麼區別,因爲我對相同的數據運行了相同的查詢。 – 2012-01-18 21:26:13

1

兩個可能性,映入腦海:

  • 是CentOS的安裝32位?您是否嘗試讀取/寫入不適合32位int的時間戳?
  • 時間戳是否定的?很久以前,我們遇到了一個問題,那就是Debian似乎不支持負面時間戳,並且因爲Slackware而將一個項目從Slackware上移開,導致了各種各樣的問題。
+0

不幸的是,我不認爲這些都是選項,因爲當我使用'bindValue()'時,問題僅表現出來,而不是直接在查詢中插入完全相同的值。 – 2012-01-22 02:37:37

相關問題