[iOS+PHP]利用XAMPP搭建本地服务器, 编写PHP代码实现iOS端注册登录功能

本文可能会有错误, 或者不足的地方, 还请多多指正, 多多提宝贵意见!!!

在网上找了好多PHP端接收客户端发送的数据和文件的代码, 然后今天总结一下

首先在本地利用XAMPP(集成服务器开发安装包)ps: 很傻瓜, 一直下一步就可以了, 也特别强大!

然后编写PHP代码, 接收客户端iOS的请求, 进行相应处理! (实现一下前台和后台交互的全过程) 啊, 都由你自己来, 会发现好累!!! 废话不多说, 开始吧!

一. 安装本地服务器(XAMPP)

注意, 一定要使用我这个XAMPP安装包 (不然我的php文件里用的是php3的函数, 而百度下的最新的XAMPP里面集成的是php5的, 可能会出现问题)

给一个MAC版XAMPP安装包, 给种一枚!http://pan.baidu.com/s/1gecDFAb

双击运行.dmg安装包

双击

遇到错误请参考:http://www.cnblogs.com/lidongxu/p/5256351.html

等待是短暂的!!!

// ps: 这个网页你可以在地址栏输入localhost 或者 127.0.0.1 可以访问!

到此, 我们的XAMPP安装就基本完成了. 大家可以打开 Launchpad 看到XAMPP

在应用程序里, 找到XAMPP文件夹, 也可以看到XAMPP安装的东西,  manager-osx 是启动图标, 而uninstall是 反安装程序, 也就是运行它用于卸载(记住)

大家可以切换上面的上面的上面图片这个软件 标签到 -> Manage Servers 上, 确保3个选项都是Running 的状态, 直接点击Start All (当你要使用XAMPP的时候)

要确保都是Running的状态!

二. 配置MySql

在上面我们讲了 如何安装XAMPP

, 利用Apache软件把我们的电脑变成一个Web 服务器, 当然了别忘了启动那几个服务, 然后让这个软件一直开着的状态, 不要退出!(最小化就好了嘛!)

输入 localhost  或者 127.0.0.1 打开本地服务器, 然后点击右上角的, phpMyAdmin,

如果遇到错误请参考http://www.cnblogs.com/lidongxu/p/5256351.html

然后进入到这个页面: 添加新的数据库

然后输入数据库名字 , 然后点击创建

之后, 输入第一张表的名字,  (我这里输入Login)

然后添加字段, 比如我这里添加(userName  text类型,  password  text类型), 然后点击右下角. 保存按钮.

这样我们的数据库以及表和字段基本就建立完毕!!!

三.然后呢, 今天我们就来接触下PHP开发语言

首先呢, 需要在我们本机服务器文件夹资源下新建个.php文件,  废话嘛(你要写php啦!)

在register.php 输入以下代码

然后呢, 今天我们就来接触下PHP开发语言

首先呢, 需要在我们本机服务器文件夹资源下新建个.php文件,  废话嘛(你要写php啦!)

在register.php 输入以下代码

复制下面这段代码


$nameP = $_POST['name2'];

$passP = $_POST['pass2'];

$ageP = $_POST['age2'];

$telephoneP = $_POST['telephone2'];

// 2. 建立数据库连接 (127.0.0.1 数据库所在的ip地址)

// root 是数据库用户名(默认的)

// "" 密码(默认是空)

$con = mysql_connect("127.0.0.1", "root", "");

$myCon = mysql_select_db("lidongxu", $con);

// 3. 先查询, 如果存在就不要在插入了

$select = "select userName from User where userName = '$nameP'";

$seleResult = mysql_query($select);

// 4. 如果查到了, 说明已经存在这个用户了, 则返回-1给客户端代表已经注册过了

if (mysql_num_rows($seleResult)) {

// success 就是key值 对应的value 就是后面的字符串

$a = array();

$a['success'] = "-1";

$a['status'] = "have";

$arr = json_encode($a);

echo $arr;

}

// 5. 如果没注册过, 那么

else {

// 6. 把数据都插入到mysql数据库中

$sql = "insert into User values('$nameP', '$passP', '$ageP', '$telephoneP')";

$result = mysql_query($sql);

if ($result == 1) { // 7. 代表执行成功

$a=array();$a['success'] ="1";$a['status'] ="ok";$arr= json_encode($a);echo$arr;

}

else { // 8. 代表插入失败

$a=array();$a['success'] ="0";$a['status'] ="no";$arr= json_encode($a);echo$arr;

}

}

// 9. 接收用户头像图片

