本文可能会有错误, 或者不足的地方, 还请多多指正, 多多提宝贵意见!!!
在网上找了好多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 输入以下代码
复制下面这段代码
<pre><?php // 1. 获取客户端利用post方式网络请求的body里的字段对应的value (这个字段// 是这里规定的, 前端必须遵守这个name2, pass2等key值)
$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 然后写入到新的路径1MB
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
// 关闭文件链接
fclose($file);
}
if ($newf) {
fclose($newf);
}
?></pre>
复制代码结束 -
然后在本地服务器文件夹下新建download2文件夹
- 然后再把登录的php代码也写了吧!在htdocs文件夹下, 新建loginGet.php文件 然后插入代码
复制代码开始
<pre>
<?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;
}
?></pre>
代码复制结束
到此, php暂时告一段路, 然后进行iOS段代码开发(开心不???)
四.然后, 那么我们来看看iOS端代码如何实现.
ViewContrller.m (主要类) 可能里面用到了自己定义的类LoginView 请去GitHub https://github.com/lidongxuwork/iOS-to-PHP 上下载源代码(顺路给个星哈, 谢谢!!!)
<pre>
// 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 () <LoginRegisterDelegate>
@property (nonatomic, strong) LoginView *loginR;
@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网络请求的方式)
NSString *url = @"http://127.0.0.1/loginGet.php";
// 后台规定登录用户名的字段必须是name密码的pass
NSDictionary *dic = @{@"name":name, @"pass":pass};
// 网络请求有点特殊 点进去看
[LDXNetWork GetThePHPWithURL:url par:dic success:^(id responseObject) {
// 后台返回的字典里 如果success对应的value是1代表登录成功
if ([responseObject[@"success"] isEqualToString:@"1"]) {
MainViewController *mainVC = [[MainViewController alloc] init];
mainVC.dic = responseObject;
[self presentViewController:mainVC animated:YES completion:nil];
}
else {
[self showTheAlertView:self andAfterDissmiss:1.0 title:@"账号或密码错误" message:@""];
}
} error:^(NSError *error) {
NSLog(@"%@", error);
}];
} - (void)getRegisterName:(NSString *)name pass:(NSString *)pass age:(NSString *)age telephone:(NSString *)telephone image:(UIImage *)image
{
NSString *url = @"http://127.0.0.1/register.php";
NSDictionary *dic = @{@"name2":name, @"pass2":pass, @"age2":age, @"telephone2":telephone};
// 网络请求有点特殊点进去看 (@"uploadimageFile" 后台给的字段)
[LDXNetWork PostThePHPWithURL:url par:dic image:image uploadName:@"uploadimageFile" success:^(id response) {
NSString *success = 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:^(NSError *error) {
NSLog(@"%@", error);
}];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
</pre>
MainViewController.h 登录到的界面
<pre>
//
// MainViewController.h
// php
//
// Created by 李东旭 on 16/3/11.
// Copyright © 2016年 李东旭. All rights reserved.
//
import <UIKit/UIKit.h>
@interface MainViewController : UIViewController
@property (nonatomic, strong) NSDictionary *dic;
@end
</pre>
MainViewController.m
<pre>
//
// 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];
UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
imageV.backgroundColor = [UIColor greenColor];
// 取出用户名对应的头部图片
NSString *imageValue = self.dic[@"name"];
warning 5. 直接在这里进行网址路径拼接, 因为不同用户要取不同的头像图片, 图片都保存在服务器的一个叫download2文件夹, 里面图片是根据用户名加.jpg来获取的
NSString *url = [NSString stringWithFormat:@"%@/%@.jpg", @"http://127.0.0.1/download2", imageValue];
// 同步加载图片
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
UIImage *image = [UIImage imageWithData:data];
[imageV setImage:image];
[self.view addSubview:imageV];
// 循环创建label, 从请求下来传过来的字典里, 拿出指定的字段的value值显示
NSArray *arr = @[@"name", @"age", @"telephone"];
for (int i = 0; i < 3; i++) {
CGFloat offY = 320;
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 320 + i * 50, 250, 40)];
[self.view addSubview:label];
NSString *s = arr[i];
NSString *value = self.dic[s];
label.text = [NSString stringWithFormat:@"%@: %@", s, value];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
</pre>
注意: 你可能运行的时候, 遇到这个问题 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
网友评论
$_FILES 一直获取不到,这个问题怎么解决呢?
一直为空
2016-10-09 19:06:51.535 php[38067:210051] Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={NSUnderlyingError=0x7faf6c165ce0 {Error Domain=kCFErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}}, NSErrorFailingURLStringKey=http://localhost/register.php, NSErrorFailingURLKey=http://localhost/register.php, _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=61, NSLocalizedDescription=Could not connect to the server.}
Notice: Undefined index: name2 in /Applications/XAMPP/xamppfiles/htdocs/register.php on line 2
Notice: Undefined index: pass2 in /Applications/XAMPP/xamppfiles/htdocs/register.php on line 3
Notice: Undefined index: age2 in /Applications/XAMPP/xamppfiles/htdocs/register.php on line 4
Notice: Undefined index: telephone2 in /Applications/XAMPP/xamppfiles/htdocs/register.php on line 5
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /Applications/XAMPP/xamppfiles/htdocs/register.php:9 Stack trace: #0 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/register.php on line 9
<br /><b>Warning</b>: mysql_num_rows() expects parameter 1 to be resource, boolean given in <b>/Applications/XAMPP/xamppfiles/htdocs/register.php</b> on line <b>15</b><br />
{"success":"0","status":"no"}
求最新的PHP文件
<b>Fatal error</b>: Uncaught Error: Call to undefined function mysql_connect() in /Applications/XAMPP/xamppfiles/htdocs/register.php:9
Stack trace:
#0 {main}
thrown in <b>/Applications/XAMPP/xamppfiles/htdocs/register.php</b> on line <b>9</b><br />
大神 请问报这个错误是为什么?在注册的时候我点击注册按钮就会报这个错误
<b>Warning</b>: fopen(/Applications/XAMPP/xamppfiles/htdocs/download2/Lidongxu.jpg): failed to open stream: Permission denied in <b>/Applications/XAMPP/xamppfiles/htdocs/register.php</b> on line <b>62</b><br /> 旭哥 一直出现这个错误
<b>Warning</b>: mysql_num_rows() expects parameter 1 to be resource, boolean given in <b>/Applications/XAMPP/xamppfiles/htdocs/register.php</b> on line <b>15</b><br />
{"success":"0","status":"no"}