iT邦幫忙

DAY 19
2

遭遇PHP之經驗分享系列 第 19

[鐵人賽Day19]strlen與mb_strlen的差別與應用

  • 分享至 

  • xImage
  •  

想到先前有朋友問說:明明看抓出來的資料都一樣,也沒輸入錯誤,為什麼客戶會反應搜尋輸入時會找不到那筆資料呢?
我想了想,問他說:你在變數那有沒有加上trim()的函數?
假如沒有的話,有沒有可能是輸入時,前面或後面多了個空白呢?

之後,用了strlen()計算字數再跟經過trim後的字數做比對
果真,抓出了幾筆跟我說的狀況一樣的資料,也難怪搜尋時會找不到

strlen:計算的字串的長度
使用方法:strlen($string)
$string:為您要計算長度的字串資料
(參考資料:http://php.net/manual/en/function.strlen.php)

trim:清除字串前後的空白
使用方法:trim($string)
$string:為您要清除前後空白的字串資料
(參考資料:http://php.net/manual/en/function.trim.php)

以下模擬一個先前情況的範例,資料庫與程式碼如下:
資料庫:ithome_test
資料表:member_account
欄位 型別 Other
id int(5) PK、AI
username varchar(50)
(自行新增5~10筆資料,內含有前後空白的問題字串資料)

「strlen.php」

<?php
/* Connecting, selecting database */
$db_link = mysql_connect("127.0.0.1", "root", "");
if (!$db_link) {
   die("Could not connect: " . mysql_error());
}
mysql_select_db("ithome_test") or die("Could not select database");

/* Performing SQL query */
$sql="SELECT `username` FROM `member_account`";
$result=mysql_query($sql);

echo "<table>";
while($row=mysql_fetch_array($result)){
    $username=$row['username'];
    if(strlen($username)!=strlen(trim($username))){
        echo "<tr>";
        echo "<td>前後有加入空白的問題字串:".$username."</td>";
        echo "<td>原來字數:".strlen($username)."</td>";
        echo "<td>去除前後空白字數:".strlen(trim($username))."</td>";
        echo "</tr>";
    }
}
?>

輸出畫面如下:

而通常strlen常與mb_strlen來比較討論,而兩者有什麼差別嗎?
mb_strlen:計算字串的長度
使用方法:mb_strlen($string,$encoding)
$string:為您要計算長度的字串資料
$encoding:字串編碼,如果省略,則使用內部字串編碼
(參考資料:http://php.net/manual/en/function.mb-strlen.php)

兩個都是計算字串的長度,但差別是在strlen是計算字串字元的長度,而mb_strlen才是計算字串的長度
但是,英文與符號是看不出來的,假如是有中文字的話就有所不同了

Try一下就知道差別在哪,範例程式碼如下(mb_strlen字串編碼使用utf-8):
「mb_strlen.php」

<?php
    $str="iThome鐵人賽,真棒!";
    echo "本文:".$str."<br />";
    echo "strlen字數:".strlen($str)."<br />";
    echo "mb_strlen字數:".mb_strlen($str,'utf-8');
?>

輸出畫面如下:


上一篇
[鐵人賽Day18]使用Google API產生QR code
下一篇
[鐵人賽Day20]PHP表單搭配PHPMailer寄信-使用Gmail寄出
系列文
遭遇PHP之經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言