【问题标题】:Sync phonebook using php使用php同步电话簿
【发布时间】:2017-04-14 06:25:24
【问题描述】:

我正在开发使用 yii2 框架同步联系人的网络服务。我在哪里有来自移动端的整个电话簿(在 json 数组中),我必须检查我的数据库中有哪些电话号码。

请求参数是这样的

{
    "user_id": "4",
    "user_details": [{
        "first_name": "A",
        "last_name": "A"

    }, {
        "first_name": "B",
        "last_name": "B"
        ,
        "mobile_number": ["(888) 888-888", "(777) 777-777"]
    }, {
        "first_name": "C",
        "last_name": "C",
        "mobile_number": ["+918000584123", "(666) 666-6666", "(555) 555-5555", "(444) 444-4444"]
    }]
}

为了实现我已经完成以下代码的功能。

public function actionSyncPhoneBook()
{
    $amResponse = $amResponseData = [];
    $snUserId   = $this->amData['user_id'];// Here i will get user_id
    if (!empty($this->omUser))
    {
        $userDetails                       = $this->amData['user_details'];//Here i will get array of user_details
        $amAppContacts =[];
        $amNonAppContacts = [];
        //I have loop here of user details to scan mobile number array
        foreach ($userDetails as $userKeys) 
        {
            //In case if mobile number array is not given  
            if(!empty($userKeys["mobile_number"]))
            {
                // Loop for scanning mobile numbers
                foreach ($userKeys["mobile_number"] as $key => $mobileNumber) 
                {
                    //regex for matching mobile number.
                    $phone = preg_replace('/[^a-zA-Z0-9+]/', '', $mobileNumber);
                    $oModelUser = Users::find()
                        ->where(['phone' => $phone])
                        ->one();
                        //Check if conttact is exists or not using exist method
                        $checkContactExists                        = Users::find()->where(['phone' => $phone])->exists();
                        if($checkContactExists                     == 1)
                        {
                            $oModelFriends                             = Friends::find()->where(["from_user_id"=>$snUserId,"to_user_id"=>$oModelUser->id])->asArray()->one();   
                            $amCheckPhoneNumber['user_id']             = !empty((string)$oModelUser->id) ? (string)$oModelUser->id  : '';
                            $amCheckPhoneNumber['first_name']          = !empty($oModelUser->first_name) ? $oModelUser->first_name  : '';
                            $amCheckPhoneNumber['last_name']           = !empty($oModelUser->last_name) ? $oModelUser->last_name  : '';
                            $amCheckPhoneNumber['email']               = !empty($oModelUser->email) ? $oModelUser->email  : '';
                            $amCheckPhoneNumber['phone']               = !empty($oModelUser->phone) ? $oModelUser->phone  : '';
                            $amCheckPhoneNumber['status']              = !empty((string)$oModelUser->status) ? (string)$oModelUser->status  : '';
                            $amCheckPhoneNumber['relationship_status'] = !empty($oModelUser->relationship_status) ? $oModelUser->relationship_status  : '';
                            $amCheckPhoneNumber['mobile_verified']     = !empty((string)$oModelUser->mobile_verified) ? (string)$oModelUser->mobile_verified  : '';
                            $amCheckPhoneNumber['email_verified']      = !empty($oModelUser->email_verified) ? $oModelUser->email_verified  : '';
                            $amCheckPhoneNumber['latitude']            = !empty($oModelUser->latitude) ? $oModelUser->latitude  : "0";
                            $amCheckPhoneNumber['longitude']           = !empty($oModelUser->longitude) ? $oModelUser->longitude  : "0";
                                if($oModelFriends["is_friend"] == 1)
                                {
                                        $amCheckPhoneNumber['is_friend']           = "friends";
                                }
                                    else
                                {
                                        $amCheckPhoneNumber['is_friend']           = "no_friends";
                                }

                            //User Image 
                            if(!empty($oModelUser->user_image))
                            {
                                if (filter_var($oModelUser->user_image, FILTER_VALIDATE_URL)) 
                                { 
                                    if(!empty($oModelUser->user_image))
                                    {
                                        $ssEventDetailsUserImage = $oModelUser->user_image;
                                    }
                                    else
                                    {
                                        $ssEventDetailsUserImage = Yii::$app->params['aws_cover_image_path'];
                                    }
                                }
                                else
                                {
                                    $ssEventDetailsUserImage =Yii::$app->params['aws_cover_image_path'];
                                }
                            }
                            else
                            {
                                $ssEventDetailsUserImage = Yii::$app->params['aws_cover_image_path'];
                            }   
                            //Cover  Image 
                            if(!empty($oModelUser->cover_image))
                            {
                                if (filter_var($oModelUser->cover_image, FILTER_VALIDATE_URL)) 
                                { 

                                    if(!empty($oModelUser->cover_image))
                                    {

                                        $ssCoverImage = $oModelUser->cover_image;
                                    }
                                    else
                                    {
                                        $ssCoverImage = Yii::$app->params['aws_cover_image_path'];
                                    }
                                }
                                else
                                {
                                    $ssCoverImage =Yii::$app->params['aws_cover_image_path'];
                                }
                            }
                            else
                            {
                                $ssCoverImage = Yii::$app->params['aws_cover_image_path'];
                            }                       
                            $amCheckPhoneNumber['cover_image']     = !empty($ssCoverImage) ? $ssCoverImage  : '';
                            $amCheckPhoneNumber['user_image']      = !empty($ssEventDetailsUserImage) ? $ssEventDetailsUserImage  : '';
                            $amCheckPhoneNumber['app_user'] = "1";
                            //Final Response of users those who are using application
                            $amAppContacts[]         = $amCheckPhoneNumber;
                    }
                    else
                    {
                          //Users who does not use application.
                          $otherUsers['user_id']             = !empty($userKeys['id']) ? $userKeys['id']  : '';
                          $otherUsers['first_name']          = !empty($userKeys['first_name']) ? $userKeys['first_name']  : '';
                          $otherUsers['last_name']           = !empty($userKeys['last_name']) ? $userKeys['last_name']  : '';
                          $otherUsers['email']               = !empty($userKeys['email']) ? $userKeys['email']  : '';
                          $otherUsers['phone']               = !empty($mobileNumber) ? $mobileNumber : '';
                          $otherUsers['status']              = !empty($userKeys['status']) ? $userKeys['status']  : '';
                          $otherUsers['relationship_status'] = !empty($userKeys['relationship_status']) ? $userKeys['relationship_status']  : '';
                          $otherUsers['user_image']          = Yii::$app->params['aws_cover_image_path'];
                          $otherUsers['cover_image']         = Yii::$app->params['aws_cover_image_path'];
                          $otherUsers['mobile_verified']     = !empty($userKeys['mobile_verified']) ? $userKeys['mobile_verified']  : '';
                          $otherUsers['email_verified']      = !empty($userKeys['email_verified']) ? $userKeys['email_verified']  : '';
                          $otherUsers['latitude']            = !empty($userKeys["latitude"]) ? $userKeys["latitude"]  : "0";
                          $otherUsers['longitude']           = !empty($userKeys["longitude"]) ? $userKeys["longitude"]  : "0";
                          $otherUsers['is_friend']           = "";
                          $otherUsers['app_user']     = "0";
                          //Final Response of users those who are not using  app.
                          $amNonAppContacts[] = $otherUsers;
                    }
                }
            }
        }
        //Merging the app users and non-app users together.
        $amResponseData = array_merge($amAppContacts,$amNonAppContacts);
        $amResponse     = Common:: successResponse("Sync your phonebook.",$amResponseData);                
        Common::encodeResponseJSON($amResponse);
    }
}

