近期在做app开发的时候,因为要用到app登录功能,就自己写了个简单的iOS+PHP实现登录功能的demo,经过运行能够通过登录测试。
在开发过程中,也是碰到了各种各样的问题,经过不断的调试和改变方法,终于将所有的坑都基本上填满了,因此,将最终完整版的代码及相关流程记录在此,供自己及其它需要的人查阅使用。
一、一些约定条件
Mac OS真的是一个太太太封闭的系统环境了,封闭到我已经测试了N中办法,都没办法成功搭建后台服务器——不管是使用集成软件(如MAMP或者XAMPP),还是自行下载MySQL和MyAdmin客户端安装。有的时候Apache无法正常启动,有时候MySQL又故障掉了,更悲哀的是,真机测试时,客户端上输入内容后,无法正常与服务器通信!逼不得已,就只能放弃了,最终采用Windows的WIN7系统的电脑做后台服务器,然后与测试用的手机、编程用的Mac电脑处于同一无线局域网下。==如果哪位同仁能告知如何在MacBook上搭建后台服务器且能正常工作,欢迎不吝赐教,鄙人万分感激!==
当在装有WIN 7系统的电脑上配置服务器时,我使用的是WAMP集成软件,数据库和表的编辑操作使用的是SQLyog软件,这样可以有效的创建、修改表的内容。==注意,在WIN7的电脑上搭建完后台并创建好数据库之后,还需要进行局域网的配置工作,这样才能让处于同一局域网下的设备(如手机)连接到这台电脑及后台==。这个方法我也忘了,所以需要您和其他做PHP后台开发的同仁咨询。==如果您已经知道怎么做了,也欢迎不吝赐教,我好记录在本文章中,供更多人的来学习==。
一些约定条件如下
- [x] 手机客户端能成功连接后台服务器,并与后台服务器进行数据交互
- [x] 密码为原始输入的字符串,不经过MD5等加密方式的加密(正常开发时,请务必进行加密处理)
- [x] 传输方式选择GET传输(为了安全起见,最好使用POST传输方式)
- [x] 登录账号只选择手机号(正常开发时,登录的账号可能还有email或者用户名)
二、数据库和表的创建及初始化
使用SQLyog或者phpMyAdmin创建一个名为testAppDatabase的数据库,“基字符集”选择“utf8”,“数据库排序规则”选择“utf8_general_ci”,如下图所示(图像截取的是使用SQLyog软件创建数据库的情况,使用phpMyAdmin类似):
然后,在testAppDatabase数据库下,新建一个名为userInformationTable的表,“引擎”选择“InnoDB”,“字符集”选择“utf8”,“核对”选择“utf8_general_ci”,最后创建列名及每一列对应的数据类型以及是否可以为空等,并设置userID为主键、正数、自增,如下图所示(图像截取的是使用SQLyog软件创建表的情况,使用phpMyAdmin类似):
正常情况下,每一列都最好设置为“非空”,如果用户没有输入,那么可以默认使用“N/A”等填充,等用户输入了当前列对应的内容了,再替换掉“N/A”即可。
因为我们是做登录模块的验证,没有经过注册,因此,数据库中是没有信息的。我们可以手动先填写一些信息,供测试使用。填写好的内容如下图所示(使用的phpMyAdmin客户端插入的数据)
==注意,此时的密码是完全的明文密码,未进行任何加密,这主要是为了测试方便使用,正常开发时,请务必将保存到数据库中的密码进行加密处理。==
至此,数据库相关的“配置”就处理完了,下面是php代码相关的内容。
三、php代码
在php代码中,我们主要完成的是接收客户端传输过来的数据,并将数据与数据库进行匹配验证,一般验证的内容有两点:
- [x] 用户输入的账号是否存在
- [x] 用户输入的账号存在的情况下,账号和密码是否与数据库中的一一匹配
因此,我们的php代码主要就是围绕这两个逻辑来编写。
- 首先,编写数据库连接代码,并保存到其它用户读取不到的位置。
对php有一些了解的人应该知道,保存在htddoc路径(对于使用WAMP集成的环境来说,就是www文件夹下,如下图)下的文件,是可以被浏览器通过输入网址的方式读取到的,如果将登录数据库使用的账户和密码信息放到这个文件夹下,那么数据库是非常不安全的。
因此,我们通常将连接数据库需要的php代码单独编写并保存为“.php”格式的文件,然后将这个文件放置在与“www”同级的位置,如下图所示的“connectionToDB.php”文件。
使用php编辑器编辑“connectionToDB.php”文件,写入的代码如下:
connectionToDB.php
<?php
$dbc = mysqli_connect('192.168.1.101', 'root', '你设置的登录数据库的密码', 'testAppDatabase') or die("连接失败:".mysql_error());
//连接数据库的格式通常为
//$dbc = mysqli_connect(hostname, 登录账号, 登录密码, 数据库的名称) or die("连接失败:".mysql_error());
//hostname:一般是localhost,也常设置为作为后台的电脑的IP地址,查询的方法是“运行->cmd->ipconfig /all”,在控制台中找到IPv4地址。
//对于局域网,这个IP地址可能会不断的变化,因此,如果没有做IP固化的操作,每次使用后台服务器时,最好都加纳差一下这个IP地址,然后将“connectionToDB.php”中的IP地址换为正在使用的地址
//登录账号:一般是根用户root。如果不使用根用户,就使用数据库拥有者为你开辟的用户名和密码
//登录密码:对应登录账号的密码
//数据库名称:要连接的数据库的名称。一般一个产品只有一个数据库,该数据库中有很多的表
?>
==注意:php代码的编写,一定要使用utf-8的编码格式,这点要切记。下面提到的php文件均采用这种编码格式,将不再赘述。==
- 接着,编写和登录验证相关的php代码,将其保存为“login.php”文件并保存到www目录下,如下图所示:
“www”目录就想到于在浏览器中输入的localhost或者192.168.1.101这个IP地址,所以能看到,我们要编写的“login.php”在下两级目录下,知道这点这对于我们编写“login.php”文件中的某些代码是有必要的。
login.php
<?php
header('Content-type:text/html;charset=utf-8'); //代码的方式设置编码方式
require_once('../../../connectionToDB.php');
//一个"../"代表一级目录,
//因为我们的“connectionToDB.php”文件与“www”文件夹在同一级目录下
//从“login.php”追溯“connectionToDB.php”需要进过三级目录,所以需要三个"../"
$postedData = $_REQUEST; //$_REQUEST既可以获取到通过POST方式传输的数据,也可以获取到通过GET方式传输的数据
//获取用户输入的账号的形式:手机号、邮箱地址还是一般用户名
$userAccountType = $postedData['Account_Type'];
//获取用户输入的账号和密码
$userAccount = $postedData['User_Account'];
$userPassword = $postedData['User_Password'];
//根据账户形式获取对应的账号内容,用于后面的比对
//是否账号是否存在的标签以及是否登录成功的标签
$accountBeingOrNotFlag = "0"; //0代表账号不存在,1代表账号存在
$loginOKOrNotFlag = "0"; //0代表登录失败,1代表登录成功
switch ($userAccountType) {
case "Telephone": //账号是手机号
$q = "SELECT * FROM userinformationtable WHERE UserTelephoneNumber = $userAccount"; //查询数据库有没有这个手机号
$r = @mysqli_query($dbc, $q);
$rows = @mysqli_num_rows($r); //查询到的信息的行数,如果行数不是0,说明查询到了信息
if($rows) {
//行数不是0,说明有这个手机号,设置标签的值为1
$accountBeingOrNotFlag = "1"; //账号存在
//查询账号和密码是否匹配
$qA = "SELECT * FROM userinformationtable WHERE UserTelephoneNumber = '$userAccount' and UserPassword = '$userPassword'";
$rA = @mysqli_query($dbc, $qA);
$rowsA = @mysqli_num_rows($rA);
if($rowsA) {
//行数不是0,说明账号和密码匹配,设置标签值为1,登录成功
$loginOKOrNotFlag = "1";
}else {
//行数是0,说明账号和密码不匹配,设置标签值为0,登录失败
$loginOKOrNotFlag = "0";
}
}else {
//行数是0,说明账号不存在,设置标签值为0
$accountBeingOrNotFlag = "0";
}
//将标签值保存到数组中,然后将其传递给客户端,客户端根据标签值判断对应的操作逻辑
$returnArr = array("accountBeingOrNotFlag" => $accountBeingOrNotFlag, "loginOKOrNotFlag" => $loginOKOrNotFlag);
//下面的两行代码是方便测试使用,即将我们测试的一些内容保存到一个.log文件中,然后通过查看这个文件,看结果是否是我们想要的
$dccc = print_r($returnArr, true);
file_put_contents('C://Users/Administrator/Desktop/zj.log', $dccc);
//关闭数据库连接
mysqli_close($dbc);
//将要传递给客户端的结果信息通过json编码的形式输出
echo json_encode($returnArr);
break;
//下面的代码注释和上面的这个case里面的类似,不再赘述
case "EmailAddress":
$q = "SELECT * FROM userinformationtable WHERE UserEmailAddress = $userAccount";
$r = @mysqli_query($dbc, $q);
@$rows = mysql_num_rows(