php项目–商城–源码分析。
此商城网站源码下载地址:https://github.com/jeremywong1992/nuomi_shop
php项目---商城--源码分析
网站目录下包含六个文件夹,和12个php文件
网页的首页是index.php文件,那就从idex.php开始
源码的第一行是:<?php include './header.php';?>
包含了一个名为 header.php 的文件,就是说已经在 index.php 中包含了 header.php 的源码了,那么先看 header.php的源码,同样,在 header.php的第一行又是include './init.php';那么先看 init.php。
---------------------------./init.php---------------------------------
<?php
session_start();
//$_session是一个全局数组,内包含了用户与服务器的会话信息,但是要在html标签之前就要先开启session,session_strat函数就是一个开启session来记录会话的函数。
header("content-type:text/html;charset=utf-8");
//头部定义了与服务器数据传输的编码默认为utf-8,防止出现乱码
define('PATH', str_replace('\\','/',dirname(__FILE__)).'/');
/*这里把PATH定义为当前脚本的路径上一级,并做了一些小的改动,PATH的格式为 例:c/phpstudy/www/ 其中,str_replace(x,y,z)函数是把z中的x字符串转化为y。dirname()函数的作用是把总路径的最后一个路径删除并返回*/
$des = strtolower(explode('/',$_SERVER['SERVER_PROTOCOL'])[0]).'://'.$_SERVER['SERVER_NAME'];
//这里用了一些字符串修改的函数,$_SERVER['SERVER_PROTOCOL']是当前的协议名称和版本,$_SERVER['SERVER_NAME']是网站的域名,输出格式 例:http://localhost
$search = $_SERVER['DOCUMENT_ROOT'];
//$_SERVER['DOCUMENT_ROOT']是当前网站的根目录。
define('APP',str_replace($search,$des,PATH));
//用于跳转
include PATH.'include/config.php';
include PATH.'include/funcs.php';//这里又包含了两个文件
?>
先看包含的文件一:
--------------------------include/config.php 源码----------------------------
<?php
define('HOST','localhost');
define('USER','root');
define('PWD','root');
define('DB','nuomi');
?>
显然,config.php定义了连接数据库时的一些参数,为后面的数据库连接做准备
-------------------------include/config.php 源码结束---------------------------
然后 包含的文件二:
---------------------------include/funcs.php 源码---------------------------------
<?php
function query($sql){
//定义了函数querry 此函数用来查询一些表的信息,并返回。
mysql_connect('HOST','USER','PWD') or die('数据库连接失败'); //连接数据库(面向过程的连接方式,一个过程连接一次)
mysql_select_db(DB);//格式是mysql_select_db(database,$conn) //用于连接$conn连接中的database数据库。
mysql_set_charset('utf8'); //选择数据库数据传输的格式为utf-8,防止乱码
//以上是数据库的连接
$result = mysql_query($sql); //此函数用于查询括号内的内容,$sql变量是此函数得到的形参,Mysql_qyery执行$sql语句。result返回的是结果的数据指针。
if($result && mysql_affected_rows() > 0){
//mysql_affected_rows()函数返回上一次对数据库的操作影响的行数(即判断是否成功)
while($row = mysql_fetch_assoc($result)){
// 此函数从结果集中取得一行作为关联数组。//此时$row是一个关联数组。
$list[] = $row;
}//由返回内容形式可见,此函数用于返回一些查询表格的内容。
mysql_free_result($result); //释放内存
}else{
$list = false;}
mysql_close();
return $list; //php函数不需要在定义时声明返回值类型,如需返回,只要加一个return语句。
}
function execute($sql){
//定义函数excute//实施
mysql_connect(HOST,USER,PWD) or die('数据库连接失败');//连接数据库或者die退出当前脚本
mysql_select_db(DB); //选择连接中的数据库
mysql_set_charset('utf8');
$result = mysql_query($sql);//执行sql语句
if($result){
$info = mysql_insert_id()?mysql_insert_id():mysql_affected_rows();//三元运算符,“?”前若为真,则取冒号前,否则取冒号后。
mysql_close();//关闭连接。
}
return $info;//$info记录的是mysql_insert_id()函数返回的上一次INSERT操作产生的AUTO_INCRERAMENT 的ID 号(一般为行的序号数)。
}//此函数一般用于插入新的数据。
function jump($msg,$des,$time =3){
include PATH.'include/jump.php'; //这里包含了一个跳转的文件(跳转到des对应的网站)
}//这里为跳转函数
-------------------include/jump.php 源码-------------------------
<!DOCTYPE html> //此为html 5的声明,必须位于<html>标签之前
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"> //其实等于<meta charset="utf-8">
<title>Index</title> //显示在浏览器上方的标题的内容
<style type="text/css"> //style中必须有type元素,规定了以什么格式显示文档,唯一的可能值是text/css
//css可以对网页排版进行一些精确的控制,达到一些特殊的效果
#jump{width:600px;height:400px;position:absolute;top:50%;left:50%;margin-left:-300px;margin-top:-200px;background:#ccc;border-radius:20px;text-align:center;}
#jump h2{color:white;padding-top:100px;} //声明了了网页的一些视觉效果。
</style>
<meta http-equiv="refresh" content="<?php echo $time?>;url=<?php echo $des?>"> //规定了文档的刷新时间间隔,content 规定了时间,url规定了地址。$des 与 $des在前面的文件中已经定义。
</head>
<body>
<div id="jump">//id= 为这个div标签取了一个名字,可以被css等找到 div标签一般用于定义文档中的划分。
<h2>提示信息</h2> <h>与</h>定义了字体的大小,从h1到h6依次字体减小。
<p><?php echo $msg?></p> //<p>保证中间的文字与上一行和下一行中间都有一空行。
<div><span><?php echo $time?>秒后跳转</span> <a href="<?php echo $des?>">立即跳转</a></div>
</div>
</body>
</html>
可见这个文件设定了跳转标志的样式,保证了数据库上传信息成功后出现的页面。
------------------------include/jump.php 源码结束--------------------------
function upload($field,$path){
//$field为上传的文件名,$path是要存放新文件的路径(目录)。
//判断错误
if($_FILES[$field]['error'] != 0) exit('上传出错');//$_FILES[上传的文件名][错误码]。
//获取文件信息
list($maintype,$subtype) = explode('/',$_FILES[$field]['type']);
//list是把一些变量赋值,explode是把字符串按某个标志打散并返回,$_FILES[$field]['type']是上传的文件的类型。
//判断上传的文件是否是指定类型
if($maintype != 'image') exit('请上传图片');//限制上传文件的类型,防止注入。
if($subtype == 'jpeg') $subtype = 'jpg'; //产生新的文件名
$newfile = md5(uniqid()).'.'.$subtype;//md5()用于计算括号内的字符串散列,uniqid()基于当前微秒生成一个唯一的id。
$newpath = rtrim($path,'/').'/'.$newfile;//rtrim($path,'/')函数用于移除$path右侧的'/'字符,最后生成一个文件的完整路径
$res = move_uploaded_file($_FILES[$field]['tmp_name'],$newpath);//$_FILES[$field]['tmp_name']是文件在临时服务器中的文件名,这里是把这个文件转移到新的路径下(并赋予了新的文件名)。
if($res){
return $newfile;
}else{
return '上传失败';
}
} //可见,函数upload用于上传一个文件,并将合法的文件转存。
function zoom($path,$width=200,$height=200){
//path为图片的路径。
$info = getimagesize($path); //获取图片信息(只能用于图片)
//索引 0 给出的是图像宽度的像素值
索引 1 给出的是图像高度的像素值
索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF