CREATE TABLE user_login( login_name VARCHAR() 用户登录名,可以是“登录名”、“邮箱”或“手机号”登录 login_hash BIGINT 用户登录名的HASH码 user_id BIGINT 用户ID ); CREATE TABLE user_login0 LIKE user_login; CREATE TABLE user_login1 LIKE user_login; … … CREATE TABLE user_login100 LIKE user_login; ID与用户信息表,根据user_id分100张表CREATE TABLE user_info( user_id BIGINT 用户ID login_pwd CHAR() 用户登录密码 … … 其他信息,家庭住址、手机号、性别等等 ); CREATE TABLE user_info0 LIKE user_info; CREATE TABLE user_info1 LIKE user_info; … … CREATE TABLE user_info2 LIKE user_info;
依赖服务器:实现一个自增ID的服务(相当于oracle的sequence),也可以自己实现(用PHP+MySQL或者用C实现都可以)。目的是可以 从这个服务中取ID,每次取的ID数都是在上次基础上+1,和MySQL的autoincrement很像,只是不能在表内部自增。
注册流程:
1)验证用户名、邮箱、手机号、密码等格式。省略…
2)从服务中取一个ID,假设是115。
3)如果用户的登录类型是邮箱(如:$loginName='songhuan@zixue.it'),则在登录名前加上前缀登录名结果(如:$loginName='mail_songhuan@zixue.it')
4)求登录名的HASH值:$loginHash=md5($loginName); 对md5值hash,可以求asc码,或者用自己的算法,最后得出$loginHash=16位或32位的整数
5)$tableName = 'user_login' . ($loginHash%100),如果获取user_login表名,假如结果为user_login88。
$tableName = 'user_info' . (115%100),如果获取user_info表名。
6)执行SQL:
INSERT INTO user_login88 (login_name, login_hash, user_id) VALUES ('songhuan@zixue.it', 183239324323, 1); INSERT INTO user_info15 (user_id, login_pwd) VALUES (115, 'afieflefiefladifadfadfe');
1)如果用户的登录类型是邮箱(如:$loginName='songhuan@zixue.it'),则在登录名前加上前缀登录名结果(如:$loginName='mail_songhuan@zixue.it')
2)
$loginHash=ord(md5($loginName));
3)
$tableName = 'user_login' . ($loginHash%100);假如结果为user_login88
4)执行SQL:
SELECT id FROM user_login88 WHERE login_hash = $loginHash;
如果查询不到数据,则登录名不存在
5)如果能获取到,id=115,则
$tableName = 'user_info'.(115%100);SELECT id, pwd … FROM user_info15 WHERE id = 115;
6)匹配密码,如果密码不相等,返回false
7)如果密码相等,将用户ID加密放入COOKIE,将用户信息存入Memcache.
希望本文所述对大家的php程序设计有所帮助。