// 9.1. 接收图片传到服务器上默认的临时文件路径以及名字 (uploadfile 给前台使用的

// 字段)

$url = $_FILES["uploadimageFile"]["tmp_name"];

// 9.2 获取根路径下的downloads文件夹下的路径(download2 需要手动

// 去本地创建)

$destination_folder = $_SERVER['DOCUMENT_ROOT'].'/download2/';

// 9.3拼接要作为服务器上保存的文件名字

$newfname = $destination_folder .(string)$nameP.'.jpg'; //set your file ext

// 打开连接  rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。

// 获取客户端上传到缓存文件夹下的文件

$file = fopen ($url, "rb");

if ($file) {

// a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

// 获取要把客户端传递过来的文件复制到新的文件夹下的名字

$newf = fopen ($newfname, "a");

if ($newf)

// 检查文件是否结束,如结束,则返回非零值

while(!feof($file)) {

// 开始从某个文件读取1MB 然后写入到新的路径1MBfwrite($newf, fread($file,1024*8),1024*8);

}

}

if ($file) {

// 关闭文件链接

fclose($file);

}

if ($newf) {

fclose($newf);

}

?>

复制代码结束

然后在本地服务器文件夹下新建download2文件夹

Paste_Image.png

然后再把登录的php代码也写了吧!在htdocs文件夹下, 新建loginGet.php文件 然后插入代码

复制代码开始


// 1. 获取GET网络请求网址里的key值对应的value

// 声明变量name1 和pass1 接收

$name1 = $_GET['name'];

$pass1 = $_GET['pass'];

// 2. 建立数据库连接

// 参数1: 数据库所在的服务器的地址(本机127.0.0.1或者localhost)

// 参数2: MySql数据库的账户(默认root)

// 参数3: MySql数据库的密码(默认无)

$con = mysql_connect("127.0.0.1", "root", "");

// 参数1: 自己建立的数据库的名字

$myCon = mysql_select_db("lidongxu", $con);

// 3. 执行查询 (利用用户名和密码进行匹配查找, 如果找到了随意返回userName(用户名))

$sql = "select * from User where userName = '$name1' And password = '$pass1'";

// 4. 接收结果

$result = mysql_query($sql);

// 4.2 如果查询结果为空的话

if(mysql_num_rows($result) == 0) {

$a = array();

$a['success'] = "0";

$a['name'] = "null";

$a['status'] = "no";

$arr = json_encode($a);

echo $arr;

}

else {

// 5. 取出本条记录

$row = mysql_fetch_row($result);

$a = array();

$a['success'] = "1";

$a['name'] = $row[0];

$a['age'] = $row[2];

$a['telephone'] = $row[3];

$a['status'] = "ok";

$arr = json_encode($a);

echo $arr;

}

?>

代码复制结束

到此, php暂时告一段路, 然后进行iOS段代码开发(开心不???)

四.然后, 那么我们来看看iOS端代码如何实现.

ViewContrller.m (主要类) 可能里面用到了自己定义的类LoginView  请去GitHubhttps://github.com/lidongxuwork/iOS-to-PHP上下载源代码(顺路给个星哈, 谢谢!!!)

//  ViewController.m

//  php

//

//  Created by 李东旭 on 16/2/25.

//  Copyright © 2016年 李东旭. All rights reserved.

//

#import "ViewController.h"

#import "MainViewController.h"

#import "Define.h"

@interface ViewController ()

@property (nonatomic, strong) LoginViewloginR;

@end

@implementation ViewController

-(void)viewDidLoad {

[super viewDidLoad];

#warning 1. 创建登录注册页面

// 登录注册类调用

self.loginR = [[LoginView alloc] initWithFrame:self.view.frame];

#warning 2. 签代理 代理方法可以拿到登录信息和注册信息

_loginR.delegate = self;

[self.view addSubview:_loginR];

}

#pragma mark - LoginView delegate

#warning 3. 根据不同的后台给的字段 代表的意思 以及值进行不同处理

- (void)getLoginName:(NSString)name pass:(NSString)pass

{

// 调用登录验证接口 (这里用get网络请求的方式, 和post网络请求的方式)

NSStringurl = @"http://127.0.0.1/loginGet.php";

// 后台规定登录用户名的字段必须是name密码的pass

NSDictionarydic = @{@"name":name, @"pass":pass};

// 网络请求有点特殊 点进去看

[LDXNetWork GetThePHPWithURL:url par:dic success:^(id responseObject) {

// 后台返回的字典里 如果success对应的value是1代表登录成功

if ([responseObject[@"success"] isEqualToString:@"1"]) {

MainViewControllermainVC = [[MainViewController alloc] init];

mainVC.dic = responseObject;

[self presentViewController:mainVC animated:YES completion:nil];

}

else {

[self showTheAlertView:self andAfterDissmiss:1.0 title:@"账号或密码错误" message:@""];

}

} error:^(NSErrorerror) {

NSLog(@"%@", error);

}];

}

