想要自己一个人完成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的更多相关文章

  1. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  2. 一步一步学ROP之linux_x86篇

    一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 ​ 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...

  3. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  4. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

  5. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  6. 一步一步学Remoting系列文章

    转自:http://www.cnblogs.com/lovecherry/archive/2005/05/24/161437.html (原创)一步一步学Remoting之一:从简单开始(原创)一步一 ...

  7. 一步一步学android控件(之十六)—— CheckBox

    根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...

  8. 一步一步学Python(2) 连接多台主机执行脚本

    最近在客户现场,每日都需要巡检大量主机系统的备库信息.如果一台台执行,时间浪费的就太冤枉了. 参考同事之前写的一个python脚本,配合各主机上写好的shell检查脚本,实现一次操作得到所有巡检结果. ...

  9. 【DG】[三思笔记]一步一步学DataGuard

    [DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...

随机推荐

  1. Android 第一个程序 及 环境搭配

    一. JDK配置 1.找到jdk安装路径 2.配置环境变量(建议配置在系统变量里面) 1).配置JAVA_HOME变量 2).配置 CLASSPATH 环境变量 CLASSPATH=.;%JAVA_H ...

  2. 你真的了解UITextView吗?

    一:首先查看一下关于UITextView的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextView : UIScrollView <UITextI ...

  3. UITableView全面解析

    本文转自:http://www.cocoachina.com/ios/20140922/9710.html 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以 ...

  4. 2.2 CMMI2级——项目计划(Project Planning)

    大家都明白这样的一个道理:做事情要有计划,有一个不成熟的计划总比没有计划要好,软件开发这么复杂的活动,更加需要计划.那么应该怎样做好一个计划呢? 如果对项目的范围.规模.性质.任务.工作量.费用等都不 ...

  5. JavaScript Patterns 4.9 Configuration Objects

    Configuration Objects Passing a large number of parameters is not convenient. A better approach is t ...

  6. SQL Server连接SQL Server、SQL Server连接ORACLE 链接服务器

    夸数据库访问有很多种方式,其中部分用作接口访问,这里要介绍的是MSSQL访问另一台MSSQL,MSSQL访问ORACLE,其它暂不介绍. 1.MSSQL访问另一台MSSQL: a.展开服务器对象--& ...

  7. collections中可命名元组和队列

    一丶可命名元组(nametuple)

  8. .NET领域驱动设计—实践(穿过迷雾走向光明)

    阅读目录 开篇介绍 1.1示例介绍 (OnlineExamination在线考试系统介绍) 1.2分析.建模 (对真实业务进行分析.模型化) 1.2.1 用例分析 (提取系统的所有功能需求) 1.3系 ...

  9. SQLServer查询锁表

    查看被锁表: select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys. ...

  10. (企业面试部分)超详细思路讲解SQL语句的查询实现,及数据的创建。

    企业面试部分详细的SQL问题,思路讲解 第一步:创建数据库表,及插入数据信息 --Student(S#,Sname,Sage,Ssex) 学生表 CREATE TABLE student( sno ) ...