一步一步学swift之:自己写Api接口-PHP
想要自己一个人完成app,那么后台接口也必须自己动动手。不用担心,其实很简单的,给自己信心!
下面就以登录注册为例,做一个api接口
首先在mac上搭建PHP环境,下载 MAMP Pro for Mac 3.4 破解版:
http://www.ifunmac.com/2015/08/mamp-pro-3-4/
即可一键安装Apache/PHP/MySQL开发环境。简单吧。
有了环境就可以写代码了:
首先写一个Config.php (配置数据库)
<?php //定义数据库连接所需的变量
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASSWORD", "master12!");
define("DB_DATABASE", "loginAPI"); ?>
写一个DB_Connect.php(用于连接数据库)
<?php class DB_Connect
{
public $con; function __construct()
{ } function __destruct()
{
// $this->close();
} //连接数据库
public function connect()
{
require_once 'include/Config.php';
//连接mysql
$this->con = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE) or die(mysqli_error($this->con));
if (mysqli_connect_errno()) {
die("Database connection failed");
} // 返回 database handler
return $this->con;
} //关闭数据连接
public function close()
{
mysqli_close($this->con);
} } ?>
再来一个:DB_Functions.php (用来封装 执行sql后 返回数据的方法)
<?php class DB_Functions { private $db; // constructor
function __construct() {
require_once 'DB_Connect.php';
// connecting to database
$this->db = new DB_Connect();
$this->db->connect();
} // destructor
function __destruct() { } /**
* 添加用户信息
*/
public function storeUser($name, $email, $password) {
$uuid = uniqid('', true);
$hash = $this->hashSSHA($password);
$encrypted_password = $hash["encrypted"]; // 加密后的密文
$salt = $hash["salt"]; // salt
$result = mysqli_query($this->db->con,"INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
// 检查结果
if ($result) {
// 获取用户信息
$uid = mysqli_insert_id($this->db->con); // 获取最新的id
$result = mysqli_query($this->db->con,"SELECT * FROM users WHERE uid = $uid");
//返回刚插入的用户信息
return mysqli_fetch_array($result);
} else {
return false;
}
} /**
* 通过email和password获取用户信息
*/
public function getUserByEmailAndPassword($email, $password) {
$result = mysqli_query($this->db->con,"SELECT * FROM users WHERE email = '$email'") or die(mysqli_connect_errno());
// check for result
$no_of_rows = mysqli_num_rows($result);
if ($no_of_rows > 0) {
$result = mysqli_fetch_array($result);
$salt = $result['salt'];
$encrypted_password = $result['encrypted_password'];
$hash = $this->checkhashSSHA($salt, $password);
// check for password
if ($encrypted_password == $hash) {
return $result;
}
} else {
return false;
}
} /**
* 通过email判断用户是否存在
*/
public function isUserExisted($email) {
$result = mysqli_query($this->db->con,"SELECT email from users WHERE email = '$email'");
$no_of_rows = mysqli_num_rows($result);
if ($no_of_rows > 0) {
// 用户存在
return true;
} else {
//用户不存在
return false;
}
} /**
* 加密
* @param password
* returns salt and encrypted password
*/
public function hashSSHA($password) { $salt = sha1(rand());
$salt = substr($salt, 0, 10);
$encrypted = base64_encode(sha1($password . $salt, true) . $salt);
$hash = array("salt" => $salt, "encrypted" => $encrypted);
return $hash;
} /**
* 解密
* @param salt, password
* returns hash string
*/
public function checkhashSSHA($salt, $password) { $hash = base64_encode(sha1($password . $salt, true) . $salt); return $hash;
} } ?>
在Index.php调用并输出返回值(这个文件地址就是接口的访问地址)
<?php if (isset($_POST['tag']) && $_POST['tag'] != '') {
// tag是接口请求时post的值(方法名称),用来区别调用方法
$tag = $_POST['tag']; //引用DB_Functions.php
require_once 'include/DB_Functions.php';
$db = new DB_Functions(); // 定义输入数组
$response = array("tag" => $tag, "error" => FALSE); // 判断tag值
if ($tag == 'login') {
//获取login方法的post参数
$email = $_POST['email'];
$password = $_POST['password']; // 通过email 和password获取用户信息
$user = $db->getUserByEmailAndPassword($email, $password);
if ($user != false) {
//找到用户信息
$response["error"] = FALSE;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
} else {
//没有找到用户信息
//输出错误信息
$response["error"] = TRUE;
$response["error_msg"] = "帐号或密码不正确!";
echo json_encode($response);
}
} else if ($tag == 'register') {
//注册帐号
$name = $_POST['name'];
$email = $_POST['email'];
$password = $_POST['password']; // 判断用户是否存在
if ($db->isUserExisted($email)) {
// 如果用户存在就返错误提示
$response["error"] = TRUE;
$response["error_msg"] = "用户已存在";
echo json_encode($response);
} else {
// 新增用户
$user = $db->storeUser($name, $email, $password);
if ($user) {
//新增成功返回用户信息
$response["error"] = FALSE;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
} else {
// 新增失败,返回错误信息
$response["error"] = TRUE;
$response["error_msg"] = "服务器繁忙,操作失败";
echo json_encode($response);
}
}
} else {
// tag值无效时
$response["error"] = TRUE;
$response["error_msg"] = "未找到您要的方法";
echo json_encode($response);
}
} else {
$response["error"] = TRUE;
$response["error_msg"] = "您的参数不正确!";
echo json_encode($response);
}
?>
一步一步学swift之:自己写Api接口-PHP的更多相关文章
- 一步一步学ROP之linux_x64篇
一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...
- 一步一步学ROP之linux_x86篇
一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...
- 一步一步学android控件(之十五) —— DegitalClock & AnalogClock
原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...
- 一步一步学Remoting系列文章
转自:http://www.cnblogs.com/lovecherry/archive/2005/05/24/161437.html (原创)一步一步学Remoting之一:从简单开始(原创)一步一 ...
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- 一步一步学Python(2) 连接多台主机执行脚本
最近在客户现场,每日都需要巡检大量主机系统的备库信息.如果一台台执行,时间浪费的就太冤枉了. 参考同事之前写的一个python脚本,配合各主机上写好的shell检查脚本,实现一次操作得到所有巡检结果. ...
- 【DG】[三思笔记]一步一步学DataGuard
[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...
随机推荐
- [转]Android逆向之动态调试总结
一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...
- iOS定时器、延迟执行
1.通用方式(并不是实时调用并且会卡顿): // 一般用于更新一些非界面上的数据 [NSTimer scheduledTimerWithTimeInterval:时间间隔 target:self se ...
- 【原】iOS:一种直接修改frame的某个属性的方法
在iOS中view的frame属性使用地太频繁了,尤其是调UI的时候.我们知道,正常情况下我们无法对frame的某个属性(x,y,width,height等)进行单独修改,比如: someView.f ...
- iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付
产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ...
- C# 依赖缓存
使用轮询的方式 数据库: 在VS的命令里面输入 aspnet_regsql.exe -S (local) -U sa -P 123456 -d ERP_SQL -ed 上面这句是用来设置哪个服务器上的 ...
- 软件开发与UML的关系
今天,我们上<统一建模语言UML>.课上老师给我们讲解了软件开发与UML之间的关系:UML常用于建立软件系统的模型,适用于系统开发的不同阶段.UML的应用贯穿于系统开发的不同阶段.1.需求 ...
- 分组函数 ----group by 使用总结
总结:1,在where子句中不能用分组聚合函数. 2,如果没有group by 子句,select 不能同时出现字段与分组的聚合函数. 3,在有 group by 的子句的查询 ...
- 【hadoop】——压缩工具比较
文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速.在hadoop大数据的背景下,这两点尤为重要,那么我现在就先来了解下hadoop中的文件压缩. hadoop里支持很多种压 ...
- 使用DBI(perl)实现文本文件的导入导出mysql
DBI 是perl脚本连接数据库的一个模块.perl脚本相对shell更灵活,功能更强大,跨平台能力强.相对可执行jar包要简单很多. 1.下载安装包DBI-1.631.tar.gzperl脚本下载 ...
- android setLayoutParams 问题,出错
LinearLayout layt = (LinearLayout) rootView.findViewById(R.id.llt_2); FrameLayout.LayoutParams layou ...