- (void)getRegisterName:(NSString)name pass:(NSString)pass age:(NSString)age telephone:(NSString)telephone image:(UIImage)image

{

NSStringurl = @"http://127.0.0.1/register.php";

NSDictionarydic = @{@"name2":name, @"pass2":pass, @"age2":age, @"telephone2":telephone};

// 网络请求有点特殊点进去看 (@"uploadimageFile" 后台给的字段)

[LDXNetWork PostThePHPWithURL:url par:dic image:image uploadName:@"uploadimageFile" success:^(id response) {

NSStringsuccess = response[@"success"];

if ([success isEqualToString:@"1"]) {

// 代表注册成功

[self showTheAlertView:self andAfterDissmiss:1.5 title:@"注册成功" message:@""];

// 跳转回到登录界面

[_loginR goToLoginView];

}

else if([success isEqualToString:@"-1"]){

[self showTheAlertView:self andAfterDissmiss:1.5 title:@"账号已经被注册了" message:@""];

}

} error:^(NSErrorerror) {

NSLog(@"%@", error);

}];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

MainViewController.h  登录到的界面

//

//  MainViewController.h

//  php

//

//  Created by 李东旭 on 16/3/11.

//  Copyright © 2016年 李东旭. All rights reserved.

//

#import

@interface MainViewController : UIViewController

@property (nonatomic, strong) NSDictionary *dic;

@end

MainViewController.m

//

//  MainViewController.m

//  php

//

//  Created by 李东旭 on 16/3/11.

//  Copyright © 2016年 李东旭. All rights reserved.

//

#import "MainViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

UIImageViewimageV = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];

imageV.backgroundColor = [UIColor greenColor];

// 取出用户名对应的头部图片

NSStringimageValue = self.dic[@"name"];

#warning 5. 直接在这里进行网址路径拼接, 因为不同用户要取不同的头像图片, 图片都保存在服务器的一个叫download2文件夹, 里面图片是根据用户名加.jpg来获取的

NSStringurl = [NSString stringWithFormat:@"%@/%@.jpg", @"http://127.0.0.1/download2", imageValue];

// 同步加载图片

NSDatadata = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];

UIImageimage = [UIImage imageWithData:data];

[imageV setImage:image];

[self.view addSubview:imageV];

// 循环创建label, 从请求下来传过来的字典里, 拿出指定的字段的value值显示

NSArrayarr = @[@"name", @"age", @"telephone"];

for (int i = 0; i < 3; i++) {

CGFloat offY = 320;

UILabellabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 320 + i50, 250, 40)];

[self.view addSubview:label];

NSStrings = arr[i];

NSStringvalue = self.dic[s];

label.text = [NSString stringWithFormat:@"%@: %@", s, value];

}

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

注意: 你可能运行的时候, 遇到这个问题 failed to open stream: No such file or directory

解决方法: 在本地服务器路径文件夹下建立文件夹 download2

错误2:

没有权限 我们就给权限被 哈哈哈哈

然后回车 就可以啦.  然后回到Xcode 重新运行应该就没问题啦!!

本文可能会有错误, 或者不足的地方, 还请多多指正, 多多提宝贵意见!!!

以上文件, 以及项目代码, 都在这里  看过来->  (顺路给个星哦~~~)

iOS端

https://github.com/lidongxuwork/iOS-to-PHP

PHP端

https://github.com/lidongxuwork/Register-Login-PHP


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • php面试题及答案(转载)收藏 基础题: 1.表单中 get与post提交方法的区别? 答:get是发送请求HTT...
    积_渐阅读 1,624评论 0 37
  • 一、MemCache简介 session MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存...
    李伟铭MIng阅读 3,783评论 2 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 作业: 1. 好好思考一下,你有没有一个写文章时可供征引阐发的资源库?如果有,是哪一方面,已经读过了哪些书籍,有什...
    静待花开_7b5d阅读 148评论 2 1
  • 红莲死死地盯着门口,脚步声越来越近。“红莲,开门啊,是我。”原来是爹爹,红莲松了一口气,看来官差已经走了。 “来了...
    单影双人行阅读 396评论 0 3