一步一步学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 studio修改Logcat颜色
Android studio默认的Logcat配色不利于阅读,我们可以修改自定义自己的颜色配置
- Android中的跨进程调用技术AIDL
什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...
- Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
- net2.0对于递归变量的处理方式不同引发的递归问题
同样的代码,用NET2.0执行产生的效果与其它框架使用的不同,导致报错. 认真查找原因后发现该程序的编写人员隐式的使用了一个公共变量,使之在递归过程中不断的被改写,使得1次递归后就破坏了原来的循环体, ...
- C# 表复制和数据行的复制说明(Clone、ImportRow 、Copy )
/// <summary> /// 构建测试数据表 /// </summary> /// <returns></returns> private Dat ...
- 密码校验正则表达式(java 环境)
密码校验需求: 1) 密码控制只能输入字母.数字.特殊符号(~!@#$%^&*()_+[]{}|\;:'",./<>?)2) 长度 6-16 位,必须包括字母.数字.特殊 ...
- 如何阻止h5body的滑动
// 禁止 document.body.style.overflow = 'hidden'; function _preventDefault(e) { e.preventDefault(); } w ...
- log4j 实现只输入我们指定包的日志
#all logger output level is 'ERROR' and output position is stdout #so only write our project's DEBUG ...
- C# 读取在存储过程多结果集
--SQL Server 测试环境搭建: Create database Test; go USE [Test] GO if OBJECT_ID('Tab','U') is not null drop ...
- Keepalived+MySQL双主架构
l 架构准备 Node1 192.168.15.3 Node2 192.168.15.4 VIP 192.168.15.254 l 软件 MySQL 5.6 Keepalive yum insta ...