国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php教程 php手冊 PHP中將字符串轉化為整數(shù)(int) intval() printf() 性能測試

PHP中將字符串轉化為整數(shù)(int) intval() printf() 性能測試

Jun 13, 2016 pm 12:01 PM
int intval php printf sql 字串 效能 整數(shù) 概述 注入 測試 背景

背景、概述
  早在Sql注入橫行的前幾年,字符串轉化為整數(shù)就已經被列為每個web程序必備的操作了。web程序將get或post來的id、整數(shù)等值強制經過轉化函數(shù)轉化為整數(shù),過濾掉危險字符,盡可能降低系統(tǒng)本身被Sql注入的可能性。
  現(xiàn)如今,雖然Sql注入已經逐漸淡出歷史舞臺,但是,為了保證web程序的正常運行,減少出錯概率,更好的保證用的滿意度,我們同樣需要將用戶的不正確輸入轉化為我們所需要的。
轉化方式
  在PHP中,我們可以使用3種方式將字符串轉化為整數(shù)。
1.強制類型轉換方式
  強制類型轉換方式,就是“在要轉換的變量之前加上用括號括起來的目標類型”(摘自PHP手冊“類型戲法”節(jié))的方式。

復制代碼 代碼如下:


$foo = "1"; // $foo 是字符串類型
$bar = (int)$foo; // $bar 是整型
?>


  對于整型來說,強制轉換類型名稱為int或者integer。
2.內置函數(shù)方式
  內置函數(shù)方式,就是使用PHP的內置函數(shù)intval進行變量的轉換操作。

復制代碼 代碼如下:


$foo = "1"; // $foo 是字符串類型
$bar = intval($foo); // $bar 是整型
?>


  intval函數(shù)的格式為:
  int intval(mixed $var [, int $base]); (摘自PHP手冊)
  雖然PHP手冊中明確指出,intval()不能用于array和object的轉換。但是經過我測試,轉換array的時候不會出任何問題,轉換值為1,而不是想象中的0??峙率且驗樵赑HP內部,array類型的變量也被認為是非零值得緣故吧。轉換object的時候,PHP會給出如下的 notice:
  Object of class xxxx could not be converted to int in xxxxx.php on line xx
  轉換值同樣為1。
3.格式化字符串方式
  格式化字符串方式,是利用sprintf的%d格式化指定的變量,以達到類型轉換的目的。

復制代碼 代碼如下:


$foo = "1"; // $foo 是字符串類型
$bar = sprintf("%d", $foo); // $bar 是字符串類型
?>


  嚴格意義上講sprintf的轉換結果還是string型,因此它不應該算是字符串轉化為整數(shù)的方式。但是經過他處理之后的字符串值確實已經成為了“被強制轉化為字符串類型的整數(shù)”。
實際測試
  上面介紹了PHP中,將字符串轉化為整數(shù)的3種方式。對于一般的程序員來說,看到這里就算結束了,下面的部分是針對變態(tài)程序員的。
1.基本功能測試
  設定以下數(shù)組:

復制代碼 代碼如下:


$a[] = "1";
$a[] = "a1";
$a[] = "1a";
$a[] = "1a2";
$a[] = "0";
$a[] = array('4',2);
$a[] = "2.3";
$a[] = "-1";
$a[] = new Directory();
?>


  使用三種方式依次轉化上面給出的數(shù)組中的元素,查看轉換情況。程序源代碼如下:

復制代碼 代碼如下:


$a[] = "1";
$a[] = "a1";
$a[] = "1a";
$a[] = "1a2";
$a[] = "0";
$a[] = array('4',2);
$a[] = "2.3";
$a[] = "-1";
$a[] = new Directory();
// int
print "(int)
";
foreach($a as $v)
{
var_dump((int)$v);
print "
";
}
// intval
print "intval();
";
foreach($a as $v)
{
var_dump(intval($v));
print "
";
}
// sprintf
print "sprintf();
";
foreach($a as $v)
{
var_dump(sprintf("%d", $v));
print "
";
}
?>


  程序的最終運行結果如下(已經去掉轉換object時出現(xiàn)的notice):
(int)
int(1)
int(0)
int(1)
int(1)
int(0)
int(1)
int(2)
int(-1)
int(1)
intval();
int(1)
int(0)
int(1)
int(1)
int(0)
int(1)
int(2)
int(-1)
int(1)
sprintf();
string(1) "1"
string(1) "0"
string(1) "1"
string(1) "1"
string(1) "0"
string(1) "1"
string(1) "2"
string(2) "-1"
string(1) "1"
  由此可以看出,三種轉換的結果是完全一樣的。那么從功能上講,3種方式都可以勝任轉換工作,那么接下來的工作就是看哪一種效率更高了。
2.性能測試
  被測試字符串是我們在注入工作中可能會使用到的一種:

復制代碼 代碼如下:


$foo = "1';Select * ...";
?>
  獲取時間點的函數(shù)如下(用于獲取測試起始點和結束點,以計算消耗時間):

**
* Simple function to replicate PHP 5 behaviour
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
?>


 ?。ㄕ訮HP手冊microtime()函數(shù)節(jié))
  測試過程是使用每種方式轉換變量$foo 1000000次(100萬次),并將各自的消耗時間輸出,總共進行三組測試,盡可能降低誤差。測試程序如下:

復制代碼 代碼如下:


function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$foo = "1';Select * ...";

