PHP作为一门优秀的后端开发语言在一段时间里很流行,但现在慢慢沉寂下来,涉及它的开发文章也少了许多,很多的开发者似乎忘记或者忽视了它曾有过的强大和灵活。
其实,ASP、PHP、JSP做为后端开发语言的顶梁柱,它们的功能都差不多,三者都很优秀难分高下。ASP有微软作为靠山,说它不强大是说不过去的;JSP有Java背书,并且曾经在相当长时间为企业级应用作为支撑,历经百炼,强大是有目共睹的;唯有PHP,不实际使用它,你感受不到它的强大。
函数实在是太多太丰富了。
⒈操作数据库
假设$DBConn为连接对象,$sql为操作语句,那么
$dbconn->exec($sql)是直接执行SQL语句,返回受影响的行数。适用于不需要绑定参数的简单查询,如插入、更新和删除数据等。
$dbconn->query($sql)是执行SQL语句并返回一个结果集对象。适用于需要获取结果集的查询,如查询数据等。
$dbconn->prepare($sql)是准备SQL语句并返回一个预处理语句对象。适用于需要重复执行多个相似的查询,并且需要绑定参数以避免SQL注入攻击的情况。
⒉处理返回的结果
假设数据库连接对象为$dbconn,查询操作的sql语句为$sql=“SELECT id, name, age FROM users”,$reslut=$dbconn->query($sql),对于结果集的fetch操作有很多参数:
⑴ PDO::FETCH_ASSOC: 返回关联数组形式的结果集。
// 使用 PDO::FETCH_ASSOC 参数获取关联数组形式的结果集
$row = $result->fetch(PDO::FETCH_ASSOC);
echo $row['id'], $row['name'], $row['age'];
⑵ PDO::FETCH_NUM: 返回索引数组形式的结果集。
// 使用 PDO::FETCH_NUM 参数获取索引数组形式的结果集
$row = $result->fetch(PDO::FETCH_NUM);
echo $row[0], $row[1], $row[2];
⑶ PDO::FETCH_BOTH: 返回既包含关联数组又包含索引数组的结果集。
// 使用 PDO::FETCH_BOTH 参数获取既包含关联数组又包含索引数组的结果集
$row = $result->fetch(PDO::FETCH_BOTH);
echo $row['id'], $row[1], $row['age'];
⑷ PDO::FETCH_OBJ: 返回对象形式的结果集。
// 使用 PDO::FETCH_OBJ 参数获取对象形式的结果集
$row = $result->fetch(PDO::FETCH_OBJ);
echo $row->id, $row->name, $row->age;
有了上面的基础,写PHP访问MS SQL Server 2014的数据库操作就比较容易了。
对于PHP操作MS SQL Server 2014数据库,总的来说,无非就是增加记录、删除记录、修改记录、查询记录和统计记录这5种操作,对应的只需要写三个函数就可以搞定。
<?php
require 'DBLinkConfig.php';
$returnArr=[];//准备返回的数组
function AddDelUpdate($DBConn,$sql){
$Arr=[];//准备返回的数组
$result = $DBConn->exec($sql);
if ( $result>0 ) {
$Arr['data']='OK';
}else{
$Arr['data']="数据记录操作错误!";
}
return $returnArr;
};
//测试数据
//$sql = "insert into EisUser(C01,C02,C03,C04,C05) values('1111','2222','333','44','55')";
//$sql = "delete from EisUser where C01='1'";
//$sql = "update EisUser set C02='明天' where C01='11'";
//$returnArr=AddDelUpdate($DBConn,$sql);
function Query($DBConn,$sql){
$Arr=[];//准备返回的数组
$result = $DBConn->query($sql);
$rows =$result->fetchAll(PDO::FETCH_ASSOC);
if( sizeof($rows)>0 ){
//echo sizeof($rows);
$Arr['data']=$rows;
}else{
$Arr['data']=0;
}
return $Arr;
}
//测试数据
//$sql = "select * from EisUser ";
//$returnArr=Query($DBConn,$sql);
function statistics($DBConn,$sql){
$result = $DBConn->query($sql);
$rows = $result->fetch();
return $rows[0];
}
//测试数据
//$sql = "select count(*) from EisUser where C01='11'";
//$returnArr['rows']=statistics($DBConn,$sql);
header('Content-type:text/json');
echo json_encode($returnArr,JSON_UNESCAPED_UNICODE);
?>
看来的确很简单,三个函数就可以作为一个应用的后端支持。
事实上,问题不是这么简单,因为有的要素没有考虑到。
⒈SQL注入
如果所有对数据库的操作都是这样的函数调用,那么难以避免SQL注入问题。
解决方法:比如使用拦截器或者路由解析,SQL语句不能由前端生成,只能由后端程序来生成。
⒉功能过于单一,没有涉及多媒体数据的存储和提取
对于简单不涉及多媒体数据存储的应用,上面的函数是可以应对的,做好应用安全就可以。但是对于复杂一些的功能要求就必须另行开发,比如上传多媒体文件等功能。
⒊特定前端应用对于返回数据格式的要求
特别是对分页数据的格式要求,比如LayUI、Vue、EasyUI的要求格式有差别,还有一些特殊应用的格式要求等等。
要满足上面的要求,还必须增加一些函数来处理。
我记得网上有培训老师讲不要学习JSP和ASP,因为它们都属于淘汰的技术了,我听了不以为然,怎么可能?!现在都是前后端分离,ASP和PHP只返回需要的JSON或者XML数据即可。同样,JSP与Servlet可能只有技术细节上的差异,也不可能这么快被淘汰,只是现在使用的人的确少了。