2

PHP 関数で少し問題が発生しています。

160 文字で 1 SMS クレジット、320 文字で 2 SMS クレジットを差し引く PHP 関数を作成しましたが、最近、151 文字または 160 未満のテキストでは 2 SMS クレジットが差し引かれることに気付きました。隠し文字があるのか​​、特定の文字列をエスケープしなかったのかはわかりません。

以下はPHPコードです。

//=== function to deduct credit per sms

function deduct_sms_credit( $user_id, $msg ) {
    $per_sms = 160;

    //calculate the no. Of sms pages with ceil() function
    $no_pg_sms = ceil( strlen( $msg ) / $per_sms );
    $sms_amount = $no_pg_sms;
    $query = "SELECT * FROM sms_history WHERE user_id=".$user_id."";
    $result = mysql_query( $query );
    while( $rs = mysql_fetch_array( $result ) ) {
        $remaining = $rs['remaining'] - $sms_amount;
        $spent = $rs['spent'] + $sms_amount;
    }
    $qupdate = "UPDATE sms_history SET `remaining` = ".$remaining.", `spent` = ".$spent." WHERE user_id = ".$user_id."";
    mysql_query( $qupdate );    
}

これを含むテキストメッセージを送信してみました:

親愛なるお客様、先週ログイン中に発生した問題についてお詫び申し上げます。以下のリンクに従ってパスワードをリセットしてください。http://bit.ly/i5ud1zhm,www.boltsns238.com

1 クレジットではなく 2 クレジットが請求されました。問題をトリム、エスケープ、または解決するための PHP 関数について助けが必要です。

4

2 に答える 2

0

私はあなたの機能を修正しました

function deduct_sms_credit( $user_id, $msg ) {
     $per_sms = 160;
     $no_pg_sms = 0;

     $len = mb_strlen($msg);

     if($len<=160)
     {
        $no_pg_sms = 0;
     }
     else if ($len % $per_sms == 0) {
         $no_pg_sms = $len / $per_sms;
      } else {
          $str_sms = chunk_split($msg,160,"|*|");
          $arr_sms = explode("|*|", $str_sms);
          foreach($arr_sms as $key=>$value)
          {
             if(mb_strlen($value) !== 0)
                 $no_pg_sms++;
          }
    }

    $sms_amount = $no_pg_sms;
    $query = "SELECT * FROM sms_history WHERE user_id=".$user_id."";
    $result = mysql_query( $query );
    while( $rs = mysql_fetch_array( $result ) ) {
      $remaining = $rs['remaining'] - $sms_amount;
      $spent = $rs['spent'] + $sms_amount;
  }
  $qupdate = "UPDATE sms_history SET `remaining` = ".$remaining.", `spent` = ".$spent."   WHERE user_id = ".$user_id."";
  mysql_query( $qupdate );    
  }

これを試して、私に知らせてください

于 2013-08-14T09:33:55.430 に答える
-1

たぶん、関数 mb_strlen を試す必要があります

http://ca3.php.net/manual/en/function.mb-strlen.php

考えられる問題は、Unicode 文字列またはその他のマルチバイト エンコーディング (utf-8 など) である $msg を渡していることです。その場合、strlen は 1 文字またはそれ以上ごとに 2 を返し、strlen を膨らませます。

//=== function to deduct credit per sms

function deduct_sms_credit( $user_id, $msg ) {
    $per_sms = 160;

    //calculate the no. Of sms pages with ceil() function
    $no_pg_sms = ceil( mb_strlen( $msg ) / $per_sms );
    $sms_amount = $no_pg_sms;
    $query = "SELECT * FROM sms_history WHERE user_id=".$user_id."";
    $result = mysql_query( $query );
    while( $rs = mysql_fetch_array( $result ) ) {
        $remaining = $rs['remaining'] - $sms_amount;
        $spent = $rs['spent'] + $sms_amount;
    }
    $qupdate = "UPDATE sms_history SET `remaining` = ".$remaining.", `spent` = ".$spent." WHERE user_id = ".$user_id."";
    mysql_query( $qupdate );    
}
于 2013-08-15T16:22:37.277 に答える