php学习
2016-06-16 18:42 孤独大兔子 阅读(262) 评论(0) 收藏 举报一、安装、配置环境
Windows下安装方式
appserv http://www.appservnetwork.com
phpStudy
Wamp
Xmapp
这里选择AppServ安装,先去官网下载,然后安装

分别填写服务器名称,邮箱,端口号

填写登录密码,用utf-8字符集
安装完成,测试是否安装完成
1、开始--程序中有AppServ
2、找到安装路径

分别是apache服务程序,mysql,php脚本解析,网站默认的目录
3、打开网址,见到这个页面,说明已经安装成功了

这个页面就是D:\AppServ\www\index.php,等于打开了 http://localhost:8082/index.php
4、进入到服务器,其实就是进到phpMyAdmin目录下,用户名是root,密码是之前安装时输入的密码
二、安装disucz论坛和ecsshop网店
安装discuz论坛和ecsshop网店
去 http://www.comsenz.com/products/discuz 下载然后安装
去 http://www.ecsshop.com 下载然后安装
discuz需要先运行安装向导 http://localhost:8082/discuz/install/ 才可以正常访问

安装成功后,就可以正常访问了 http://localhost:8082/discuz/
同理,安装ecshop
四、基本语法
基本风格:<?php dosomething ?>
简短风格:<? dosomething ?>
script风格:<script language="php"> echo dosomething </script>
1、向浏览器输出:
echo() 功能:向浏览器输出字符串
echo()返回值:void 无返回值
<?php echo "ddd"; ?>
print()功能:向浏览器输出字符串
print()返回值:整型
<?php echo print "<p>ddd</p>"; ?> //输出多了1
printf()功能:向浏览器输出字符串
printf()返回值:返回字符串的长度
<?php echo printf ("我买了%d套光盘",5); ?> //多了个19
sprintf功能:将字符串保留在内存中
sprintf返回值:返回字符串
<?php sprintf ("我买了%d套光盘",5); ?> //不会输出,保存在内存中
printf()和sprintf是c语言模式,sprintf需要echo将他输出
常用类型指示符
| 类型 | 描述 |
| %b | 整数,显示为二进制 |
| %c | 整数,显示为ASCII字符 |
| %d | 整数,显示为有符号十进制数 |
| %f | 浮点数,显示为浮点数 |
| %o | 整数,显示为八进制数 |
| %s | 字符串,显示为字符串 |
| %u | 整数,显示为无符号十进制数 |
| %x | 整数,显示为小写的十六进制数 |
| %X | 整数,显示为大写的十六进制数 |
2、标识符与变量
创建变量
$+标识符
标识符可以任意长度,由字母,数字,下划线组成,不能以数字开始,标识符区分大小写,变量名可以与函数名相同
变量数据类型:整数,浮点,字符串,布尔,数组,对象
类型转换:
gettype和settype用于检测数据类型
<?php $abc=5; echo gettype($abc); ?> //integer 整型
隐式转换
<?php $abc=5; $abc1=1.22; $abc=$abc1; echo gettype($abc); ?> //double 浮点型
强制转换 <?php $abc=5; $abc1=(float)$abc; echo gettype($abc1); ?> //double 浮点型
settype设置变量类型
<?php $abc=5; settype($abc,"string"); echo gettype($abc); ?> //string
isset()和unset()判断变量是否存在,销毁一个变量,返回布尔值
<?php $abc=5; echo isset($abc); ?> //1
如果为真返回1,如果为假返回空
unset()销毁一个变量,销毁后再isset(),就为空了
empty()检查一个变量的值是否为空
不为空返回空,为空返回1 (其实就是判断true和false)空字符串,没有变量,0....都返回1
其他检测类型
is_array()、is_double()、is_float()、is_real()、is_long()、is_int()、is_integer()、is_string()、is_object()、is_resource()、is_null()、is_numeric()
<?php $abc="100"; echo is_integer($abc); ?> //返回空
可以通过调用一个函数来实现转换类型
intval()、floatval()、strval() 整形、浮点、字符串
<?php $abc=22.22; //intval($abc)整体变成整形 echo intval($abc); //$abc 还是浮点型 ?> //settype($abc,"integer")设置,会设置
变量和作用域
超级全局变量--可以在任何地方使用和可见
常量,一旦被生命,将可以在全局可见
超级全局变量
$GLOBALS 所有全局变量数组
$_SERVER 服务器环境变量数组
$_GET 通过get方法传递给该脚本的变量数组
$_POST 通过post方法传递递给该脚本的变量数组
$_COOKIE cookie变量数组
$_FILES 与文件上载相关的变量数组
$_ENV 环境变量数组
$_REQUEST 所有用户输入的变量数组
$_SESSION 会话变量数组
常量define--一旦被定义后,就不会再更改,要大写
<?php define("TOTO",100); echo TOTO; //一旦定义,就不会再更改 define("TOTO",200); echo TOTO; ?> //100 100
除了自定义常量外,php还预定了许多常量,可以用phpinfo()方法查看,其中

