A-A+

解决Ecshop通过UCenter整合会员后Email唯一性bug

2011年05月17日 Ecshop 评论 18 条

最近做的项目中要求ecshop通过ucenter整合discuz后,对用户的email不能出现重复。刚开始以为需要手动去实现,后来经过调研后发现原来ucenter其实已经想到了email唯一性判断的功能,通过ucenter设置一下就能简单实现email唯一性判断。如下图:

但是在测试的时候却发现,在ecshop用户的“会员信息”里修改email时,在新填写的email地址已存在的情况下,提示“XXXX@XXXX.com 已经存在”的信息,却仍然将用户的email地址修改为已存在的email了,但是ucenter用户表中的email却没有更新,因此导致了同一个用户在ecshop的用户表的email和在ucenter用户表里的email竟然不同了。说实话这个bug不小啊,虽不清楚这样的bug会照成什么后果,反正个人觉得这个问题有点严重,而且貌似现在ecshop官方都还不知道这个bug呢,这让我很想问一个问题,ecshop真的是一个所谓的成熟的电子商务系统么?

废话不多说了,本人研究一下这个bug发现,其实只是一个简单的逻辑错误而已(不知道是那个ec的开发者犯下的错误,在此口水一下他),要修复其实很简单的。

bug处理方法:

找到includesmodulesintegratesucenter.php

查找函数 “function edit_user

大概在 Line 300 左右

将此函数中的如下代码换个位置即可

        $set_str = '';

        $valarr =array('email'=>'email', 'gender'=>'sex', 'bday'=>'birthday');

        foreach ($cfg as $key => $val)

        {

            if ($key == 'username' || $key == 'password' || $key == 'old_password')

            {

                continue;

            }

            $set_str .= $valarr[$key] . '=' . "'$val',";

        }

        $set_str = substr($set_str, 0, -1);

        if (!empty($set_str))

        {

            $sql = "UPDATE " . $GLOBALS['ecs']->table('users') . " SET $set_str  WHERE user_name = '$cfg[username]'";

            $GLOBALS['db']->query($sql);

            $flag  = true;

        }

将以上代码放到如下代码的后面即可

        if (!empty($cfg['email']))

        {

            $ucresult = uc_call("uc_user_edit", array($cfg['username'], '', '', $cfg['email'], 1));

            if ($ucresult > 0 )

            {

                $flag = true;

            }

            elseif($ucresult == -4)

            {

                //echo 'Email 格式有误';

                $this->error = ERR_INVALID_EMAIL;


                return false;

            }

            elseif($ucresult == -5)

            {

                //echo 'Email 不允许注册';

                $this->error = ERR_INVALID_EMAIL;


                return false;

            }

            elseif($ucresult == -6)

            {

                //echo '该 Email 已经被注册';

                $this->error = ERR_EMAIL_EXISTS;


                return false;

            }

            elseif ($ucresult < 0 )

            {

                return false;

            }

        }

OK! 完事儿

这个修改后完整的“function edit_user”函数,给大家参照一下:

    /* 编辑用户信息 */

    function edit_user($cfg, $forget_pwd = '0')

    {

        $real_username = $cfg['username'];

        $cfg['username'] = addslashes($cfg['username']);


        if (!empty($cfg['email']))

        {

            $ucresult = uc_call("uc_user_edit", array($cfg['username'], '', '', $cfg['email'], 1));

            if ($ucresult > 0 )

            {

                $flag = true;

            }

            elseif($ucresult == -4)

            {

                //echo 'Email 格式有误';

                $this->error = ERR_INVALID_EMAIL;


                return false;

            }

            elseif($ucresult == -5)

            {

                //echo 'Email 不允许注册';

                $this->error = ERR_INVALID_EMAIL;


                return false;

            }

            elseif($ucresult == -6)

            {

                //echo '该 Email 已经被注册';

                $this->error = ERR_EMAIL_EXISTS;


                return false;

            }

            elseif ($ucresult < 0 )

            {

                return false;

            }

        }

        $set_str = '';

        $valarr =array('email'=>'email', 'gender'=>'sex', 'bday'=>'birthday');

        foreach ($cfg as $key => $val)

        {

            if ($key == 'username' || $key == 'password' || $key == 'old_password')

            {

                continue;

            }

            $set_str .= $valarr[$key] . '=' . "'$val',";

        }

        $set_str = substr($set_str, 0, -1);

        if (!empty($set_str))

        {

            $sql = "UPDATE " . $GLOBALS['ecs']->table('users') . " SET $set_str  WHERE user_name = '$cfg[username]'";

            $GLOBALS['db']->query($sql);

            $flag  = true;

        }

        if (!empty($cfg['old_password']) && !empty($cfg['password']) && $forget_pwd == 0)

        {

            $ucresult = uc_call("uc_user_edit", array($real_username, $cfg['old_password'], $cfg['password'], ''));

            if ($ucresult > 0 )

            {

                return true;

            }

            else

            {

                $this->error = ERR_INVALID_PASSWORD;

                return false;

            }

        }

        elseif (!empty($cfg['password']) && $forget_pwd == 1)

        {

            $ucresult = uc_call("uc_user_edit", array($real_username, '', $cfg['password'], '', '1'));

            if ($ucresult > 0 )

            {

                $flag = true;

            }

        }

        return true;

    }

本文完全原创,转载请注明本文来源:http://ljzxzxl.com/201105/category-368.html 破晓网络工作室

标签:

18 条留言  访客:18 条  博主:0 条

  1. 勾花网

    不错的文章,内容一气呵成.禁止此消息:nolinkok@163.com

  2. 胶管

    不错的文章,内容气吞山河.禁止此消息:nolinkok@163.com

  3. 明胶

    不错的文章,内容层次清晰.禁止此消息:nolinkok@163.com

  4. 边坡防护网

    好文章,内容远见卓识.禁止此消息:nolinkok@163.com

  5. 桥梁支座更换

    不错的文章,内容完美无缺.禁止此消息:nolinkok@163.com

  6. 雷诺护垫

    好文章,内容义正词严.禁止此消息:nolinkok@163.com

  7. 压滤机

    不错的文章,内容淋漓尽致.禁止此消息:nolinkok@163.com

  8. 格宾网

    好文章,内容淋漓尽致.禁止此消息:nolinkok@163.com

  9. 钢板网

    好文章,内容文风幽默.禁止此消息:nolinkok@163.com

  10. 环氧地坪施工

    不错的文章,内容完美无缺.禁止此消息:nolinkok@163.com

  11. 网格布

    不错的文章,内容文笔极佳.禁止此消息:nolinkok@163.com

  12. 勾花网

    好文章,内容十全十美.禁止此消息:nolinkok@163.com

  13. 玻璃钢管道

    不错的文章,内容出口成章.禁止此消息:nolinkok@163.com

  14. 硝基漆

    不错的文章,内容点石成金.禁止此消息:nolinkok@163.com

  15. 衡水人才网

    不错的文章,内容出口成章.禁止此消息:nolinkok@163.com

  16. 金属软管

    不错的文章,内容无与伦比.禁止此消息:nolinkok@163.com

  17. 防风抑尘网

    不错的文章,内容层次清晰.禁止此消息:nolinkok@163.com

  18. 压滤机

    不错的文章,内容气势磅礴.禁止此消息:nolinkok@163.com

给我留言

Copyright © 破晓Web实验室 保留所有权利.   Theme  Ality 沪ICP备14044094号

用户登录