2017-01-10 36 views
1

因此,對於學校作業,我必須創建一個網站。該網站必須包含從文檔中獲取文章的功能。MySQL選擇查詢找到不應在PDO中找到的結果

例如,我可以用domain.com/content/article/1/顯示文章1。

然而,當我使用URL這樣domain.com/content/article/2aadd/它仍然顯示第2條 即使../10aadd/顯示第10條 如果我試圖請求一篇不存在的文章,如../11aadd(文章11不存在),它會顯示一個錯誤,它找不到文章,就像它應該。


我使用URL重寫,所以像這樣的domain.com/content/article/1/的URL改寫爲domain.com/index.php?c=content & A =文章& ARG = 1

我使用一個數據庫類,每一個選擇查詢被髮送到一個選擇查詢方法。它接受以下參數:

  • $ Q - 查詢
  • $ PARAMS - 與參數的陣列用於查詢
  • $取 - 的取出模式

以下參數發送爲了顯示文章:

  • select title,content from PHP2b_OOP_EIND_Articles where id =:id an d啓用= 1門
  • 陣列( 「ID」=> $ _ GET [ 「ARG」])
  • ASSOC

在該方法中的每一個呼叫正在被製備並用執行一個新的語句$ params數組作爲參數。


我甩了$ PARAMS陣列和它確實表明整個字符串(例如10aadd)。

我試過了,沒有乾淨的URL。

我試過查找它,但找不到任何東西。


這可能是什麼原因造成的?

回答

1

我懷疑你的MySQL表的id列被定義爲整數數據類型。

當您將字符串數據類型強制轉換爲整數時,您正體驗到MySQL的特殊性。

select CAST('10aaadd' AS INT) 

奇怪地給出值10

您的查詢在變量替換後顯示爲WHERE id = '10aaadd'

由於MySQL將該字符串隱式轉換爲int,因此它會找到id值爲10的行。

很奇怪,是吧?

如果您只希望在$ _GET或$ _POST參數中使用整數,最好檢查該參數,並在收到的值與預期值不符時拋出錯誤。 PHP's is_numeric() function可以爲你做到這一點。