// (int)
$fStart = microtime_float();
for($i=0;$i{
$bar = (int)$foo;
}
$fEnd = microtime_float();
print "(int):" . ($fEnd - $fStart) . "s
";
// intval()
$fStart = microtime_float();
for($i=0;$i{
$bar = intval($foo);
}
$fEnd = microtime_float();
print "intval():" . ($fEnd - $fStart) . "s
";
// sprintf()
$fStart = microtime_float();
for($i=0;$i{
$bar = sprintf("%d", $foo);
}
$fEnd = microtime_float();
print "sprintf():" . ($fEnd - $fStart) . "s
";
?>


  最終的測試結果:
(int):0.67205619812012s
intval():1.1603000164032s
sprintf():2.1068270206451s
(int):0.66051411628723s
intval():1.1493890285492s
sprintf():2.1008238792419s
(int):0.66878795623779s
intval():1.1613430976868s
sprintf():2.0976209640503s

  雖然這個測試有點變態(tài)(誰會連續(xù)轉換100w次的整數(shù)?),但是由此可以看出,使用強制類型轉換將字符串轉化為整數(shù)速度是最快的。
總結
  使用強制類型轉換方式將字符串轉化為整數(shù)是最直接的轉化方式之一(可以直接獲得整型的變量值)。從代碼可讀性角度上講,sprintf方式代碼比較長,而且其結果有可能還需要再次進行強制類型轉換,而intval函數(shù)是典型的面向過程式轉換,強制類型轉換則比較直接的將“我要轉化”這個思想傳遞給閱讀者。從效率上講,強制類型轉換方式也是最快速的轉化方式。因此,對于經常進行轉化工作的程序員,我推薦使用這種方式。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何通過php中的索引訪問字符串中的字符 如何通過php中的索引訪問字符串中的字符 Jul 12, 2025 am 03:15 AM

在PHP中獲取字符串特定索引字符可用方括號或花括號,但推薦方括號;索引從0開始,超出範圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結果;實際應用中循環(huán)訪問前應檢查字符串長度,動態(tài)字符串需驗證有效性,多語言項目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

發(fā)電機如何在PHP中工作? 發(fā)電機如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

如何防止PHP中的會話劫持? 如何防止PHP中的會話劫持? Jul 11, 2025 am 03:15 AM

要防止PHP中的會話劫持,需採取以下措施:1.使用HTTPS加密傳輸並在php.ini中設置session.cookie_secure=1;2.設置安全Cookie屬性,包括httponly、secure和samesite;3.在用戶登錄或權限變更時調用session_regenerate_id(true)更換SessionID;4.限制Session生命週期,合理配置gc_maxlifetime並記錄用戶活動時間;5.禁止將SessionID暴露在URL中,設置session.use_only

php獲得字符串的第一個N字符 php獲得字符串的第一個N字符 Jul 11, 2025 am 03:17 AM

在PHP中取字符串前N個字符可用substr()或mb_substr(),具體步驟如下:1.使用substr($string,0,N)截取前N個字符,適用於ASCII字符且簡單高效;2.處理多字節(jié)字符(如中文)時應使用mb_substr($string,0,N,'UTF-8'),並確保啟用mbstring擴展;3.若字符串含HTML或空白字符,應先用strip_tags()去除標籤、trim()清理空格,再截取以保證結果乾淨。

PHP獲得字符串的最後N字符 PHP獲得字符串的最後N字符 Jul 11, 2025 am 03:17 AM

在PHP中獲取字符串最後N個字符主要有兩種方法:1.使用substr()函數(shù),通過負數(shù)起始位置截取,適用於單字節(jié)字符;2.使用mb_substr()函數(shù),支持多語言和UTF-8編碼,避免截斷非英文字符;3.可選地判斷字符串長度是否足夠以處理邊界情況;4.不推薦使用strrev() substr()的組合方式,因其對多字節(jié)字符不安全且效率低。

如何用urlencode在PHP中編碼字符串 如何用urlencode在PHP中編碼字符串 Jul 11, 2025 am 03:22 AM

urlencode()函數(shù)用於將字符串編碼為URL安全格式,其中非字母數(shù)字字符(除-、_和.外)會被替換為百分號後跟兩位十六進制數(shù)的形式。例如,空格轉為 號,感嘆號轉為!,而中文字符則轉換為其UTF-8編碼形式。使用時應僅對參數(shù)值進行編碼,而非整個URL,以避免破壞URL結構。對於URL的其他部分如路徑段,應使用rawurlencode()函數(shù),其將空格轉為 。處理數(shù)組參數(shù)時可使用http_build_query()自動編碼,或手動對每個值調用urlencode()以確保安全傳輸數(shù)據(jù)。正

如何在PHP中設置和獲取會話變量? 如何在PHP中設置和獲取會話變量? Jul 12, 2025 am 03:10 AM

要設置和獲取PHP中的會話變量,首先必須始終在腳本頂部調用session_start()以啟動會話。 1.設置會話變量時,使用$_SESSION超全局數(shù)組為特定鍵賦值,如$_SESSION['username']='john_doe';可存儲字符串、數(shù)字、數(shù)組甚至對象,但避免存儲過多數(shù)據(jù)以免影響性能。 2.獲取會話變量時,需先調用session_start(),然後通過鍵訪問$_SESSION數(shù)組,如echo$_SESSION['username'];建議使用isset()檢查變量是否存在以避免錯誤

如何防止PHP中的SQL注入 如何防止PHP中的SQL注入 Jul 12, 2025 am 03:02 AM

防止SQL注入在PHP中的關鍵方法包括:1.使用預處理語句(如PDO或MySQLi)分離SQL代碼和數(shù)據(jù);2.關閉模擬預處理模式確保真正預處理;3.對用戶輸入進行過濾和驗證,如使用is_numeric()和filter_var();4.避免直接拼接SQL字符串,改用參數(shù)綁定;5.生產環(huán)境關閉錯誤顯示並記錄錯誤日誌。這些措施從機制和細節(jié)上全面防範SQL注入風險。

See all articles