2011-11-21 18 views
5

親愛的所有。消毒整數時使用intval&real_escape_string

我在mysql數據庫的某些表中使用整數PK。在從PHP腳本輸入之前,我正在做一些清理,包括intval($ id)和$ mysqli-> real_escape_string()。

的查詢是很簡單

insert into `tblproducts`(`supplier_id`,`description`) values('$supplier_id','$description') 

在這個例子中,$說明經過real_escape_string(),而$ supplier_id僅是INTVAL()「版。

我只是好奇,如果有任何情況,當我需要將intval和real_escape_string應用於我插入到數據庫的整數?所以基本上我真的需要使用?

$supplier_id = intval($mysqli->real_escape_string($supplier_id)); 

謝謝。

+3

如果您要使用準備好的語句,所有額外的消毒和確保數據類型的努力將是多餘的。非常容易。 – mario

+0

謝謝你的評論。最初,DB類是在沒有預先聲明的情況下開發的,因此我需要重構基礎類,而不是同時打破工作基礎結構。因此,我正在考慮切換到準備聲明,因爲您提到的原因,但不是直接:) – paulus

+0

此外,據我所知,prep語句在大規模查詢中最有用,通常情況下不是這樣我的情況。因此,基本上切換到準備語句會增加(肯定不會減少)代碼量=>因此,可讀性和性能降低也受到質疑。在我看來,偶爾int和real_escape_strings會比prepare statement => bind => execute更快。除非我會開發某種超級元數據庫類來處理所有查詢,在我的情況下這意味着從頭開始重寫代碼。 – paulus

回答

9

intvalreal_escape_string更快的方式,因爲real_escape_string必須連接到數據庫並基於字符集/歸類進行轉義。

你也可以投中的int,如:

$val = (int)$val; 
因此

無需重複消毒

1

您不必使用$ mysqli->上的可變運行INTVAL後real_escape_string。 intval()將返回0,如果它不是一個整數,並且它是一個整數,它將返回值。

Example: 
$variable = '5'; 
$variable2 = 'c5b'; 
if(intval($variable)) echo 'It is a variable'; # intval will return 5 or true 
if(intval($variable2)) echo 'It is a variable'; # intval will return 0 or false since it has a letter 

有一些情況下,如果它被設置爲「5B」

+1

intval($ variable2)將返回5而不是0 – Derek

+0

我改變了這一點,並更新了答案,並在底部添加它,因爲我偶爾會發生這種情況,返回0,其他時間返回5 –

+0

現在你是對的! – Derek

0

考慮這樣的事情INTVAL將返回字符串中的第一個整數:

$x = "50 O'Brien Family Members at a Bar"; 

使用intval()會給你「轉義」值

50 

而real_escape_string會給y歐

50 O\'Brien Family Members at a Bar 

real_escape_ STRING()應該只用在你真的想在一個查詢中使用的字符串值。對於其他一切,請使用更合適的工具。