我有張表,其主鍵id
字段為varchar(5)
,內容是5位隨機不重復字符串
表的內容大概是這樣的
id | name |
---|---|
s8bk2 | admin |
9f0ps | username |
在一個方法中我查詢了這張表,代碼大概是這樣的
function get($id = 0){ $q = query('select * from user where id='.$id); // 如果$q內有記錄時則顯示出來,無記錄時顯示用戶不存在 }
我不知道你們有沒有看出問題,我當時反正是覺得沒問題 於是代碼順利運行起來。后來發現了一個奇怪的問題,當我不傳入id(即$id=0)時,頁面總是顯示第一位用戶的信息,而不是報錯說用戶不存在 這就很奇怪了,我的表里既沒有id為0的用戶,也沒有id開頭是0的用戶,這到底是怎么回事? 檢查了一下sql查詢的返回值,居然把所有記錄都查出來了,這就更奇怪了 經過各種debug無果,我懷疑mysql和php一樣,具有一定的自動類型轉換功能 於是我給0加上了單引號,sql語句變為
select * from user where id='0'
執行之后,bug成功解決
看來的確如此,我的id字段是字符串型,當我用整數型0作為where條件去與其比對時,字符串id被自動轉為整數型,也就成了0。自然就把所有記錄都給匹配出來了