这些都为预定常量(环境变量)
<?php echo $_SERVER["DOCUMENT_ROOT"]; //物理地址 echo $_SERVER["SERVER_PORT"];//端口号 ?>
表单变量
访问表单变量
$userName //简单风格 不允许使用,会混淆和普通变量的关系
$_POST["userName"] //中等风格 把表单中的value提取出来
$HTTP_POST_VARS["userName"] //冗长风格
<form method="post" action="demo02.php"> 姓名:<input type="text" name="userName" /> <input type="submit" value="提交"> </form> <?php //$userName //echo $_POST['userName']; //将表单中的value值提取出来 //$HTTP_POST_VARS["userName"] //不推荐 ?>
变量和字符串之间用.连接
$_GET方式接收需要前面method改成get
七、操作符与控制
1、字符串插入
双引号,可以解析出来变量,如果是中文字符尽量用.来连接
<?php echo $userName="root"; echo "this is name $userName!" //this is name root! ?>
可加入转义字符
单引号,变量和转义字符不会被解析
2、操作符
+、-、*、/、% +=、-=、*=、/=、%= ++、--、==、===、!=.......和js一样
错误抑制符:$a=@(100/0); 除数不能为0,会出错,所以加上@避免出现错误警告。
3、控制结构
if(){}、if(){}else{}、if(){}elseif(){}和js不同的是elseif是连在一起的
switch、while、for....break退出当前循环,exit退出整个程序,continue退出当前本次循环并且继续下次循环
九数学函数、数组
1、数值数据类型
隐式转换
<?php $a="5"; $b=7+$a; echo $b; //12 ?> //如果是. 就是75
is_numeric()可以检查参数传入是否是数字或数字字符串
is_int()是否是整数
is_float()是否是浮点数
2、随机数
rand()产生随机整数 //echo rand(0,10)
mt_rand()替代了rand(),速度更快
3、格式化参数
number_format 以千位分隔符格式化一个数字
<?php $num=123.234; $b=number_format($num,2); echo $b; ?> //123.23
4、数学函数
abs() 绝对值
floot() 舍去法取整
ceil() 进一法取整
round() 四舍五入
min() 求最小值或数组中最小值
max() 求最大值或数组中最大值
十、数组
第一种:通过array()来创建
<?php //创建数组 $arr=array("lynn","zhh","mayun"); //只能打印出类型 //echo $arr; //具体元素要找到他的下标 //echo $arr[0]; //可以通过print_r()来查看数组 print_r($arr); //Array ( [0] => lynn [1] => zhh [2] => mayun ) ?>
第二种:通过range()函数自动创建一个数组
<?php $arr1=range(1,10); print_r($arr1); $arr2=range('a','z'); print_r($arr2); ?>
使用循环访问数组
<?php $arr1=range(1,10); for($i=0;$i<10;$i++){ //$i<$count($arr1); echo $arr1[$i]; echo '<br />'; } ?>
可以使用count()来统计数组的个数
如果key不是从0开始,或者压根不是数字,要用到forEach()来遍历
<?php $arr1=range(1,10); foreach ($arr1 as $value) { echo $value.'<br />'; # code... } ?>

死格式,key和value分别对应键和值;
如果不是数组,就会报错,所以先判断是不是数组用 is_array()来判断
2、自定义键数组
<?php $arr1=array('baidu'=>'lynn','taobao'=>'mayun','360'=>'zhy'); echo $arr1['baidu']; ?>
追加数组
直接追加 $arr1=[‘lynn’]='li';
each 返回当前数组键值对,并将数组指针向前移动一步,默认情况下他指向第一个键值对
<?php $arr1=array('baidu'=>'lynn','360'=>'liyanhui',"souhu"=>'zhou'); $a=each($arr1); echo $a[key]; echo $a[value] ?>
如果前面有一个each(),指针向前移动一步
<?php $arr1=array('baidu'=>'lynn','360'=>'liyanhui',"souhu"=>'zhou'); while(!!$a=each($arr1)){ echo $a['key'].'---'.$a['value'].'<br />'; } ?> //每次移动一次,判断如果有值,就循环
list(),可以直接得到数组的值----只能认识key为数字的,不能认识自定义
<?php $info = array('coffee', 'brown', 'caffeine'); list($var1,$var2)=$info; echo $var2; ?> ///brown
但可以这样做
<?php $info = array('coffee'=>'a', 'brown'=>'b', 'caffeine'=>'c'); list($var1,$var2)=each($info); echo $var1; echo $var2; ?>
each()指针如果想调整到最初,用reset()方法
<?php $info = array('coffee'=>'a', 'brown'=>'b', 'caffeine'=>'c'); $a=each($info); echo $a['key']; //coffee $a=each($info); echo $a['key']; //coffeebrown //如果想取数组第一个数据,用reset()方法 reset($info); $a=each($info); echo $a['key']; //coffee ?>
array_unique移除数组中重复的值
<?php $info = array('coffee'=>'a', 'brown'=>'b', 'caffeine'=>'c','lynn'=>'c'); print_r($info); echo '<br />'; $a=array_unique($info); print_r($a); ?> //移除了lynn
array_filp()交换数组中的键和值
3、二维数组
<?php $info = array( array("主弱",1,11), array("苹果",2,22), array("里",3,33) ); print_r($info) ?> //info[0][0] 可以这样打印
4、数组排序
sort();排序,会改变原数组,可接受第二个参数
SORT_NUMERIC- 单元被作为数字来比较SORT_STRING- 单元被作为字符串来比较- 。。。。
asort();排序,保持原始的key的关联,保持索引关系
ksort();排序,按照键名排序 ,key
反向排序,在所有前面加r,如rsort()、arsort()、krsort()
随机排序,shuffle(),同sort();
反向排序,array_reverse(); 创建新数组
将新元素添加到数组头:array_unshift(); 第二个值设置添加的内容---返回数组元素个数
将新元素添加到结尾:array_push();
删除数组头第一个元素:array_shift();
删除数组尾第一个元素:array_pop();
从数组中随机取出一个或多个单元:array_rand(); 第二个参数是取出几个
<?php $info = array( "pingguo","orange","banner" ); $a=array_rand($info,1); print_r($a); ?>
获取指针当前元素:current(); 默认情况下指针在第一条数据,不会将指针移到下一个
获取当前元素:each(); next(); 会将指针移到下一个
reset(); 会将指针复原
prev();end();和next();相反,将指针往回移一个位置
统计数组下标个数:count();sizeof();
统计数组中所有值出现的次数:array_count_values();
<?php $info = array( 1,2,43,12,3,1,2,3,345,1,2453,1,3,8 ); $a=array_count_values($info); print_r($a); ?> //其中1出现的次数最多,出现了4次
extract() 把数组变成变量
<?php $a=$b=$c=''; $info = array( 'a'=>'apple','b'=>'banner','c'=>'orange' ); //通过标量函数将字符串键(key)设置成变量,然后将值付给这个变量 extract($info); echo $a; //分别得到各自的值 echo $b; echo $c; ?>
十六、目录和文件
1、目录操作
basename(); 返回路径中的文件名部分
dirname(); 返回路径的目录部分
pathinfo(); 路径信息,是个数组,包括目录名,基本名和扩展名...
<?php $path='D:\AppServ\www\statusphp\demo01.php'; echo basename($path); //文件名 echo dirname($path); //目录部分 echo pathinfo($path); //路径的信息,创建一个关联数组,包括目录名,基本名和扩展名 echo '<br />'; print_r(pathinfo($path)); //dirname\basename\extension\filenam ?>
realpath(); 转换成绝对路径
<?php $path='demo01.php'; echo realpath($path); //转换成绝对路径 ?>
2、磁盘路径和目录和文件计算
filesize(); 取得文件大小,返回的是字节
disk_free_space(); 磁盘可用空间
disk_total_space(); 磁盘总空间
fileatime(); 获取文件最后的访问时间 返回一个时间戳,需要格式化
filectime(); 获取文件最后的改变时间
filemtime(); 获取文件最后的修改时间
<?php $path='demo01.php'; echo filesize($path); //文件大小 返回字节 echo disk_free_space('C:'); //返回磁盘可用空间大小 /1024就是KB echo disk_total_space('C:'); //返回磁盘总空间大小 /1024就是KB echo '<br />'; echo fileatime($path); //最后访问时间 echo '<br />'; //格式化一个本地日期 date_default_timezone_set('Asia/Shanghai'); //调整一下时区 echo date('Y-m-d H:i:s'); echo date('Y'); echo '<br />'; echo date('Y:m-d H:i:s',fileatime($path)) //把时间戳放进去,转换成时间 ?>
3、文件处理
将数据写入一个文件,需要三个步骤,打开一个文件(如果文件不存在需要创建他),将数据写入,关闭文件
将数据读出,需要三个步骤,打开一个文件(如果文件不存在需要创建他),将数据读出,关闭文件
fopen('file.txt','w'); 打开一个文件,需要制定如何使用它,也就是文件模式;
fopen()文件模式
第一个参数是哪个文件,第二个参数表明模式
如果文件已经有了,并且有数据,那么删除这个文件,重新创建
如果没有这个文件,那么那么就自行创建
打开后要关闭掉
fclose();
<?php $a=fopen("bb.txt", 'w'); fclose($a); ?>
r 只读,r+读写, w只写,w+读写,a读写.....
fwrite()写入 第一个参数是资源句柄,第二个是内容,第三个参数是长度
<?php $a=fopen("bb.txt", 'w'); //打开 fwrite($a,'this haha'); //写入 fclose($a); //关闭 ?>
file_put_contents('xx.txt','neirong'); 就只有一句话,不需要做其他的事,使用这个,php5才有用
<?php //第一种写法 $a=fopen("bb.txt", 'w'); //打开 $outputstring="this is wq!\r\n19"; fwrite($a,$outputstring,strlen($outputstring)); //写入 fclose($a); //关闭 //第二种写法 file_put_countents('bb.txt',"this is wq!\r\n19"); ?>
读取:
$fp=fopen('xx.txt','r');
fgetc(); 读出一个字符,并将指针移到下一个字符
fgets(); 读出一样字符,可以制定一行显示的长度(第二个参数)--长度-1的字符串
fgetss(); 从文件指针中读取一行并过略掉html标记
fread(); 读取定量的字符
fpassthru(); 输出文件指针处的所有剩余字符
file(); 将整个文件读入数组中,以行分组
readfile(); 读入一个文件并写入到输出缓冲 ,将整个文件都出来,不需要echo,返回值是文件字节的总长度
file_get_contents(); 将整个文件读入一个字符串 php5才有,同上,只是不用关闭
<?php $a=fopen("bb.txt", 'r'); //打开 echo fgets($a); //读一行 fclose($a); //关闭 ?>
//读取一个文件的时候,必须保证这个文件存在,否则就报错,有必要做检测
file_exists-- 检查文件或目录是否存在
<?php if(file_exists('bb.txt')){ echo '执行各种各样的文本操作!'; }else{ echo '此文件不存在'; } ?>
unlink('xx.txt'); 删除一个文件
rewind(); 倒回到文件指针的位置,回到首位
ftell(); 返回文件指针的位置,只是查看,从0开始
fseek(); 在文件指针中的位置,第二个参数是定位的位置
4、文件锁定
读写文件的时候,进行文件锁定
flock(); LOCK_EX文件锁定,LOCK_UN文件解锁
<?php $a=fopen('xx.txt','ab'); flock($a,LOCK_EX); //锁定 fwrite($a, "haha"); //操作 flock($a,LOCK_UN); //解锁 ?>
opendir(); 打开一个目录,可以放绝对路径,也可以放相对路径
closedir(); 关闭一个目录
readdir(); 读出一个目录,每次读出一个,使用一个循环来读出
<?php $a=opendir('../statusphp'); //读出目录,使用一个循环来读出 //字符串如果是布尔值,就是说,字符串不为空,那么就是真,为空就是假 while(!!$file=readdir($a)){ echo $file.'<br />'; } closedir($a); ?>
scandir(); 列出指定路径的文件和目录,生成数组,不需要打开和关闭
<?php print_r(scandir('../statusphp')); ?>
rmdir(); 删除一个目录,不需要打开和关闭,同样相对路径和绝对路径都可以操作
unlink(); 删除文件
rename(); 重命名,第二个参数是修改后的名字,目录和文件都可以重命名
二十、自定义函数
1、标准函数
标准php发行包中有1000多个标准函数,这些标准函数都是系统内置的,不需要用户自己创建而可以直接使用
<?php echo md5('123456'); //MD5函数对字符串进行加密处理 ?>
2、自定义函数
同js
和js不同的是函数中的变量和外面的变量没关系,如果函数中没有变量不会去全局变量中去找
&符号,按引用传参
<?php $prices =50; $tax=0.5; function functionPrices($prices,$tax){ $prices=$prices+$prices*$tax; $tax=$tax*$tax; echo $prices; echo "<br />"; echo $tax; echo "<br />"; } functionPrices($prices,$tax); //75,0.25 echo $prices; //50 echo "<br />"; echo $tax; //0.5 echo "<br />"; ?> ------------------------------------------------------------ <?php $prices =50; $tax=0.5; function functionPrices(&$prices,$tax){ $prices=$prices+$prices*$tax; $tax=$tax*$tax; echo $prices; echo "<br />"; echo $tax; echo "<br />"; } functionPrices($prices,$tax); //75,0.25 echo $prices; //75 按引用 echo "<br />"; echo $tax; //0.5 echo "<br />"; ?>
函数调用不区分大小写,变量区分大小写
全局变量
<?php $a=5; function fa(){ global $a; //设置成全局变量 $a=2; } fa(); echo $a; ?>
使用超级全局变量
<?php $GLOBALS['a']=5; function fa(){ $GLOBALS['a']=2; } fa(); echo $a; ?>
3、文件包含
为了创建自己的函数库,要引用文件内的function
include 语句包含并运行指定文件,运行了而已
<?php include 'library/library.php'; //引用这个文件,这个文件中有一个functionPi()函数 echo functionPi(); ?>
如果写两遍,就包含两遍
如果只想包含一次,用include_once(); 他会判断之前是否包含
require()和require_once()同include和include_once()一样,只是如果文件不存在不会有警告直接报错停止执行
4、魔法常量
__FILE__ 当前文件名
<?php //__FILE__ 取得路径 //$file=__FILE__; //echo $file; //一般包含我呢见的时候,建议采用__FILE__ ,这样速度更快 require dirname(__FILE__).'\demo01.php'; ?>
__LINE__ 当前行号
__FUNCTION__ 当前函数名
<?php function aaa(){ return __FUNCTION__; } echo aaa(); ?>
__CLASS__ 当前类名
__METHOD__ 当前方法名
二十三 字符串处理
二十七 正则
三十日期和时间
三十二表单与验证
header();函数重新导向一个url
header('Location:demo02.php');自动跳转,也可以非本地跳转
//在执行header()之前不能有任何浏览器输出,输出任何都不行包括空格,解决方案要启用缓冲输出 ob_start();(在之前写入)
可用于设置页面字符编码 //之前输出还是有上面的内容
<?php header('Content-Type:text/html;charset=gbk'); echo '编码是GBK'; ?>
<form method="post" action="demo02.php"> 姓名:<input type="text" name="userName" /> <input type="submit" value="提交"> </form> <?php //$userName //echo $_POST['userName']; //将表单中的value值提取出来 //$HTTP_POST_VARS["userName"] //不推荐 ?>
采用isset()判断变量是否存在,用empty()和==基本一样,并不能说非法提交只能说没有填写内容
<?php if(isset($_POST["username"])){ echo '正常提交'; }else{ echo '非法提交'; } ?>
在输出之前,为了安全性,禁止解析html
<?php if(isset($_POST["username"])){ echo '正常提交'; $username=$_POST['username']; $username=htmlspecialchars($username); //禁止解析html echo $username; }else{ echo '非法提交'; } ?>
都数据有效性进行验证,可以用trim()
对长度进行限制 if( strlen($username)<2 ){ echo '小于两位';exit; }
判断是否是纯数字is_number();
判断邮箱是否合法,用正则
完成的例子
<?php //设置编码 header('Content-Type:text/html;charset=utf-8'); //先验证是否是提交过来的 if(!isset($_POST['code'])){ header('Location:demo01.php'); exit; } //接收所有数据 $username=$_POST['username']; $password=$_POST['password']; $code=$_POST['code']; $content=$_POST['content']; $email=$_POST['email']; //用户名不能小于两位,不能大于10位 if(strlen($username)<2 || strlen($username)>10){ echo "<script>alert('用户名不能小于两位,不能大于10位');history.back();</script>"; exit; } //密码不能小于六位 if(strlen($password)<6){ echo "<script>alert('密码不能小于六位');history.back();</script>"; exit; } //验证码必须是4位,必须是数字 if(strlen($code)!=4 || !is_numeric($code)){ echo "<script>alert('验证码必须是4位,必须是数字');history.back();</script>"; exit; } //验证电子邮箱 if(!preg_match('/([\w\.]{2,255})@([\w\-]{1,255}).([a-z]{2,4})/', $email)){ echo "<script>alert('电子邮箱不合法');history.back();</script>"; exit; } echo '用户名'.$username.'<br />'; echo '电子邮箱'.$email.'<br />'; echo '个人介绍'.$content; ?>
三十四、会话控制
cookie:客户端生成
setcookie();创建cookie
$_COOKIE[];读取cookie,超级全局变量,他会慢一拍,第一次刷新只是生成覆盖原来的,但获取的还是之前的,而第二次刷新,才能真正获取到
<?php //创建cookie setcookie(); setcookie('name','Lynn',time()+(7*24*60*60)); //不设置过期时间,会话结束就没有了,表示未来七天 echo $_COOKIE['name']; //读取cookie,使用超级全局变量 ?>
用判断检测函数判断cookie是否存在
<?php setcookie('name','Lynn',time()+(7*24*60*60)); if(isset($_COOKIE['name'])){ echo $_COOKIE['name']; }else{ echo '此用户不存在'; } ?>
删除cookie
<?php setcookie('name','Lynn',time()+(7*24*60*60)); //第一种删除方法,将这个cookie设置为空 //setcookie('name',''); //第二种删除方法,将过期时间调整到之前的时间 setcookie('name','lynn',time(-1)); echo $_COOKIE['name']; ?>
cookie有限制,每个大小不能超过4kb,每个web站点能设置的cookie总数不能超过20个,一个浏览器能创建的cookie数量最多为30个,限制在客户端
综合例子
//demo01.php <form method="post" action="demo02.php"> 姓名<input type="text" name="username" /><br /> <input type="submit" value="提交" name="code" /><br /> </form> //demo02.php <?php if(isset($_POST['code']) && isset($_POST['username']) && $_POST['username']=='111'){ setcookie('name','lee'); header('Location:demo03.php'); }else{ header('Location:demo01.php'); } ?> //demo03.php <?php if(isset($_COOKIE['name'])){ echo '欢迎光临'.$_COOKIE['name']; }else{ echo '非法登陆'; } ?>
session,只用用session,就必须开启session会话处理 session_start();
创建session,直接采用超级全局变量赋值即可 $_SISSION['']='';取值就直接打印
他和cookie根本都区别是没有慢一拍(因为session是存放在服务器端的),一般存在1440s,如果没有网页任何操作,会自动修改,但可以修改php.ini保存时间,如果关闭浏览器,会自动销毁
判断方法和之前一样 isset();
<?php session_start(); $_SESSION['name']='lee'; echo $_SESSION['name']; ?>
删除session,不能将字符串设为空,用 unset($_SESSION['']);
unset($_SESSION['name']);
销毁所有的SESSION-------session_destroy(); 也慢半拍
cookie适用于会员登录,购物车。。。因为不占用服务器资源
session一般用于后台管理登陆,人少,安全性好
三十六、上传文件
$_FILE; 超级全局变量(没有括号),是一个数组
<form method="post" action="upload.php" enctype="multipart/form-data"> <!-- 这里是固定写法,否则上传文件失败 -->
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" /><!-- 隐藏域,定义了上传文件大小的限制,必须定义在上传域前面,不能超过php.ini中的upload_max_filesize设置的值,否则没意义 -->
上传文件<input type="file" name="userfile" />
<input type="submit" value="上传" />
</form>
upload.php进行接受
print_r($_FILES); 是一个数组,打印内容如下
Array ( [userfile] => Array ( [name] => 9.供应商选择.png [type] => image/png [tmp_name] => C:\Windows\Temp\php60C1.tmp [error] => 0 [size] => 131967 ) )
其中userfile是上传域的name
- [userfile][name]:是用户系统中的文件名称
- [userfile][type]:是文件类型
- [userfile][tmp_name]:是web服务器中临时存储的位置
- [userfile][size]:是文件的字节大小
- [userfile][error]:是错误类型,0没有任何错误
判断文件是否是通过HTTP POST上传的 is_uploaded_file(); 通过这个上传后会存在临时文件夹下
<?php if(is_uploaded_file($_FILES['userfile']['tmp_name'])){ echo '上传的临时文件已找到,等待移动中...'; }else{ echo '临时文件找不到'; } ?>
//通过
//is_uploaded_file($_FILES['userfile']['tmp_name']是否有临时文件来判断
移动文件 move_uploaded_file(); 将上传文件移动到新位置,如果不合法,会返回false
<?php if(is_uploaded_file($_FILES['userfile']['tmp_name'])){ //移动文件到新位置 //echo $_FILES['userfile']['tmp_name']; C:\Windows\Temp\phpDDEF.tmp //第一个参数,临时文件地址,第二个是要存放的地址 move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name']); }else{ echo '临时文件找不到'; } ?>
//demo01.php <form method="post" action="upload.php" enctype="multipart/form-data"> <!-- 这里是固定写法,否则上传文件失败 --> <input type="hidden" name="MAX_FILE_SIZE" value="1000000" /><!-- 隐藏域,定义了上传文件大小的限制,必须定义在上传域前面,不能超过php.ini中的upload_max_filesize设置的值,否则没意义 --> 上传文件<input type="file" name="userfile" /> <input type="submit" value="上传" /> </form> //upload.php <?php if(is_uploaded_file($_FILES['userfile']['tmp_name'])){ //移动文件到新位置 //echo $_FILES['userfile']['tmp_name']; C:\Windows\Temp\phpDDEF.tmp //第一个参数,临时文件地址,第二个是要存放的地址 if(!move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name'])){ echo '移动失败'; exit; } }else{ echo '临时文件找不到'; } echo "<script>alert('上传成功');location.href='demo03.php?url=".$_FILES['userfile']['name']."';</script>" ?> //demo03.php <?php $url=$_GET['url']; echo '<img src="'.$url.'" />'; ?>
//用get进行接收
判断error
<?php if($_FILES['userfile']['error']>0){ switch($_FILES['userfile']['error']){ case 1:echo "上传文件超约定值"; case 2:echo "上传文件超约定值"; case 3:echo "部分被上传"; case 4:echo "没有任何文件被上传"; break; } exit; } ?>
判断只能允许jpg文件
<?php if($_FILES['userfile']['type']!='image/jpeg'){ echo "<script>alert('本站只允许JPG图片!');history.back();</script>";
exit; } ?>
浏览器的type值有些不一样,可能是 image/pjpeg,兼容写法
switch($_FILES['userfile']['type']){ case 'image/jpeg'://火狐 break; case 'image/pjpeg'://IE break; case 'image/gif': break; case 'image/png'://火狐 break; case 'image/x-png'://IE break; default: echo "<script>alert('本站只允许上传图片!');history.back();</script>"; exit; } //可以这样写 $fileMimes=array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif'); //判断类型是否是数组里的一种 if(is_array($fileMimes)){ if(!in_array($_FILES['userfile']['type'],$fileMimes)){ echo "<script>alert('本站只允许上传图片!');history.back();</script>"; } }
判断文件大小
//创建一个常量 define('MAX_SIZE',2000000); //判断配置大小 if($_FILES['userfile']['size'] > MAX_SIZE){ echo "<script>alert('上传文件不得超过2M');history.back();</script>"; exit; }
如果没有目录,创建目录
define('URL',dirname(__FILE__).'\uploads');
echo URL; //D:\AppServ\www\statusphp\uploads
//判断目录是否存在
if(!is_dir(URL)){
mkdir(URL,0777); //最大权限,0777意思没有这个目录,就创建
}
三十九、处理图像
一般生成的图像可以是png,jpeg,gif,bmp
第一步,设置文件MIME类型,输出类型,默认为text/html类型为网页类型
设定标头,告诉浏览器要生成的MIME类型,将输出类型改成图像流 ,声明是一张图片
header('Content-Type:image/png');
第二步,创建一个图形区域
//有两种创建方式 资源类型要加上@防止出错 $im=imagecreatetruecolor(200, 200); //返回资源句柄
第三步,在空白图像区域绘制 颜色,线条。。。
//首先要有一个颜色填充器 //imagecolorallocate(image, red, green, blue) 填充颜色 $blue=imagecolorallocate($im, 0, 102, 255); //创建颜色 //imagefill(image, x, y, color) 填充颜色 imagefill($im, 0, 0, $blue);
第四步,在背景上输入内容
$white=imagecolorallocate($im, 255, 255, 255); //imageline 画一条线imageline(image, x1, y1, x2, y2, color) imageline($im, 0, 0, 200, 200, $white); imageline($im, 200, 0, 0, 200, $white); //imagestring 绘制文本imagestring(image, font, x, y, string, color) imagestring($im, 5, 0, 0, 'Mr.LEE', $white);
第五步,输出
imagepng($im)
第六步,清空资源
imagedestroy($im);
第七步,调用
echo '<img src="Demo01.php" alt="图像" />'
完整
//demo01.php <?php echo '<img src="Demo02.php" alt="图像" />'; ?> //demo02.php <?php //第一步,设置文件MIME类型 header('Content-Type:image/png'); //第二步,创建一个图形区域 //有两种创建方式 资源类型要加上@防止出错 $im=imagecreatetruecolor(200, 200); //返回资源句柄 //第三步,在空白图像区域绘制 颜色,线条。。。 //首先要有一个颜色填充器 //imagecolorallocate(image, red, green, blue) 填充颜色 $blue=imagecolorallocate($im, 0, 102, 255); //创建颜色 //imagefill(image, x, y, color) 填充颜色 imagefill($im, 0, 0, $blue); //第四步,绘制内容 $white=imagecolorallocate($im, 255, 255, 255); //imageline 画一条线imageline(image, x1, y1, x2, y2, color) imageline($im, 0, 0, 200, 200, $white); imageline($im, 200, 0, 0, 200, $white); //imagestring 绘制文本imagestring(image, font, x, y, string, color) imagestring($im, 5, 0, 0, 'Mr.LEE', $white); //第五步,输出到浏览器或文件(最终图形)imagepng() imagepng($im); //第六步,清空资源 imagedestroy($im); ?>
例:简单的验证码
<?php //简单验证码 //dechex --可以将十进制转换成十六进制 //创建4位验证码 for($i=0;$i<4;$i++){ $nmsg.=dechex(mt_rand(0,15)); } header('Content-Type:image/png'); //1 $im=imagecreatetruecolor(75, 25); //2 $blue= imagecolorallocate($im, 0, 102, 255); //3 $white=imagecolorallocate($im, 255, 255, 255); imagefill($im, 0, 0, $blue); imagestring($im, 5, 15, 5, $nmsg, $white); //4 imagepng($im); //5 imagedestroy($im);//6 ?>
例:加载已有的图像
<?php //简单验证码 //dechex --可以将十进制转换成十六进制 //创建4位验证码 for($i=0;$i<4;$i++){ $nmsg.=dechex(mt_rand(0,15)); } header('Content-Type:image/png'); //1 //imagecreatefrompng(filename) 从PNG文件或URL新建一图像,这种方式可以编辑,可以加水印 define('URL',dirname(__FILE__).'\\'); $im=imagecreatefromjpeg(URL.'222.jpg'); //2 //里面放路径,插入一张已有的图片 $white=imagecolorallocate($im, 255, 255, 255); //3 imagestring($im, 5, 20, 10, 'mia.com', $white); //4 imagejpeg($im); //5 imagedestroy($im);//6 ?>
例:加载已有字体
<?php header('Content-Type:image/png'); //1 //imagecreatefrompng(filename) 从PNG文件或URL新建一图像,这种方式可以编辑i,可以加水印 define('URL',dirname(__FILE__).'\\'); $im=imagecreatefromjpeg(URL.'222.jpg'); //2 //里面放路径,插入一张已有的图片 $white=imagecolorallocate($im, 255, 255, 255); //3 //imagettftext(image, size, angle, x, y, color, fontfile, text) 采用系统提供的字体 $text=iconv('gbk','utf-8','中文'); //如果是中文,转换格式 $font='C:\WINDOWS\Fonts\verdana.TTF'; imagettftext($im, 20, 0, 30, 30, $white, $font, $text); imagejpeg($im); //5 imagedestroy($im);//6 ?>
例:调整图像尺寸
<?php header('Content-Type:image/png'); //1 define('URL',dirname(__FILE__).'\\'); list($width,$height)=getimagesize(URL.'222.jpg'); //list把数组中的值赋给一些变量,getimagesize(URL.'222.jpg')返回一个数组 $new_width=$width*0.7; $new_height=$height*0.7; $im=imagecreatetruecolor($new_width, $new_height); //新建一个真彩色图像,宽高是转换以后的 $im2=imagecreatefromjpeg(URL.'222.jpg'); //由文件或 URL 创建一个新图象 imagecopyresampled($im, $im2, 0, 0, 0, 0, $width , $height , $new_width , $new_height); //重采样拷贝部分图像并调整大小 imagejpeg($im); //5 imagedestroy($im);//6 imagedestroy($im2); ?>
四十二、mysql
1、登陆到MySQL
- 显示当前数据库的版本号和日期
SELECT VERSION(),CURRENT_DATE();
- 通过AS关键字设置字段名
SELECT VERSION() AS version; //可设置中文,通过单引号
- 通过SELECT 执行返回计算结果
SELECT(20+5)*4;
- 通过多行实现数据库的使用者和日期(只要不打回车就不会退出)
SELECT
->USER()
->NOW();
- 通过一行显示数据库(可以用逗号,也可以打两遍)
SELECT USER();SELECT NOW(); SELECT USER(),NOW();
- 命令取消
\c
- 窗口退出(ctrl+c)
exit;
MYsql的数据库操作
1)显示当前存在的数据库
SHOW DATABASES;
2)选择你所需要的数据库
USE guest;
3)查看你所选择的数据库
SELECT DATABASE();
4、查看一张表的内容 //可以先通过SHOW TABLES;查看有多少张表
SELECT * FROM guest; //如果只想显示部分,把星号改成要显示的名字
5)根据数据库设置中文编码
SET NAMES gbk; //set names utf8;
6)创建一个数据库
CREATE DATABASE book;
7)在数据库里创建一张表
>CREATE TABLE uses(
>nusername VARCHAR(20), //设置不能为空(姓名采用verchar可变字节)
>sex CHAR(1), //性别 使用char
>birth DATETIME); //年龄 使用datetime类型
8)显示表的结构
DESCRIBE uses;
9)给表插入一条数据
INSERT INTO uses (username,sex,birth) VALUES('Lee','X',NOW());
10)筛选指定的数据
SELECT * FROM uses WHERE username = 'Lee';
11)修改指定的数据
UPDATE uses SET sex='男' WHERE username= 'Lee';
12)删除指定的数据
DELETE FROM uses WHERE sex='1';
13)按照指定的顺序排序
SELECT * FROM uses ORDER BY birth DESC; //按照时间的倒序
SELECT * FROM uses ORDER BY birth ASC; //按照时间的正序
14)删除指定的表
DROP TABLE uses;
15)删除指定数据库
DROP DATABASE books;
MySQL常用函数





例:
创建一个班级数据库,里面包含一张班级表 grade,包含编号(id)、姓名(name)、邮件(email)、评分(point)、注册日期(regdate)
CREATE DATABASE school; //创建表 USE school; //锁定表 mysql> CREATE TABLE grade( -> id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT, //无符号,整数2位,从1开始 -> name VARCHAR(20) NOT NULL, -> email VARCHAR(40), -> point TINYINT(3) UNSIGNED NOT NULL, -> regdate DATETIME NOT NULL, -> PRIMARY KEY(id) //id为主键,让id值唯一,不得重复 -> ); //创建表 DESC grade; // 查看表
给这个班级表grade新增5-10条学员记录
mysql> INSERT INTO grade(name,email,point,regdate) VALUES('lee','yc60',95,NOW());
查看班级的字段
mysql> SELECT id,name,email FROM grade;
..................
mysql地址:http://localhost:8082/phpmyadmin/
浙公网安备 33010602011771号