When encountering user registration and other situations, if you wait for the user to enter all the information, click the registration button to submit, and then verify whether the input is correct, the experience will be very bad, it will waste the user's time and increase the registration cost. Here is an example , demonstrates how to use ajax for single-step verification, using thinkphp 3.2 framework, environment WAMPServer 2.4, version PHP 5.4.16+ Apache 2.4.4+ MySql 5.6.12
1. Database design:
Database name thinkphp
Table name tp_user where tp_ is the table prefix, which can be defined in config.php. When operating the table, just use user
CREATE TABLE IF NOT EXISTS `tp_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2. Page design
3. HTML part
view/Index/index.html
4. thinkphp automatic verification
protected $_validate=array( array('username','require','用户名不能为空!'), array('username','','用户名已经存在',0,'unique',1), array('username','/^[a-zA-Z][a-zA-Z0-9_]{1,19}$/','用户名不合法!'), array('email','require','邮箱不能为空!'), array('email','email','邮箱格式不正确!'), array('email','','该邮箱已经注册过!',0,'unique',1), ); protected $_auto = array( array('password', 'md5', 1, 'function'), // 对password字段在新增的时候使md5函数处理 );
5. Use ajax
After the user enters the username, the blur event will be triggered when the input box loses focus. You can verify whether the username input is correct at this time
jQuery.post( url, [data], [callback], [type] ): Use POST method to make asynchronous requests
Parameters:
$('#username').blur( function() { var username = $(this).val(); $.post(index.php/Home/Index/checkName, { 'username' : username//前一个username需要跟UserModel对应,即跟数据库字段对应 }, function(data) { if (data == 0) { error['username'] = 0; $('#tooltip1').attr('class', 'tooltip-info visible-inline success'); } else { error['username'] = 1; $('#tooltip1').attr('class', 'tooltip-info visible-inline error'); $('#mess1').html(data); } }) return false; });
Password, repeat password, email verification are similar
You need to pay attention when verifying the email. If the user clicks the registration button immediately after entering the email, the click event of the registration button and the blur event of the email input box will be executed at the same time. Since the email verification is $.post, it is asynchronous. The post has not been executed yet, error['email']=1 in the click event, $('#submit1').submit(); will not be executed, so at this time, set a flag error['submit'] = 0;0 Indicates that the registration button has been clicked. The default is 1. In the email blur callback function, it is judged whether error['submit'] is equal to 0, that is, whether it has been clicked. If it has been clicked, the form is submitted. If not, only the email needs to be verified.
After the user enters the email address and clicks the mouse elsewhere on the screen, only blur will be executed, the same as the username and password.
6. Server processing
public function checkName() { $user = D ( 'user' ); if (! $user->create ()) { exit ( $user->getError () ); } else { echo 0;//这是回传给$.post的数据,对应上面的data } }
The above is the method of single-step verification of user name. Let’s see how to submit all data to the server
7. Submit all data to the server
Through the above html code, I noticed that a form is used here, the form is submitted in post mode, and the action points to the address that the server can handle
When clicking the registration button, first determine whether all inputs are correct. If correct, submit the form
$('#submit1').click(function() { if ($('#username').val() == '') { $('#tooltip1').attr('class', 'tooltip-info visible-inline error'); $('#mess1').html(用户名不能为空!); } if ($('#password').val() == '') { $('#tooltip2').attr('class', 'tooltip-info visible-inline error'); $('#mess2').html(密码不能为空!); } if ($('#repassword').val() == '') { $('#tooltip22').attr('class', 'tooltip-info visible-inline error'); $('#mess22').html(确认密码不能为空!); } if ($('#email').val() == '') { $('#tooltip3').attr('class', 'tooltip-info visible-inline error'); $('#mess3').html(邮箱不能为空!); } if (error['username'] == 1) { var scroll_offset = $(#tooltip1).offset(); // 如果用户名验证失败,屏幕会滚动到用户名的位置,让用户重新输入 $(body,html).animate({ scrollTop : scroll_offset.top // 让body的scrollTop等于pos的top,就实现了滚动 }, 0); return false; } else if (error['password'] == 1) { return false; } else if (error['email'] == 1) { error['submit'] = 0; return true; } else { $('#submit1').submit(); return true; } });
public function register() { $user = D ( 'user' ); if (! $user->create ()) { dump ( $user->getError () ); } $uid = $user->add (); if ($uid) { $_SESSION ['username'] = $_POST ['username']; $this->redirect ( 'Home/index' ); } else { $this->error ( 注册失败! ); } }
8. config.php configuration
<!--?php return array( /* 数据库配置 */ 'DB_TYPE' =--> 'mysql', // 数据库类型 'DB_HOST' => '127.0.0.1', // 服务器地址 'DB_NAME' => 'thinkphp', // 数据库名 'DB_USER' => 'root', // 用户名 'DB_PWD' => '123', // 密码 'DB_PORT' => '3306', // 端口 'DB_PREFIX' => 'tp_', // 数据库表前缀 );