前言
最近发现“毒鸡汤”网站的源码开源了,于是本着学习的想法,决定一边学习一边编写自己的第一个API,功能也不要求多复杂,实现简单的随机一句话就行。
学习
下载
首先我们在开源页面将整个项目下载下来,当然你也可以使用git命令行,一键将项目克隆到本地。
运行
项目下载好之后,当然是先将项目跑起来,看看代码能不能正常运行,不能正常运行是为什么,有没有BUG,我能不能修好。
我是Win的开发环境,用的是集成开发环境:phpstudy,相关版本是PHP5.6、Nginx。
观察
打开下载好的压缩包,瞅一眼目录结构,其实还是比较简单,没有太多的层级,也没有用到MVC之类的开发模式。
后缀sql的是数据库文件:我们先建好一个库,然后将数据表导入进去。
后缀md的一般是帮助文件(看命名也知道),可能会讲一下项目的部署之类的,然后......没有(感觉确实没啥好讲的,手动狗头)。
打开
将整个项目放到服务器的WWW目录下,运行网站的首页文件(默认为index.XXX XXX为文件格式)。
然后你会发现报了满屏的错误和警告,就像下面这样,但没有关系,报错本身并不可怕,因为服务器会告诉你,第多少行的什么东西存在问题。
排错
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in D:\phpStudy\PHPTutorial\WWW\nows-master\data.php on line 2
这句话的意思就是在第二行中mysql这个扩展已经被废弃,在未来(更高版本)会被删除,请使用mysqli扩展或者PDO扩展来代替。
造成这样的原因是因为mysql这个方法不安全已经被废弃,但在第二行中使用了这个方法,所以报了一Deprecated(已废弃)。
我们只要把mysql这个方法替换成mysqli的方法就可以了。
替换之后,之前报的已废弃就没有了,继续往下看。
Warning: mysqli_connect(): (HY000/1045): Access denied for user 'symhytwg_fun'@'localhost' (using password: YES) in D:\phpStudy\PHPTutorial\WWW\nows-master\data.php on line 2
这话话的意思是用户symhytwg_fun在localhost地址使用密码被拒绝访问。
一般这种报错都是数据库的账号密码存在问题,而我们一开始并没有修改数据库的连接信息,所以才会造成数据库访问被拒绝,修改成你本地的数据库信息便好。
修改之后,我们接着往下看。
Warning: mysqli_query() expects at least 2 parameters, 1 given in D:\phpStudy\PHPTutorial\WWW\nows-master\data.php on line 3
这句话的意思是在这一行mysqli_query()期望至少有2个参数,但是你却只给了一个。
可能有些人在这个时候会有些懵,以前用mysql的时候就只有一个参数,另外一个是什么,“我”也不知道。
这时候就需要查一下手册了。
原来在后来的mysqli方法中,执行query()时,不仅仅需要提供查询字符串,还需要规定要使用的MySQL连接。
规定要使用的Mysql连接之后,上面的报错就没有了,我们继续接着看。
Deprecated: mysql_query(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in D:\phpStudy\PHPTutorial\WWW\nows-master\index.php on line 48
Warning: mysql_query(): Access denied for user ''@'localhost' (using password: NO) in D:\phpStudy\PHPTutorial\WWW\nows-master\index.php on line 48
Warning: mysql_query(): A link to the server could not be established in D:\phpStudy\PHPTutorial\WWW\nows-master\index.php on line 48
48行报了三个错,第一个是已废弃的扩展,第二个是数据库信息不正确,第三个是无法建立数据库的连接。
我们去看48行的代码,其实无非还是之前的问题,已废弃的扩展,没有规定使用的MySQL连接。
修改好之后,你会发现,首页已经能正常运行了!
API
首页已经能正常运行了,我们看看单独的API,其实通过前面的修改报错,估计很多人已经发现了,首页的运行并没有调用API。
我们运行单独的API,意料之中的提示了一堆报错,但是没关系,我们先看报错。
基本还是之前的问题,使用了即将废弃的扩展(已废弃?大概印象里PHP7
已经移除了这个扩展),我们按照要求修改好,再运行。
代码已经正常运行了(没有异常、没有警告等),但返回的数据不是我们想要的,数据库里存的是一句话中文,这一串乱码样的东西是什么。
在写贴的时候,我已经知道问题出在哪了,我大概说一下,第一次跑程序的时候一个排查思路。
其实那种有明显的异常警告之类的是比较舒服的,告诉你了在第几行,什么问题,像这种正常运行的代码,但就是给不了你想要的结果,一般情况下是在写的时候,逻辑出了问题(这里不是),逻辑问题处理起来比较麻烦,要打断点,要debug
。
我这里首先看的是SQL语句,SQL语句没有问题(如果对SQL不熟练,可以放入SQL里查一下,看能不能运行,返回结果是不是自己想要的),然后就是打断点了,我比较菜,也比较“bao力”,一般就是die()
加var_dump()
打印,屡试不爽。
经过排查,发现json_encode
在将中文转换成json
格式时会把中文转成unicode
值,这也是上面说的那一串乱码是什么。
查到的方法有两种,我用的是这种:在转换为Json
数据的时候传入第二个参数JSON_UNESCAPED_UNICODE
(适用于PHP5.4及以上)。
参考文章《json_encode()处理中文》。
到这里,毒鸡汤的网站和API都已在本地正常运行。
重构
通过修复报错,我们已经知道了程序运行的大概流程,然后我们依葫芦画瓢,就可以开始写自己的随机一句话API啦。
这里我就不一步步介绍了,大家直接看代码(弱弱说一句MD下的PHP代码挺暗的,要是论坛管理看到,建议换个亮一点的哈),如果遇到问题,可以在下方评论交流。
<?php
// 设置json格式头部
header("Content-Type:application/json");
// 创建连接
$conn = mysqli_connect("127.0.0.1","root","root","sy_nows");
// 检测连接
if(!$conn){
die("Connect failed".mysqli_connect_error());
}
// 构建SQL
$sql = "SELECT * FROM soul ORDER BY RAND() LIMIT 1";
// 查询SQL
$row = mysqli_fetch_assoc(mysqli_query($conn,$sql));
// 输出json
echo json_encode(array('code'=>1,'data'=>$row['title']),JSON_UNESCAPED_UNICODE);
后话
这是我写的第一个API,没有考虑太多的问题,先能跑再说,至于SQL语句的执行效率,以及评论区大佬建议使用TXT存储,那都是后话了,咱先把功能实现嘛,超级无敌理直气壮.jpg,谁叫咱是个萌新呢,溜~
END
2020年4月19日更新:
因为之前评论里有老哥,推荐使用PHP+TXT来处理API,这两天没事,于是倒腾了一下。
演示地址:http://api.lkblog.net/ws/api.php
相关说明:https://lkblog.net/notes/php/607.html
另外评论有老哥使用PHP+MySQL+AJAX重构了代码,想学习的老哥,可以下载相关源码学习(已置顶评论)。