吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4308|回复: 28
收起左侧

[其他转载] 【PHP】学习“毒鸡汤”网站源码编写简单的随机API

[复制链接]
l9zp6 发表于 2020-3-25 00:32
本帖最后由 l9zp6 于 2020-4-20 00:23 编辑

前言

最近发现“毒鸡汤”网站的源码开源了,于是本着学习的想法,决定一边学习一边编写自己的第一个API,功能也不要求多复杂,实现简单的随机一句话就行。

学习

下载

首先我们在开源页面将整个项目下载下来,当然你也可以使用git命令行,一键将项目克隆到本地。

运行

项目下载好之后,当然是先将项目跑起来,看看代码能不能正常运行,不能正常运行是为什么,有没有BUG,我能不能修好。

我是Win的开发环境,用的是集成开发环境:phpstudy,相关版本是PHP5.6、Nginx。

观察

打开下载好的压缩包,瞅一眼目录结构,其实还是比较简单,没有太多的层级,也没有用到MVC之类的开发模式。

Snipaste_2020-03-24_23-17-49.png


后缀sql的是数据库文件:我们先建好一个库,然后将数据表导入进去。

后缀md的一般是帮助文件(看命名也知道),可能会讲一下项目的部署之类的,然后......没有(感觉确实没啥好讲的,手动狗头)。

打开

将整个项目放到服务器的WWW目录下,运行网站的首页文件(默认为index.XXX XXX为文件格式)。

然后你会发现报了满屏的错误和警告,就像下面这样,但没有关系,报错本身并不可怕,因为服务器会告诉你,第多少行的什么东西存在问题。

Snipaste_2020-03-24_23-29-57.png


排错

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的方法就可以了。

替换之后,之前报的已废弃就没有了,继续往下看。

Snipaste_2020-03-24_23-50-55.png


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地址使用密码被拒绝访问。

一般这种报错都是数据库的账号密码存在问题,而我们一开始并没有修改数据库的连接信息,所以才会造成数据库访问被拒绝,修改成你本地的数据库信息便好。

修改之后,我们接着往下看。

Snipaste_2020-03-24_23-57-57.png


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的时候就只有一个参数,另外一个是什么,“我”也不知道。

这时候就需要查一下手册了。

Snipaste_2020-03-25_00-04-17.png


原来在后来的mysqli方法中,执行query()时,不仅仅需要提供查询字符串,还需要规定要使用的MySQL连接。

规定要使用的Mysql连接之后,上面的报错就没有了,我们继续接着看。

Snipaste_2020-03-25_00-09-43.png


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连接。

修改好之后,你会发现,首页已经能正常运行了!

Snipaste_2020-03-25_00-27-37.png


API

首页已经能正常运行了,我们看看单独的API,其实通过前面的修改报错,估计很多人已经发现了,首页的运行并没有调用API。

我们运行单独的API,意料之中的提示了一堆报错,但是没关系,我们先看报错。

Snipaste_2020-03-25_15-13-12.png

基本还是之前的问题,使用了即将废弃的扩展(已废弃?大概印象里PHP7已经移除了这个扩展),我们按照要求修改好,再运行。

代码已经正常运行了(没有异常、没有警告等),但返回的数据不是我们想要的,数据库里存的是一句话中文,这一串乱码样的东西是什么。

Snipaste_2020-03-25_15-17-46.png

在写贴的时候,我已经知道问题出在哪了,我大概说一下,第一次跑程序的时候一个排查思路。

其实那种有明显的异常警告之类的是比较舒服的,告诉你了在第几行,什么问题,像这种正常运行的代码,但就是给不了你想要的结果,一般情况下是在写的时候,逻辑出了问题(这里不是),逻辑问题处理起来比较麻烦,要打断点,要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重构了代码,想学习的老哥,可以下载相关源码学习(已置顶评论)。

免费评分

参与人数 7吾爱币 +7 热心值 +4 收起 理由
BIGOcean + 1 用心讨论,共获提升!
LaoSun + 1 谢谢@Thanks!
syf1313113 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
cqlk001 + 1 + 1 谢谢@Thanks!
yhtg + 1 + 1 谢谢@Thanks!
njw + 1 + 1 我很赞同!
joneqm + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

战网无极限 发表于 2020-3-28 15:49
我个人修改了一份,重新构建了页面,反应速度提高了许多
https://gitee.com/shenyueyun/nows
 楼主| l9zp6 发表于 2020-4-19 23:56
战网无极限 发表于 2020-3-28 00:01
为什么不选择降低PHP的版本呢,直接就能解决数据库链接报错问题,只需要修改数据库账号密码即可

2020年了,mysql这个扩展已经不推荐使用了(滑稽)。
当时主要还是考虑安全性吧,之前看到过mysql这个扩展的相关预警。
况且,PHP7开始mysql这个扩展已经基本被废除,所以还是不建议使用。
头像被屏蔽
gezhu 发表于 2020-3-25 01:21
1983 发表于 2020-3-25 02:44
然后你会发现报了满屏的错误和警告,就像下面这样那样,
但没有关系,报错本身并不可怕,因为服务器会告诉你,第多少行的什么东西存在问题
但是没有关系!第多少行的什么东西存在问题本身并不可怕,因为你的大脑会告诉你,你完全看不懂!
1983 发表于 2020-3-25 02:45
多谢分享经历了,结果不重要,过程才有意思!
月巴耳总 发表于 2020-3-25 06:46
加油,不错哦!虽然我看到报错就会放弃,但喜欢你这种喜欢钻研的小伙子
yhtg 发表于 2020-3-25 07:56
1983 发表于 2020-3-25 02:44
然后你会发现报了满屏的错误和警告,就像下面这样那样,
但没有关系,报错本身并不可怕,因为服务器会告诉 ...

完全看不懂并不可怕,因为你即便连蒙带猜加字典翻译看懂了,你会发现不知道怎么改,哈哈哈哈哈
51528098 发表于 2020-3-25 07:57
不错,准备搞一个!!!
坐久落花多 发表于 2020-3-25 07:58

恩,下载过毒鸡汤的源码,感觉代码好像也还好
51528098 发表于 2020-3-25 08:02
本帖最后由 51528098 于 2020-3-25 16:35 编辑

今天&#128522;,這啥時候回的?

免费评分

参与人数 1吾爱币 +1 收起 理由
l9zp6 + 1 要是你这条被扣分了,就当给你回血了,嘿嘿嘿

查看全部评分

dragon-li 发表于 2020-3-25 08:27
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 04:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表