手裡有一段老代碼, 今天突然出BUG了,實際上這段代碼在某些伺服器上可以正常運 我已經修複 但是不清楚什麼原因導致BUG產生,所以
$edit=$_POST['edit']; $time=date("Y-m-d",time()-24*7*3600); $result =$db->fetch_all("select * from table where workid= $edit and scantime >\"". $time."\"");修複後 $edit=$_POST['edit']; $time=date("Y-m-d",time()-24*7*3600); $result =$db->fetch_all("select * from table where workid= $edit and scantime > $time ");主要是把]scantime >\"". $time."\"" 這個條件替換為 scantime > $time 就能正常擷取資料,區別是執行mysql語句的判定條件由 scantime >"2016-01-28" 修改為scantime > 2016-01-28 在$time前後是否拼接雙引號scantime 這個欄位的類型是datetime 事實上我之前的工作人員是用後一種寫法查詢不出資料知道改成前一種 ,今天我又改回來 ,不知道這個BUG原因究竟在哪 所以求助
回複內容:
手裡有一段老代碼, 今天突然出BUG了,實際上這段代碼在某些伺服器上可以正常運 我已經修複 但是不清楚什麼原因導致BUG產生,所以
$edit=$_POST['edit']; $time=date("Y-m-d",time()-24*7*3600); $result =$db->fetch_all("select * from table where workid= $edit and scantime >\"". $time."\"");修複後 $edit=$_POST['edit']; $time=date("Y-m-d",time()-24*7*3600); $result =$db->fetch_all("select * from table where workid= $edit and scantime > $time ");主要是把]scantime >\"". $time."\"" 這個條件替換為 scantime > $time 就能正常擷取資料,區別是執行mysql語句的判定條件由 scantime >"2016-01-28" 修改為scantime > 2016-01-28 在$time前後是否拼接雙引號scantime 這個欄位的類型是datetime 事實上我之前的工作人員是用後一種寫法查詢不出資料知道改成前一種 ,今天我又改回來 ,不知道這個BUG原因究竟在哪 所以求助
修改後 scantime > 2016-01-28
這個條件,由於 2016-01-28
不是合法的 DATETIME Literal,因此被轉為 '0000-00-00 00:00'
處理了。請檢查你查詢的結果,只要 scantime
這個欄位不為 NULL 都符合這個條件。
修改前不能正常擷取資料,請在 MySQL 用戶端手工執行相應查詢調試錯誤,確認資料是否存在。
根據 MySQL 文檔中,通常我們用單引號來包裹一個日期時間。
最後但很重要,這段代碼是非常危險的,從 $_POST
得到一個來自使用者(可能是駭客哦)的變數,不做任何 escape 處理就放到查詢裡,這存在 SQL 插入式攻擊的風險,是非常嚴重的安全隱患。