从上面的代码中,我正在检查数据库中是否存在手机号码,而不是将其推送到应用程序用户中,其余的将在非应用程序用户中。

在我的数据库中,手机号码以+(countryCode)(mobileNumber)的格式存储

示例 +918000584123

但如果我没有通过 +91 或任何国家/地区代码,它也应该可以工作。

如果手机号码数组像这样应该可以工作

"mobile_number": ["(888) 888-888", "(777) 777-777"] 

或者应该是这样的

"mobile_number": ["+918000584123","+91 8000584123","8000584123", "(666) 666-6666", "(555) 555-5555", "(444) 444-4444"]

如何实现这个功能?

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 由于您有多个国家/地区,因此您需要传递一些东西来验证它是来自 DOM 还是来自数据库字段。这将检查国家,然后检查电话号码.. 国家代码。
  • 是的,我们确实有全球应用程序,我们在注册过程中获取国家代码和手机号码,并将 +(countryCode)(mobileNumber) 存储到用户表中。
  • 只在输入框内,不允许用户输入国家代码,只允许用户输入手机号码并添加一个下拉菜单并获取所有国家代码并允许他们选择国家(在下拉菜单中)值 - 传递国家代码而不是国家名称).. 当您进行查询时,将两者结合起来进行搜索。
  • 是的,我们不允许用户手动输入国家代码,用户必须从下拉列表中选择国家并在文本框中输入手机号码,从移动端他们将国家代码和手机号码组合在一起,从后端我们存储的是相同的。
  • 好的..那么有什么问题呢?

标签: php mysql regex yii2


【解决方案1】:

不需要像这样的正则表达式

$phone = preg_replace('/[^a-zA-Z0-9+]/', '', $mobileNumber);

你可以使用

$phone = preg_replace('/[^0-9]/', '', $mobileNumber);

并像下面这样更改您的 where 条件。你应该使用 LIKE 条件

$oModelUser = Users::find()->where("phone LIKE'%".$phone."'")->one();    

$checkContactExists = Users::find()->where("phone LIKE '%".$phone."'")->exists();

【讨论】:

    【解决方案2】:

    你用mysql标记了它,所以我从那个角度回答。

    各种电话号码应该在一个单独的表中,连同他们所属的人的ID。这样,任何人都可以有任意数量的数字。我建议1:many,not many:many,干脆让偶尔共享的手机成为新表中的dup号码。

    该表将有一个关于数字的非唯一索引,从而使得在 SQL 中定位具有给定数字(或一组数字,使用 IN)的人变得“微不足道”。

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多