2010-04-24 80 views
0

我不知道爲什麼,但是這個代碼中的數據類型在url中的id以0開頭的時候很麻煩,如下所示: http://localhost/exp/update.php?id=03A43 在這種情況下,id是03A43。php中的數據類型問題

而且我的查詢是這樣的:

mysql_select_db("school", $con); 
    $result = mysql_query("SELECT * FROM student WHERE IDNO=".(int)$_GET['id']); 

?> 

有一個在設計上沒有問題,如果ID不與數字零開始。 從零開始的數字可能是什麼數據類型?

回答

0

引用您的字符串:

mysql_select_db("school", $con); 
$result = mysql_query("SELECT * FROM student WHERE IDNO='".$_GET['id']."'") 
+3

QUICK,每個人都訪問'http://localhost/exp/update.php?id =%27%3B - %0ADROP + TABLE + student + CASCADE%3B'。嚴重的是,該字符串需要使用'mysql_escape_string'進行轉義。 – 2010-04-24 04:33:19

+0

嗯...似乎我沒有在我的網站上的這個網站... – SeanJA 2010-04-24 04:42:31

+0

它可能會更好,如果一個人使用mysqli和準備好的陳述沒有? – SeanJA 2010-04-24 04:44:18

2

編輯: OP直到最近才發現該字段的類型是varchar而不是數字。因此,他/她應該這樣做:

mysql_query("SELECT * FROM student WHERE IDNO='" 
      . mysql_escape_string($_GET['id']) . "'"); 

對於後人,我原來的答案是:


它看起來像你試圖解析一個十六進制數,在這種情況下,你可以這樣做:

hexdec($_GET['id']) 

(int)x相同intval(x),默認爲基座10您的電話號碼,03A43,顯然不是10進制,所以PHP停止閱讀它當它到達A。您也可以說intval(x, 16)解析十六進制數字,但由於您將結果作爲字符串使用,因此十六進制可能會稍快一點點。

作爲一個無關的注意事項,許多編程語言將從0開始的數字視爲八進制而不是十進制。如果你說$myvar = 031;$myvar將被設置爲25。這也適用於JavaScript以及其parseInt函數。在PHP中,由於(int)intval默認爲10,所以intval('031')將爲31。但是,intval('031', 0)將爲25,因爲第二個參數0指示intval自動檢測基座。

+0

是的,那很奇怪。 – Ben 2010-04-24 04:33:46

+0

+1比我打擾更多的細節。 – 2010-04-24 14:15:40

0

數據庫中student.IDNO的類型是什麼?鑄造$_GET['id']到一個int將使它只是「3」,這似乎不是你想要的

+0

類型是varchar – user225269 2010-04-24 04:25:34

0

(int)03A43將輸出3。你確定那裏有A嗎?

另一方面,$_GET[]將始終是一個字符串。將一個字符串轉換爲一個int將刪除前導0。如果您需要領先的0只是不投它,離開字符串,因爲它。

+0

是的,有一個A,id號是由字母和數字組成 – user225269 2010-04-24 04:24:02

+0

然後DB中的id類型是一個VARCHAR,對嗎?如果是這樣,那麼不要把它作爲一個INT,你爲什麼要這樣做?此外,引用您的查詢「... ='」。$ _ GET ['id']。「'...;」 – Ben 2010-04-24 04:28:00

1

停止鑄造的字母數字字符串爲整數,如果你希望字符串保持不變。你爲什麼這樣做?此外,更重要的是,您至少需要逃避原始投入。在將其傳遞給mysql_query()之前,請撥打mysql_real_escape_string()