java到php之:php知识点概括
2013-10-08 17:06
190 查看
1:
配置:在开始程序中apache的Edit the Apache httpd.conf Configuration
File进行
配置
a:更改DocumentRoot,即我的项目的存放路径
b: 同时更改DIRECTORY 同上路径
c: DirectoryIndex(目录索引,也就是在仅指定目录的情况下,默认显示的文件名)
,可以添加很多,系统会根据从左至右的顺序来优先显示,以单个半角空格隔开,比如
有些网站的首页是index.htm,就在光标那里加上“index.htm ”文件名是任意的,不
一定非得“index.html”,比如“test.php”等,都可以。
我这里未做更改,项目存放路径为安装目录下的htdocs(相当于tomcat的webapps)
命令启动apache:
可以通过命令行开关来控制Apache服务。要启动一个已经安装的Apache服务,可以使用
:
httpd -k start
要停止一个已经安装的Apache服务,可以使用:
httpd -k stop
或
httpd -k shutdown
要重启一个运行中的Apache服务,强制它重新读取配置文件,可以使用:
httpd -k restart
*****************************
---------------------------------------
*********************************************
php语法简介:
1:判断类型
instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例(如属于person类),
通常在面向对象开发中可能用的。$xiaoming=new person;$xiaoming.instanceof
person
2:表示两内容的拼接
$c=$b.$a; //$a 具体表示内容和 $b 表示内容拼接
echo "计算结果是=".$res;
3:定义常量(变量名前不需加$)
a:使用define
define("TAX_RATE",0.08);
b:const TAX_RATE2=0.1;
//注意只有const变量前不需要加$
4:引入另一个php页面,并使用其中函数
//1.
//require 'b.php';
//2. 通过变量引入
//$fileName="b.php";
//require $fileName;
//3.
require ('b.php');
abc();//调用b.php中的函数
require 和require_once 区别
这两个区别为,前者遇到即包含文件,后者会判断是否已经包含过了,如果包含过了,
则不再包含文件。一可以节省资源,二可以避免重复定义的错误。
redeclare: 再次声明.
include: 包含,包括
再谈 include 和 require 区别 ( 同时 include_once 和
require_once 区别)
相同的地方就是,都是可以引入别的页面.
不同的地方是: include 如果出现了错误,会继续执行,require 出现错误,则会终止
程序.
证明:
小结: 我们应当使用哪个?
我们做项目的时候,基本上使用的 require_once
注意我们的requir_once / require ... 应当放在 php 最前面.
5: php的变量的类型都不申明的,这跟java有很大的区别,在以后写代码的时候记住
php 的变量的数据类型,是变化的,php变量的数据类型是由运行时的上下文决定
如:private $age;//在赋值的时候确定
java--private int age;
但是属性 必须指定访问修饰符!!
6://定义全局变量---注意啦。声明和赋值写成一句话居然会报错!
global
$global_nums;//声明,这个语句是放在<?php
..位置的,而不是放在像java放在class 括号内的!
$global_nums=0;//赋值
在函数内使用的时候需要再次申明一下,不然报错
global $global_nums;
7:php的一些常量,可以去查手册
*********接收表单的参数
<form action="homework01.php"
method="post">
<input type="text"
name="layer"/>
<select name="shape">
//在php页面接收
$n=$_REQUEST['layer'];
$shape=$_REQUEST['shape'];
***********类的成员和函数调用
$cat1=new Cat();//前面不需要加Cat
$cat1->name="小白";//$对象名->属性名;必须是public或者protected(看情况)才能访
问
$cat1->speak();//调用函数,不是使用.了
****************函数传参时是传的地址还是值
传的是值,如果要传地址需加&
***************构造方法
在php 5 中一个类可以同时有 两种形式的构造方法--php方法前都要加function关键字!
__construct() 和 类名() , 当两个同时存在的时候,优先调用__construct(),
请大家以后使用__construct()
public function __construct($iname,$iage){
//$name=$iname;
//$age=$iage;
$this->name=$iname;
$this->age=$iage;
echo
“我是构造方法”;
}
注意:
1. $this
本质可以理解就是这个对象的地址
2. 哪个对象使用到$this,
就是哪个对象地址
3. $this不能在类外部使用.
构造方法的注意事项
(1)一旦自定义了一个构造函数,默认的
构造函数就被覆盖了,这时在创建对象的时候就要使用自定义的构造函数.
(2)一个类只能有一个构造函数.(不能重载),子类不会默认调用父类的构造函数,这与java不同!
构造方法的8点说明:
①构造方法名和类名相同(php4版),php5版的构造方法
名可以和类名相同,也可以是__construct()
②构造方法没有返回值
③主要作用是完成对新对象的初始化,并不是创建对象本身。
④在创建新对象后,系统自动的调用该类的构造方法
⑤一个类有且只有一个构造方法,在php5后虽然__construct() 和 类名()
可以共存,但是实际上也只能使用一个。
⑥如果没有给类自定义构造方法,则该类使用系统默认的构造方法。
class Cat{
//注意__是两个下划线
funciton __construt($name){
echo “ok”;
}
}
$cat1=new Cat();
⑦如果给类自定义了构造方法,则该类的默认构造方法被覆盖。
⑧构造方法的默认访问修饰符是public
**************************** 析构方法 (java没有,自动的垃圾回收机制)
这里我要谈到面向对象和面向过程的问题!
在csdn上发现一个问题:
--1--
有个VC写的DLL有3个方法,
Open();
耗时5秒
DoSomething(); 耗时0.1秒
Close();
耗时0.1秒
--1--
我现在已经写了一个javaBean,对应3个方法,并且调试成功。
jOpen();
jDoSomething();
jClose();
但是由于DoSomething是被多次频繁调用的方法,所以不能每次都去Open,Close.
所以我希望在构造的时候Open一次,直到用完了再Close。
这样是不是要写一个“静态类”一样的东西保证构造时Open一次,一直使用,到析构的
时候再做一次Close就够了。
1.这个静态类怎么写呢?
2.java没有析构函数,Close的时机也不好确定。
解答:在1中这是典型的面向过程的思路,所以在java中的面向对象的过程必须是建立一个对象,然后再对象中进行此三个方法的定义,然后再调用(怎么调用看自己的控制)不过这个实例的close方法是怎么代表其消亡的呢?如果不想每次去调用open的话那么可以使用单例的模式!java的finalize()方法,在jvm中我将研究finalize
php中的析构函数:注意一个类最多只有一个,且无返回值
function __destruct(){
echo $this->name."销毁资源
关闭数据库..<br/>";
}
1.
析构方法会自动调用
2.
析构方法主要用于销毁资源
3.
析构方法调用顺序是,先创建的对象后被销毁
4.
析构方法什么时候被调用
(1)
当程序(进程结束)退出时
(2)
当一个对象称为垃圾对象的时候,该对象的析构方法也会被调用,
(3)
所谓垃圾对象,就是指,没有任何变量再引用它.
(4)
一旦一个对象成为垃圾对象,析构方法就会立即调用
**************************get/set方法
这个知识点在java中我都有点不记得了,在类中的成员属性修饰符一般是使用private
修饰的(即只限在本类中使用)如果不使用get/set方法在新建一个类的时候
Person p=new Person();//p是无法设置age等属性的,很自然的我们使用p.setAge(1)
private $age;//不写类型的啊
//查看年龄
public function getAge(){
return $this->age;
}
php还有一种特别的,就是不要对每个属性写get/set方法,直接一起解决,但不建议使用。通过 一对
__set 和 __get方法来操作我们的变量
//使用__set
方法来管理所有的属性,pro_name,pro_val为固定标志
public function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
//使用__get 可以获取所有的属性值
public function __get($pro_name){
if(isset($pro_name)){
return $this->pro_name;
}else{
return
null;
}
}
**********类中的属性和方法在各个方法中的引用必须加$this->
function test11(){
$this->name="hljmr";
$this->test12();
}
*****************继承。和java一样不支持多继承
class 类名 extends 父类名{
//在写自己需要的属性和方法.
}
1.
父类的 public 、protected
的属性和方法被继承. private 的属性和方法没有被继承.
2.
一个类只能继承一个父类,(直接继承).如果你希望继承多个类的属性和方法,则使用多层继承
3.
当创建子类对象的时候,默认情况下,不会自动调用父类的构造方法.
4.
如果我们希望去调用父类的 构造方法,或者其它的方法(public
/ protected) ,可以这样处理
(了解)
4.1
类名::方法名() 4.2
parent::方法名()
*******************静态static
使用静态变量
静态的变量的基本用法
1.
在类中定义静态变量
[访问修饰符] static $变量名;
2.
如何访问静态变量
如果在类中访问 有两种方法 self::$静态变量名 ,
类名::$静态变量名
如果在类外访问: 有一种方法 类名::$静态变量名
*****************重载
基本概念:
函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名,但是可以区分不同的函数。。。为什么在这里要写上定义呢,因为在php中根据这个定义很容易出错!
class A{
public function test1(){
echo “test1”;
}
public function test1($a){
echo “test1 hello”;
}
}
重载
$a =new A();
$a->test1();
$a->test1(456);
上面的这用用法是不对.
PHP5
中如何通过魔术函数来实现方法重载的效果,我觉得一点都不好用,官方就不推荐,看看php6怎么解决的!
代码说明
<?php
class A{
public function test1($p){
echo "接收一个参数";
echo "<br/>接收到参数是";
var_dump($p);
}
public function test2($p){
echo "接收两个参数<br/>";
var_dump($p);
}
//这些提供一个__call 魔术函数
//__call 是它一个对象调用某个方法,而该方法不存在,则
//系统会自动调用__call
function __call($method,$p){
var_dump($p);
if($method=="test"){//根据参数个数区分,当然也可以根据参数的类型来写
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}
}
}
$a=new A();
$a->test(1);
$a->test(56,90);
?>
小结: 关于重载
①
php5 默认情况下不直接支持方法重载
②
php5
可以同__call魔术方法,模拟一个方法效果的效果.
***********************重写,在父类中不知道怎么写某个模块的时候可以再子类中进行重写,如动物的叫声!
关于方法重写细节讨论
1.
要实现重写,要求 子类的那个方法的名字和参数列表个数一摸一样,但是并不要求参数的名称一样.
2.
如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法名(参数..) ,
父类名::方法名(参数...)
3. 注意
在实现方法覆盖的时候,访问修饰符可以不一样
//但是必须满足: 子类的访问范围>=父类的访问范围
注意这里面出现了多态,如当你没有在子类中重写这个方法的时候,那么子类调用的还是父类的方法!
*******************************抽象类
1.
在实际开发中,我们可能有这样一种类,是其它类的父类,但是它本身并不需要实例化,主要用途是用于让子类来继承,这样可以到达代码复用.
同时利于项目设计者,设计类.
快速入门
当然,1。 在实现方法覆盖的时候,访问修饰符可以不一样。2.但是必须满足:
子类的访问范围>=父类的访问范围3.含抽象方法的,必须是抽象类,抽象类但并不需要全是抽象方法abstract
class Animal{ abstract public function cry();4.
如果A类继承了一个抽象类 B,则要求A类实现从B类继承的所有抽象方法
*******************************接口
class 类名 implements 接口名1,接口2.
一个类可以去实现多个接口(解决单一继承的缺陷),注意:接口的方法是public 【默认就是public 】
interface iUsb{
//属性
//方法
}
//1.当一个类实现了 某个接口,则要求该类必须实现这个接口的所有方法
//接口的方法都不能有方法体, 接口它的作用就是 声明一些方法,供其它类来实现.
接口还体现编程中我们希望的效果 高内聚低耦合 的
什么情况下可以考虑使用接口----项目经理常做的工作
1.
定规范
2.
定下规范,让别的程序员来实现
3. 当多个类 ,他们之间是平级的关系. 这些类都会去实现某个功能,只是实现的方式不一样
*******************************
final关键字和const关键字
用法Final:不希望类被继承,不希望方法被修改,注意final关键字不能去修饰属性.java可以
用法const:当你有一个属性,不希望被修改,则考虑使用const 做成常量。
定义const 常量名=赋初值;
//不要加修饰符,必须给定初值,不需要$了!!常量在类的内部使用 self::常量的名称 类名::常量的名称(类外部也使用此)
使用 类名::常量名; 接口名::常量
比较一下java 的final 修饰符
可以修饰类,方法,属性
Java 的final修饰的时候注意两种,一种是修饰基本数据类型如final int
i=100;必须赋值,且i=100永远不变,另一种是修饰对象引用,比如说final Husbrand
hl;那么一个女生在引用这个老公对象后就永远不可以换老公,但是老公本身是可以改变的(职业,工资等属性)!!
******************************错误和异常处理介绍 处理错误方式①-die
php处理错误的三种方法
1.
使用简单的die 语句
使用方法如下 :(1)
if(!file_exists("aaa.txt")){
die("文件不存在");
}else{
//打开文件操作
}
echo "ok";
(2) 更简单的方法
file_exists("aaa.txt") or die("文件不存在!!!");
用户自定义错误处理器
在php中对错误有不同的级别区分:
案例入门 :
<?php
//定义了一个函数(我用于处理错误的函数)
function my_error($errno,$errmes){
echo "<font size='5'
color='red'>$errno</font><br/>";
echo "错误信息是:";
exit();
}
//改写set_error_handler处理器
//下面这句话的含义是 : 如果出现了 E_WARNING这个级别的错误,就去调用my_error函数.
set_error_handler("my_error",E_WARNING);//使用自定义的my_error处理方法来处理错误
//当然还可以写set_error_handler("my_error",E_NOTICE);….
$fp=fopen("aa.txt","r");
?>
异常处理:与java类似
基本语法
try{
//可能出现错误或是异常的代码
}catch(Exception e){
//对异常处理
//1. 自己处理
//2. 自己不处理,将其抛出.
}
**********************************php错误日志
保存错误日志的用处是便于,后续分析.
基本方法是使用 error_log来实现.
基本用法是:
//自定义错误函数
function my_error3($errno,$errmes){
$err_info="错误号是:".$errno."--".$errmes;
echo $err_info;
//把这个错误信息保存
//\r\n 表示向文件输入一个回车换行
//<br/> 表示向网页输出一个回车换行
error_log($err_info."\r\n",3,"d:/myerr.txt");
}
现在我们要把时间保存下来.
*******************************http协议深度剖析①-http请求详解
防盗链技术
http协议
1.
http协议是建立在 tcp/ip协议基础上.
2.
我们的web开发数据的传输都是依赖于http协议.
3.
http协议全称是 超文本传输协议
http协议的-http请求(request)
基本结构
请求行
消息头
<----空行
消息体(实体内容)
举例:
GET /test/hello.html
HTTP/1.1
【表示发送的get请求, 请求资源是/test/hello.html 】
Accept: */* 【表示客户端可以接受任何数据】
Referer:
http://localhost:80/test/abc.html
【1.表示我是从哪里来】
Accept-Language: zh-cn 【页面语言】
User-Agent: Mozilla/4.0
【告诉服务我的浏览器的内核,操作系统】
Accept-Encoding: gzip, deflate
【表示接受什么样的数据压缩格式.】
Host: localhost:80
【主机:80】
Connection:
Keep-Alive
【表示不要立即断掉我们的请求.】
现在我们想知道,客户端究竟给服务器发送的内容
如果我这个http1.php. 不希望 192.168.1.33 这个用户访问.
在服务器端,我们可以通过$_SERVER来获取我们需要的信息
重要的有:
HTTP_HOST
REMOTE_ADDR 访问该页面的ip
DOCUMENT_ROOT 可以获取 apche的主目录
REQUEST_URI 可以获取 请求的资源名
http请求有两种主要的方式
get / post
get 和post的区别有哪些
1.
安全性 get 请求的数据会显示在 地址栏上, post请求的数据,放在http协议的消息体
2.
从可以提交数据的大小看.
2.1 http协议本身并没有限制数据大小.
2.2 浏览器在对get 和post请求做显示, get 请求数据
2k+35 ,post没有显示.
3.
get请求可以更好的添加到收藏夹.
现在我们实际使用一些http请求,完成一个防盗链的练习.
☞ http请求不是固定,是根据实际情况的,比如REFEER.
********************************* http协议深度剖析②-http响应详解(302
304码运用)
Http响应(response)
简单定义: 一个Http响应代表服务器给浏览器回送的数据,同时告诉浏览器应当怎样处理数据.
1.
基本结构
状态行
消息头信息
<--空行
实体信息
快速入门
HTTP/1.1 200
OK
【200 ok 表示客户端请求成功】
Server:
Microsoft-IIS/5.0
【表示告诉浏览器 服务器的情况 】
Date: Thu, 13 Jul 2000 05:46:53 GMT 【告诉浏览器 请求的页面
的时间 】
Content-Length:
2291
【表示回送的数据有 2291个字节】
Content-Type:
text/html
【文档类型】
Cache-control:
private
【缓存】
hello
对状态码的说明
举例说明Http响应的实际应用
302状态码的使用
比如我们现在希望访问a.php 页面,让其自动重定向到b.php
基本用法使用
<?php
//header(“Location: 新的页面”);
header(“Location: http://www.sohu.com”);
exit();
?>
细节: 302 状态码也可以让其跳转到外网去
404 码
404 最常见的状态码
404一般说就是该页面不存在
304码使用
304 码主要是告诉浏览器,请求的资源不需要更新
<?php
echo
“hello”;
echo
“<img src=”Sunset.jpg”
width=”100px”>“
?>
上面说明了 304的具体用法
HTTP/1.1 304 Not Modified
Date: Tue, 13 Sep 2011 02:10:38 GMT
Server: Apache/2.2.17 (Win32) PHP/5.3.5
Connection: Keep-Alive
Keep-Alive: timeout=5, max=99
ETag: "12d00000000572c-6f69-3e1d849f35000"
******************************http响应详解(禁用缓存设置)
下面是比较详细的一个Http响应
Location: http://www.baidu.org/index.php
Server:apache
Content-Encoding:
gzip 【内容编码支持gzip压缩算法】
Content-Length:
80
【返回数据大小】
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
【表示浏览器请求资源,最新时间】
Refresh:
1;url=http://www.baidu.com 【告诉浏览器,间隔1秒,重定向到
baidu】
Content-Disposition: attachment;
filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ;
path=/search 【讲Cookie】
Expires: -1
Cache-Control:
no-cache
Pragma:
no-cache
Connection:
close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
演示如何通过Http响应,控制浏览器间隔一定时间去跳转.
<?php
//header(“Refresh: 3 ; url=http://www.sohu.com”);
header(“Refresh: 3 ; url=http://localhost/http/d.php”);
?>
演示如何通过Http响应控制页面缓存,在默认情况下,浏览器会缓存页面.
<?php
//通过header来禁用缓存(ajax )
header("Expires: -1");
header("Cache-Control: no_cache");
header("Pragma: no-cache");
echo "hello!cache";
?>
****************************************** http响应详解(文件下载)
代码如下:
<?php
//对函数的说明
//参数说明 $file_name 文件名
//
$file_sub_dir: 下载文件的子路径 '"/xxx/xxx/"
function down_file($file_name,$file_sub_dir){
//死去活来,演示下载一个图片.
//如果文件是中文.
//原因 php文件函数,比较古老,需要对中文转码 gb2312
$file_name=iconv("utf-8","gb2312",$file_name);
//绝对路径
$file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
//如果你希望绝对路径
//1.打开文件
if(!file_exists($file_path)){
echo "文件不存在!";
return ;
}
$fp=fopen($file_path,"r");
//获取下载文件的大小
$file_size=filesize($file_path);
if($file_size>30){
echo "<script
language='javascript'>window.alert('过大')</script>";
return ;
}
//返回的文件
header("Content-type: application/octet-stream");
//按照字节大小返回
header("Accept-Ranges: bytes");
//返回文件大小
header("Accept-Length: $file_size");
//这里客户端的弹出对话框,对应的文件名
header("Content-Disposition: attachment;
filename=".$file_name);
//向客户端回送数据
$buffer=1024;
//为了下载的安全,我们最好做一个文件字节读取计数器
$file_count=0;
//这句话用于判断文件是否结束
while(!feof($fp) &&
($file_size-$file_count>0) ){
$file_data=fread($fp,$buffer);
//统计读了多少个字节
$file_count+=$buffer;
//把部分数据回送给浏览器;
echo $file_data;
}
//关闭文件
fclose($fp);
}
//测试函数是否可用
down_file("顺平.jpg","/http/down/");
?>
***********************************************
php数据库编程
说php有三种方式来操作我们的mysql数据库
①
mysql扩展库
②
mysqli扩展库
③
pdo
☞ mysql扩展库(操作数据库的函数)和mysql数据库的区别
1.mysql数据库是用于存放数据.
2.mysql数据库的三层结构示意图
1.
编写php程序完成对用户表的显示
代码
<?php
//mysql扩展库操作mysql数据库步骤如下
//1. 获取连接
$conn=mysql_connect("127.0.0.1","root","root");
if(!$conn){
die("连接失败".mysql_error());
}
//2. 选择数据库
mysql_select_db("test");
//3. 设置操作编码(建议有)!!!
mysql_query(“set names utf8”); //保证我们的php程序是按照utf8码操作.应该是utf-8
//4. 发送指令sql (ddl 数据定义语句 , dml(数据操作语言
update insert ,delete) ,dql (select ), dtl 数据事务语句 rollback
commit... )
$sql="select * from user1";
//函数
//$res 表示结果集,你可以简单的理解就是 一张表.如果是dml操作则返回的res为boolean
$res=mysql_query($sql,$conn);
//var_dump($res); //mysql result 资源类型
//5. 接收返回的结果,并处理.(显示)
// mysql_fecth_row 会依次取出$res结果集的下一行数据,赋值给$row
// $row就是一个数组, 样式array(5) { [0]=> string(1) "1"
[1]=> string(2) "zs" [2]=> string(32)
"e10adc3949ba59abbe56e057f20f883e" [3]=> string(11)
"zs@sohu.com" [4]=> string(2) "30" }
//mysql_fetch_assoc mysql_fetch_array
while($row=mysql_fetch_row($res)){
//第一种取法是 同 $row[$i]
//echo "<br/>
$row[0]--$row[1]--$row[2]";
//echo "<br/>";
//var_dump($row);
//第二种取法
foreach($row as $key => $val){
echo "--$val";
}
echo "<br/>";
}
//6. 释放资源,关闭连接(必须)
mysql_free_result($res);
//这句话可以没有,建议有.
//
mysql_close($conn);
?>
细节 :
1.
使用完 $res 结果集后,一定要及时的释放资源.
2.
mysql_close() 如果没有的话,系统也会自动的关闭
3.
从$res获取行数据的时候,处理 mysql_fetch_row($res),还有三个方法.
分别是
mysql_fetch_row($res)
,返回一个索引的数组 (推荐.)
mysql_fetch_assoc($res)
,返回一个关联数组
mysql_fetch_array($res)
,返回索引数组和关联数组 (两套)
mysql_fetch_object($res) ,把一行数据,当做一个对象返回.
演示通过mysql扩展库,进行dml操作
代码:封装成一个工具类 SqlTool
<?php
class
SqlTool {
//属性
private $conn;
private $host="localhost";
private $user="root";
private $password="root";
private $db="test";
function SqlTool(){
$this->conn=mysql_connect($this->host,$this->user,$this->password);
if(!$this->conn){
die("连接数据库失败".mysql_error());
}
mysql_select_db($this->db,$this->conn);
mysql_query("set names utf8");
}
//方法..
// 完成select dql
public function execute_dql($sql){
$res=mysql_query($sql,$this->conn) or
die(mysql_error());
return
$res;
}
//完成 update,delete ,insert dml
/$sql="insert into user1 (name,password,email,age)
values('小明',md5('123'),'xiaoming@sohu.com',34)";
//$sql="delete from user1 where id=5";
// $sql="update user1 set age=100 where id=6";
public function execute_dml($sql){
$b=mysql_query($sql,$this->conn);
//echo "添加的id=".mysql_insert_id($this->conn);
if(!$b){
return 0;//失败
}else{
if(mysql_affected_rows($this->conn)>0){
return 1;//表示成功
}else{
return 2;//表示没有行数影响.
}
}
}
}
?>
PHP数据库编程⑥-使用mysqli扩展库
使用php
的mysqli扩展库去操作mysql数据库
简单介绍:
mysqli (mysql improve mysql扩展库的增强版)
mysql 扩展库 和 mysqli 扩展库的比较
1.
mysqli 的稳定性和安全性,效率有所提高
2.
mysqi 支持面向对象编程 ,同时 mysqli 扩展库考虑到php老程序员,提供面向过程的编程风格.
用appserver
php版本5.2.x
$mysqli=new
MySQLi(“localhost”,”root”,”roo3t”,”test”);
//安照变相对象的方式
if($mysqli->connect_error){
die($mysqli->connect_error);
}
// 考虑兼容低版本
if(mysqli_connect_error()){
die(“连接error”. mysqli_connect_error())
}
mysqli 编程的快速入门
编写一个程序,这个程序从user1表中读取数据,并打印在网页中。(使用mysqli完成.)
1.
先使用mysqli面向对象的风格,完成案例
1.1.
配置php.ini 文件让php支持mysqli扩展库
extension=php_mysqli.dll
1.2 建库,建表.
这里我们使用原来的user1表.
1.3 编写代码
<?php
header("Content-type:
text/html;charset=utf-8");
//mysqli操作mysql数据库(面向对象风格)
//1.创建MySQLi 对象
$mysqli=new MySQLi("localhost","root","root","test");
//验证是否ok
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}
//2. 操作数据库(发送sql)
$sql="select * from user1";
//$res 是结果集.mysqli result
$res=$mysqli->query($sql);
//var_dump($res);
//3. 处理结果 mysql_fetch_row();
while($row=$res->fetch_row()){
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>";
}
//4. 关闭资源
//释放内存
$res->free();
//关闭连接
$mysqli->close();
?>
我们再使用面向过程的方式给大家演示一下.
代码:
//1.得到mysqli连接
header("Content-type: text/html;charset=utf-8");
$mysqli=mysqli_connect("localhost","root","root","test");
if(!$mysqli){
die("连接失败".mysqli_connnect_error($mysqli));
}
//2.向数据库发送sql语句(ddl,dml dql ...)
$sql="select * from user1";
$res=mysqli_query($mysqli,$sql);
//var_dump($res);
//3.处理得到的结果
//循环取出$res中的数据mysqli_fetch_row mysql_fetch_row
while($row=mysqli_fetch_row($res)){
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>";
}
//4.关闭资源
mysqli_free_result($res);
mysqli_close($mysqli);
☞ 在mysqli 扩展中,也提供了四种方式来获取mysqli
result结果集mysqli_result::fetch_assoc
<==>
mysql_fetch_assoc
mysqli_result::fetch_row
<==>
mysql_fetch_row
mysqli_result::fetch_array
<===> mysql_fetch_array
mysqli_result::fetch_object<===>
mysql_fetch_object
这里我们推荐大家使用前两种效率较高
☞ 在mysqli释放结果集有三种方式:
void mysqli_result::free ( void )
void mysqli_result::close ( void )
void mysqli_result::free_result ( void )
☞ mysql 的sql 语句的特别说明:
如果操作的字段类型是 string型,则要求我们的 要用 ‘’ 包括。
如果操作的字段类型是 数值型,则可以用 ’80’ 包括,也可以不用
mysqli的增强-批量执行sql语句
批量执行 dml语句
基本语法
$sqls=”sql1;sql2;...”
mysqli::multi_query($sqls)
体验案例: PHP 网站
//请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义
吴用
代码:
<?php
//请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义 吴用
//1.得到mysqli对象
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
$sqls="insert into user1 (name,password,email,age)
values('宋江','aaa','aa@shu.com',45);";
$sqls.="insert into user1 (name,password,email,age)
values('卢俊义','aaa','aa@shu.com',45);";
$sqls.="insert into user1 (name,password,email,age)
values('吴用','aaa','aa@shu.com',45);";
//$sqls.="update ;";
//$sqls.="delete ;";
//dml 和 dql
$b=$mysqli->multi_query($sqls);
if(!$b){
echo "执行失败".$mysqli->error;
}else{
echo "ok";
}
//关闭资源
$mysqli->close();
?>
PHP数据库编程⑨-使用mysqli扩展库增强(批量执行sql和事务控制)
☞ 批量执行dml语句可以混合使用 delete insert
update,但是最好不要使用select
批量执行 dql语句
它的作用是可以一次性的取回多个结果集
<?php
//练习2: 请使用mysqli的mysqi::multi_query()
一次性查询并显示①users表的结构 、 ②users表中用户id ,和用户名字
//1.得打mysqli对象(究竟是什么
代表的是和mysql数据库的连接. $conn)
$mysqli=new MySQLi("localhost","root","hsp123","test");
//2.批量查询
$sqls="select * from emp;";
$sqls.="select * from user1;";
$sqls.="desc user1";
//3.处理结果
//如果成功,则至少有一个结果集
$mysqli 对象 中 $mysqli result
数组
if($res=$mysqli->multi_query($sqls)){
do{
//从mysqli连接取出第一个结果集
$result=$mysqli->store_result();
//显示mysqli result对象
while($row=$result->fetch_row()){
foreach($row as $key => $val){
echo "--$val";
}
echo "<br/>";
}
//及时释放$result;
$result->free();
if(!$mysqli->more_results()){
break;
}
echo
"<br/>******新的结果集*******<br/>";
}while($mysqli->next_result());
}
//4.关闭资源
$mysqli->close();
?>
mysql的事务处理
看一个实际情况
有一张银行账号表
create table account
(id int primary key,
balance float);
现在有一段php程序, 要完成 把 1号 10 元钱,转到 2号账号上
<?php
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account2 set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1) or
die($mysqli->error);
$b2=$mysqli->query($sql2) or
die($mysqli->error);
if(!$b1||!$b2){
echo "失败";
}else{
echo "成功";
}
$mysqli->close();
?>
这时,我们需要有一种方法来控制两句sql语句同时成功,同时失败.
->事务
事务
基本:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性
现在我们使用事务来完成上面的代码
代码:
<?php
$mysqli=new
MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
//将提交设为false[事务一旦提交就没有机会回滚
$mysqli->autocommit(false);
//-> savepoint a;会把但前情况记录
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account2 set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1) ;
$b2=$mysqli->query($sql2) ;
if(!$b1||!$b2){
echo "失败,回滚".$mysqli->error;
//回滚!
$mysqli->rollback();
}else{
//提交[一旦提交没有机会回滚
$mysqli->commit();
}
$mysqli->close();
//显示控制台
?>
☞ 在mysql控制台可以使用事务来操作,具体步骤如下
1.
开启一个事务 start transaction
2.
做保存点 savepoint 保存点名称
3.
操作....
4.
可以回滚,可以提交
4.1
如果没有问题提交commit
4.2
如果你觉得有问题,就回滚
rollback to 保存点.
事务的acid特性
原子性,一致性,持久性,隔离性.
配置:在开始程序中apache的Edit the Apache httpd.conf Configuration
File进行
配置
a:更改DocumentRoot,即我的项目的存放路径
b: 同时更改DIRECTORY 同上路径
c: DirectoryIndex(目录索引,也就是在仅指定目录的情况下,默认显示的文件名)
,可以添加很多,系统会根据从左至右的顺序来优先显示,以单个半角空格隔开,比如
有些网站的首页是index.htm,就在光标那里加上“index.htm ”文件名是任意的,不
一定非得“index.html”,比如“test.php”等,都可以。
我这里未做更改,项目存放路径为安装目录下的htdocs(相当于tomcat的webapps)
命令启动apache:
可以通过命令行开关来控制Apache服务。要启动一个已经安装的Apache服务,可以使用
:
httpd -k start
要停止一个已经安装的Apache服务,可以使用:
httpd -k stop
或
httpd -k shutdown
要重启一个运行中的Apache服务,强制它重新读取配置文件,可以使用:
httpd -k restart
*****************************
---------------------------------------
*********************************************
php语法简介:
1:判断类型
instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例(如属于person类),
通常在面向对象开发中可能用的。$xiaoming=new person;$xiaoming.instanceof
person
2:表示两内容的拼接
$c=$b.$a; //$a 具体表示内容和 $b 表示内容拼接
echo "计算结果是=".$res;
3:定义常量(变量名前不需加$)
a:使用define
define("TAX_RATE",0.08);
b:const TAX_RATE2=0.1;
//注意只有const变量前不需要加$
4:引入另一个php页面,并使用其中函数
//1.
//require 'b.php';
//2. 通过变量引入
//$fileName="b.php";
//require $fileName;
//3.
require ('b.php');
abc();//调用b.php中的函数
require 和require_once 区别
这两个区别为,前者遇到即包含文件,后者会判断是否已经包含过了,如果包含过了,
则不再包含文件。一可以节省资源,二可以避免重复定义的错误。
redeclare: 再次声明.
include: 包含,包括
再谈 include 和 require 区别 ( 同时 include_once 和
require_once 区别)
相同的地方就是,都是可以引入别的页面.
不同的地方是: include 如果出现了错误,会继续执行,require 出现错误,则会终止
程序.
证明:
小结: 我们应当使用哪个?
我们做项目的时候,基本上使用的 require_once
注意我们的requir_once / require ... 应当放在 php 最前面.
5: php的变量的类型都不申明的,这跟java有很大的区别,在以后写代码的时候记住
php 的变量的数据类型,是变化的,php变量的数据类型是由运行时的上下文决定
如:private $age;//在赋值的时候确定
java--private int age;
但是属性 必须指定访问修饰符!!
6://定义全局变量---注意啦。声明和赋值写成一句话居然会报错!
global
$global_nums;//声明,这个语句是放在<?php
..位置的,而不是放在像java放在class 括号内的!
$global_nums=0;//赋值
在函数内使用的时候需要再次申明一下,不然报错
global $global_nums;
7:php的一些常量,可以去查手册
__LINE__ | 文件中的当前行号。 |
__FILE__ | 文件的完整路径和文件名。 |
<form action="homework01.php"
method="post">
<input type="text"
name="layer"/>
<select name="shape">
//在php页面接收
$n=$_REQUEST['layer'];
$shape=$_REQUEST['shape'];
***********类的成员和函数调用
$cat1=new Cat();//前面不需要加Cat
$cat1->name="小白";//$对象名->属性名;必须是public或者protected(看情况)才能访
问
$cat1->speak();//调用函数,不是使用.了
****************函数传参时是传的地址还是值
传的是值,如果要传地址需加&
***************构造方法
在php 5 中一个类可以同时有 两种形式的构造方法--php方法前都要加function关键字!
__construct() 和 类名() , 当两个同时存在的时候,优先调用__construct(),
请大家以后使用__construct()
public function __construct($iname,$iage){
//$name=$iname;
//$age=$iage;
$this->name=$iname;
$this->age=$iage;
echo
“我是构造方法”;
}
注意:
1. $this
本质可以理解就是这个对象的地址
2. 哪个对象使用到$this,
就是哪个对象地址
3. $this不能在类外部使用.
构造方法的注意事项
(1)一旦自定义了一个构造函数,默认的
构造函数就被覆盖了,这时在创建对象的时候就要使用自定义的构造函数.
(2)一个类只能有一个构造函数.(不能重载),子类不会默认调用父类的构造函数,这与java不同!
构造方法的8点说明:
①构造方法名和类名相同(php4版),php5版的构造方法
名可以和类名相同,也可以是__construct()
②构造方法没有返回值
③主要作用是完成对新对象的初始化,并不是创建对象本身。
④在创建新对象后,系统自动的调用该类的构造方法
⑤一个类有且只有一个构造方法,在php5后虽然__construct() 和 类名()
可以共存,但是实际上也只能使用一个。
⑥如果没有给类自定义构造方法,则该类使用系统默认的构造方法。
class Cat{
//注意__是两个下划线
funciton __construt($name){
echo “ok”;
}
}
$cat1=new Cat();
⑦如果给类自定义了构造方法,则该类的默认构造方法被覆盖。
⑧构造方法的默认访问修饰符是public
**************************** 析构方法 (java没有,自动的垃圾回收机制)
这里我要谈到面向对象和面向过程的问题!
在csdn上发现一个问题:
--1--
有个VC写的DLL有3个方法,
Open();
耗时5秒
DoSomething(); 耗时0.1秒
Close();
耗时0.1秒
--1--
我现在已经写了一个javaBean,对应3个方法,并且调试成功。
jOpen();
jDoSomething();
jClose();
但是由于DoSomething是被多次频繁调用的方法,所以不能每次都去Open,Close.
所以我希望在构造的时候Open一次,直到用完了再Close。
这样是不是要写一个“静态类”一样的东西保证构造时Open一次,一直使用,到析构的
时候再做一次Close就够了。
1.这个静态类怎么写呢?
2.java没有析构函数,Close的时机也不好确定。
解答:在1中这是典型的面向过程的思路,所以在java中的面向对象的过程必须是建立一个对象,然后再对象中进行此三个方法的定义,然后再调用(怎么调用看自己的控制)不过这个实例的close方法是怎么代表其消亡的呢?如果不想每次去调用open的话那么可以使用单例的模式!java的finalize()方法,在jvm中我将研究finalize
php中的析构函数:注意一个类最多只有一个,且无返回值
function __destruct(){
echo $this->name."销毁资源
关闭数据库..<br/>";
}
1.
析构方法会自动调用
2.
析构方法主要用于销毁资源
3.
析构方法调用顺序是,先创建的对象后被销毁
4.
析构方法什么时候被调用
(1)
当程序(进程结束)退出时
(2)
当一个对象称为垃圾对象的时候,该对象的析构方法也会被调用,
(3)
所谓垃圾对象,就是指,没有任何变量再引用它.
(4)
一旦一个对象成为垃圾对象,析构方法就会立即调用
**************************get/set方法
这个知识点在java中我都有点不记得了,在类中的成员属性修饰符一般是使用private
修饰的(即只限在本类中使用)如果不使用get/set方法在新建一个类的时候
Person p=new Person();//p是无法设置age等属性的,很自然的我们使用p.setAge(1)
private $age;//不写类型的啊
//查看年龄
public function getAge(){
return $this->age;
}
php还有一种特别的,就是不要对每个属性写get/set方法,直接一起解决,但不建议使用。通过 一对
__set 和 __get方法来操作我们的变量
//使用__set
方法来管理所有的属性,pro_name,pro_val为固定标志
public function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
//使用__get 可以获取所有的属性值
public function __get($pro_name){
if(isset($pro_name)){
return $this->pro_name;
}else{
return
null;
}
}
**********类中的属性和方法在各个方法中的引用必须加$this->
function test11(){
$this->name="hljmr";
$this->test12();
}
*****************继承。和java一样不支持多继承
class 类名 extends 父类名{
//在写自己需要的属性和方法.
}
1.
父类的 public 、protected
的属性和方法被继承. private 的属性和方法没有被继承.
2.
一个类只能继承一个父类,(直接继承).如果你希望继承多个类的属性和方法,则使用多层继承
3.
当创建子类对象的时候,默认情况下,不会自动调用父类的构造方法.
4.
如果我们希望去调用父类的 构造方法,或者其它的方法(public
/ protected) ,可以这样处理
(了解)
4.1
类名::方法名() 4.2
parent::方法名()
*******************静态static
使用静态变量
静态的变量的基本用法
1.
在类中定义静态变量
[访问修饰符] static $变量名;
2.
如何访问静态变量
如果在类中访问 有两种方法 self::$静态变量名 ,
类名::$静态变量名
如果在类外访问: 有一种方法 类名::$静态变量名
*****************重载
基本概念:
函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名,但是可以区分不同的函数。。。为什么在这里要写上定义呢,因为在php中根据这个定义很容易出错!
class A{
public function test1(){
echo “test1”;
}
public function test1($a){
echo “test1 hello”;
}
}
重载
$a =new A();
$a->test1();
$a->test1(456);
上面的这用用法是不对.
PHP5
中如何通过魔术函数来实现方法重载的效果,我觉得一点都不好用,官方就不推荐,看看php6怎么解决的!
代码说明
<?php
class A{
public function test1($p){
echo "接收一个参数";
echo "<br/>接收到参数是";
var_dump($p);
}
public function test2($p){
echo "接收两个参数<br/>";
var_dump($p);
}
//这些提供一个__call 魔术函数
//__call 是它一个对象调用某个方法,而该方法不存在,则
//系统会自动调用__call
function __call($method,$p){
var_dump($p);
if($method=="test"){//根据参数个数区分,当然也可以根据参数的类型来写
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}
}
}
$a=new A();
$a->test(1);
$a->test(56,90);
?>
小结: 关于重载
①
php5 默认情况下不直接支持方法重载
②
php5
可以同__call魔术方法,模拟一个方法效果的效果.
***********************重写,在父类中不知道怎么写某个模块的时候可以再子类中进行重写,如动物的叫声!
关于方法重写细节讨论
1.
要实现重写,要求 子类的那个方法的名字和参数列表个数一摸一样,但是并不要求参数的名称一样.
2.
如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法名(参数..) ,
父类名::方法名(参数...)
3. 注意
在实现方法覆盖的时候,访问修饰符可以不一样
//但是必须满足: 子类的访问范围>=父类的访问范围
注意这里面出现了多态,如当你没有在子类中重写这个方法的时候,那么子类调用的还是父类的方法!
*******************************抽象类
1.
在实际开发中,我们可能有这样一种类,是其它类的父类,但是它本身并不需要实例化,主要用途是用于让子类来继承,这样可以到达代码复用.
同时利于项目设计者,设计类.
快速入门
当然,1。 在实现方法覆盖的时候,访问修饰符可以不一样。2.但是必须满足:
子类的访问范围>=父类的访问范围3.含抽象方法的,必须是抽象类,抽象类但并不需要全是抽象方法abstract
class Animal{ abstract public function cry();4.
如果A类继承了一个抽象类 B,则要求A类实现从B类继承的所有抽象方法
*******************************接口
class 类名 implements 接口名1,接口2.
一个类可以去实现多个接口(解决单一继承的缺陷),注意:接口的方法是public 【默认就是public 】
interface iUsb{
//属性
//方法
}
//1.当一个类实现了 某个接口,则要求该类必须实现这个接口的所有方法
//接口的方法都不能有方法体, 接口它的作用就是 声明一些方法,供其它类来实现.
接口还体现编程中我们希望的效果 高内聚低耦合 的
什么情况下可以考虑使用接口----项目经理常做的工作
1.
定规范
2.
定下规范,让别的程序员来实现
3. 当多个类 ,他们之间是平级的关系. 这些类都会去实现某个功能,只是实现的方式不一样
*******************************
final关键字和const关键字
用法Final:不希望类被继承,不希望方法被修改,注意final关键字不能去修饰属性.java可以
用法const:当你有一个属性,不希望被修改,则考虑使用const 做成常量。
定义const 常量名=赋初值;
//不要加修饰符,必须给定初值,不需要$了!!常量在类的内部使用 self::常量的名称 类名::常量的名称(类外部也使用此)
使用 类名::常量名; 接口名::常量
比较一下java 的final 修饰符
可以修饰类,方法,属性
Java 的final修饰的时候注意两种,一种是修饰基本数据类型如final int
i=100;必须赋值,且i=100永远不变,另一种是修饰对象引用,比如说final Husbrand
hl;那么一个女生在引用这个老公对象后就永远不可以换老公,但是老公本身是可以改变的(职业,工资等属性)!!
******************************错误和异常处理介绍 处理错误方式①-die
php处理错误的三种方法
1.
使用简单的die 语句
使用方法如下 :(1)
if(!file_exists("aaa.txt")){
die("文件不存在");
}else{
//打开文件操作
}
echo "ok";
(2) 更简单的方法
file_exists("aaa.txt") or die("文件不存在!!!");
用户自定义错误处理器
在php中对错误有不同的级别区分:
案例入门 :
<?php
//定义了一个函数(我用于处理错误的函数)
function my_error($errno,$errmes){
echo "<font size='5'
color='red'>$errno</font><br/>";
echo "错误信息是:";
exit();
}
//改写set_error_handler处理器
//下面这句话的含义是 : 如果出现了 E_WARNING这个级别的错误,就去调用my_error函数.
set_error_handler("my_error",E_WARNING);//使用自定义的my_error处理方法来处理错误
//当然还可以写set_error_handler("my_error",E_NOTICE);….
$fp=fopen("aa.txt","r");
?>
异常处理:与java类似
基本语法
try{
//可能出现错误或是异常的代码
}catch(Exception e){
//对异常处理
//1. 自己处理
//2. 自己不处理,将其抛出.
}
**********************************php错误日志
保存错误日志的用处是便于,后续分析.
基本方法是使用 error_log来实现.
基本用法是:
//自定义错误函数
function my_error3($errno,$errmes){
$err_info="错误号是:".$errno."--".$errmes;
echo $err_info;
//把这个错误信息保存
//\r\n 表示向文件输入一个回车换行
//<br/> 表示向网页输出一个回车换行
error_log($err_info."\r\n",3,"d:/myerr.txt");
}
现在我们要把时间保存下来.
*******************************http协议深度剖析①-http请求详解
防盗链技术
http协议
1.
http协议是建立在 tcp/ip协议基础上.
2.
我们的web开发数据的传输都是依赖于http协议.
3.
http协议全称是 超文本传输协议
http协议的-http请求(request)
基本结构
请求行
消息头
<----空行
消息体(实体内容)
举例:
GET /test/hello.html
HTTP/1.1
【表示发送的get请求, 请求资源是/test/hello.html 】
Accept: */* 【表示客户端可以接受任何数据】
Referer:
http://localhost:80/test/abc.html
【1.表示我是从哪里来】
Accept-Language: zh-cn 【页面语言】
User-Agent: Mozilla/4.0
【告诉服务我的浏览器的内核,操作系统】
Accept-Encoding: gzip, deflate
【表示接受什么样的数据压缩格式.】
Host: localhost:80
【主机:80】
Connection:
Keep-Alive
【表示不要立即断掉我们的请求.】
现在我们想知道,客户端究竟给服务器发送的内容
如果我这个http1.php. 不希望 192.168.1.33 这个用户访问.
在服务器端,我们可以通过$_SERVER来获取我们需要的信息
重要的有:
HTTP_HOST
REMOTE_ADDR 访问该页面的ip
DOCUMENT_ROOT 可以获取 apche的主目录
REQUEST_URI 可以获取 请求的资源名
http请求有两种主要的方式
get / post
get 和post的区别有哪些
1.
安全性 get 请求的数据会显示在 地址栏上, post请求的数据,放在http协议的消息体
2.
从可以提交数据的大小看.
2.1 http协议本身并没有限制数据大小.
2.2 浏览器在对get 和post请求做显示, get 请求数据
2k+35 ,post没有显示.
3.
get请求可以更好的添加到收藏夹.
现在我们实际使用一些http请求,完成一个防盗链的练习.
☞ http请求不是固定,是根据实际情况的,比如REFEER.
********************************* http协议深度剖析②-http响应详解(302
304码运用)
Http响应(response)
简单定义: 一个Http响应代表服务器给浏览器回送的数据,同时告诉浏览器应当怎样处理数据.
1.
基本结构
状态行
消息头信息
<--空行
实体信息
快速入门
HTTP/1.1 200
OK
【200 ok 表示客户端请求成功】
Server:
Microsoft-IIS/5.0
【表示告诉浏览器 服务器的情况 】
Date: Thu, 13 Jul 2000 05:46:53 GMT 【告诉浏览器 请求的页面
的时间 】
Content-Length:
2291
【表示回送的数据有 2291个字节】
Content-Type:
text/html
【文档类型】
Cache-control:
private
【缓存】
hello
对状态码的说明
举例说明Http响应的实际应用
302状态码的使用
比如我们现在希望访问a.php 页面,让其自动重定向到b.php
基本用法使用
<?php
//header(“Location: 新的页面”);
header(“Location: http://www.sohu.com”);
exit();
?>
细节: 302 状态码也可以让其跳转到外网去
404 码
404 最常见的状态码
404一般说就是该页面不存在
304码使用
304 码主要是告诉浏览器,请求的资源不需要更新
<?php
echo
“hello”;
echo
“<img src=”Sunset.jpg”
width=”100px”>“
?>
上面说明了 304的具体用法
HTTP/1.1 304 Not Modified
Date: Tue, 13 Sep 2011 02:10:38 GMT
Server: Apache/2.2.17 (Win32) PHP/5.3.5
Connection: Keep-Alive
Keep-Alive: timeout=5, max=99
ETag: "12d00000000572c-6f69-3e1d849f35000"
******************************http响应详解(禁用缓存设置)
下面是比较详细的一个Http响应
Location: http://www.baidu.org/index.php
Server:apache
Content-Encoding:
gzip 【内容编码支持gzip压缩算法】
Content-Length:
80
【返回数据大小】
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
【表示浏览器请求资源,最新时间】
Refresh:
1;url=http://www.baidu.com 【告诉浏览器,间隔1秒,重定向到
baidu】
Content-Disposition: attachment;
filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ;
path=/search 【讲Cookie】
Expires: -1
Cache-Control:
no-cache
Pragma:
no-cache
Connection:
close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
演示如何通过Http响应,控制浏览器间隔一定时间去跳转.
<?php
//header(“Refresh: 3 ; url=http://www.sohu.com”);
header(“Refresh: 3 ; url=http://localhost/http/d.php”);
?>
演示如何通过Http响应控制页面缓存,在默认情况下,浏览器会缓存页面.
<?php
//通过header来禁用缓存(ajax )
header("Expires: -1");
header("Cache-Control: no_cache");
header("Pragma: no-cache");
echo "hello!cache";
?>
****************************************** http响应详解(文件下载)
代码如下:
<?php
//对函数的说明
//参数说明 $file_name 文件名
//
$file_sub_dir: 下载文件的子路径 '"/xxx/xxx/"
function down_file($file_name,$file_sub_dir){
//死去活来,演示下载一个图片.
//如果文件是中文.
//原因 php文件函数,比较古老,需要对中文转码 gb2312
$file_name=iconv("utf-8","gb2312",$file_name);
//绝对路径
$file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
//如果你希望绝对路径
//1.打开文件
if(!file_exists($file_path)){
echo "文件不存在!";
return ;
}
$fp=fopen($file_path,"r");
//获取下载文件的大小
$file_size=filesize($file_path);
if($file_size>30){
echo "<script
language='javascript'>window.alert('过大')</script>";
return ;
}
//返回的文件
header("Content-type: application/octet-stream");
//按照字节大小返回
header("Accept-Ranges: bytes");
//返回文件大小
header("Accept-Length: $file_size");
//这里客户端的弹出对话框,对应的文件名
header("Content-Disposition: attachment;
filename=".$file_name);
//向客户端回送数据
$buffer=1024;
//为了下载的安全,我们最好做一个文件字节读取计数器
$file_count=0;
//这句话用于判断文件是否结束
while(!feof($fp) &&
($file_size-$file_count>0) ){
$file_data=fread($fp,$buffer);
//统计读了多少个字节
$file_count+=$buffer;
//把部分数据回送给浏览器;
echo $file_data;
}
//关闭文件
fclose($fp);
}
//测试函数是否可用
down_file("顺平.jpg","/http/down/");
?>
***********************************************
PHP数据库编程①-使用mysql扩展库
php数据库编程说php有三种方式来操作我们的mysql数据库
①
mysql扩展库
②
mysqli扩展库
③
pdo
☞ mysql扩展库(操作数据库的函数)和mysql数据库的区别
1.mysql数据库是用于存放数据.
2.mysql数据库的三层结构示意图
1.
编写php程序完成对用户表的显示
代码
<?php
//mysql扩展库操作mysql数据库步骤如下
//1. 获取连接
$conn=mysql_connect("127.0.0.1","root","root");
if(!$conn){
die("连接失败".mysql_error());
}
//2. 选择数据库
mysql_select_db("test");
//3. 设置操作编码(建议有)!!!
mysql_query(“set names utf8”); //保证我们的php程序是按照utf8码操作.应该是utf-8
//4. 发送指令sql (ddl 数据定义语句 , dml(数据操作语言
update insert ,delete) ,dql (select ), dtl 数据事务语句 rollback
commit... )
$sql="select * from user1";
//函数
//$res 表示结果集,你可以简单的理解就是 一张表.如果是dml操作则返回的res为boolean
$res=mysql_query($sql,$conn);
//var_dump($res); //mysql result 资源类型
//5. 接收返回的结果,并处理.(显示)
// mysql_fecth_row 会依次取出$res结果集的下一行数据,赋值给$row
// $row就是一个数组, 样式array(5) { [0]=> string(1) "1"
[1]=> string(2) "zs" [2]=> string(32)
"e10adc3949ba59abbe56e057f20f883e" [3]=> string(11)
"zs@sohu.com" [4]=> string(2) "30" }
//mysql_fetch_assoc mysql_fetch_array
while($row=mysql_fetch_row($res)){
//第一种取法是 同 $row[$i]
//echo "<br/>
$row[0]--$row[1]--$row[2]";
//echo "<br/>";
//var_dump($row);
//第二种取法
foreach($row as $key => $val){
echo "--$val";
}
echo "<br/>";
}
//6. 释放资源,关闭连接(必须)
mysql_free_result($res);
//这句话可以没有,建议有.
//
mysql_close($conn);
?>
细节 :
1.
使用完 $res 结果集后,一定要及时的释放资源.
2.
mysql_close() 如果没有的话,系统也会自动的关闭
3.
从$res获取行数据的时候,处理 mysql_fetch_row($res),还有三个方法.
分别是
mysql_fetch_row($res)
,返回一个索引的数组 (推荐.)
mysql_fetch_assoc($res)
,返回一个关联数组
mysql_fetch_array($res)
,返回索引数组和关联数组 (两套)
mysql_fetch_object($res) ,把一行数据,当做一个对象返回.
演示通过mysql扩展库,进行dml操作
代码:封装成一个工具类 SqlTool
<?php
class
SqlTool {
//属性
private $conn;
private $host="localhost";
private $user="root";
private $password="root";
private $db="test";
function SqlTool(){
$this->conn=mysql_connect($this->host,$this->user,$this->password);
if(!$this->conn){
die("连接数据库失败".mysql_error());
}
mysql_select_db($this->db,$this->conn);
mysql_query("set names utf8");
}
//方法..
// 完成select dql
public function execute_dql($sql){
$res=mysql_query($sql,$this->conn) or
die(mysql_error());
return
$res;
}
//完成 update,delete ,insert dml
/$sql="insert into user1 (name,password,email,age)
values('小明',md5('123'),'xiaoming@sohu.com',34)";
//$sql="delete from user1 where id=5";
// $sql="update user1 set age=100 where id=6";
public function execute_dml($sql){
$b=mysql_query($sql,$this->conn);
//echo "添加的id=".mysql_insert_id($this->conn);
if(!$b){
return 0;//失败
}else{
if(mysql_affected_rows($this->conn)>0){
return 1;//表示成功
}else{
return 2;//表示没有行数影响.
}
}
}
}
?>
PHP数据库编程⑥-使用mysqli扩展库
使用php
的mysqli扩展库去操作mysql数据库
简单介绍:
mysqli (mysql improve mysql扩展库的增强版)
mysql 扩展库 和 mysqli 扩展库的比较
1.
mysqli 的稳定性和安全性,效率有所提高
2.
mysqi 支持面向对象编程 ,同时 mysqli 扩展库考虑到php老程序员,提供面向过程的编程风格.
用appserver
php版本5.2.x
$mysqli=new
MySQLi(“localhost”,”root”,”roo3t”,”test”);
//安照变相对象的方式
if($mysqli->connect_error){
die($mysqli->connect_error);
}
// 考虑兼容低版本
if(mysqli_connect_error()){
die(“连接error”. mysqli_connect_error())
}
mysqli 编程的快速入门
编写一个程序,这个程序从user1表中读取数据,并打印在网页中。(使用mysqli完成.)
1.
先使用mysqli面向对象的风格,完成案例
1.1.
配置php.ini 文件让php支持mysqli扩展库
extension=php_mysqli.dll
1.2 建库,建表.
这里我们使用原来的user1表.
1.3 编写代码
<?php
header("Content-type:
text/html;charset=utf-8");
//mysqli操作mysql数据库(面向对象风格)
//1.创建MySQLi 对象
$mysqli=new MySQLi("localhost","root","root","test");
//验证是否ok
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}
//2. 操作数据库(发送sql)
$sql="select * from user1";
//$res 是结果集.mysqli result
$res=$mysqli->query($sql);
//var_dump($res);
//3. 处理结果 mysql_fetch_row();
while($row=$res->fetch_row()){
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>";
}
//4. 关闭资源
//释放内存
$res->free();
//关闭连接
$mysqli->close();
?>
我们再使用面向过程的方式给大家演示一下.
代码:
//1.得到mysqli连接
header("Content-type: text/html;charset=utf-8");
$mysqli=mysqli_connect("localhost","root","root","test");
if(!$mysqli){
die("连接失败".mysqli_connnect_error($mysqli));
}
//2.向数据库发送sql语句(ddl,dml dql ...)
$sql="select * from user1";
$res=mysqli_query($mysqli,$sql);
//var_dump($res);
//3.处理得到的结果
//循环取出$res中的数据mysqli_fetch_row mysql_fetch_row
while($row=mysqli_fetch_row($res)){
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>";
}
//4.关闭资源
mysqli_free_result($res);
mysqli_close($mysqli);
☞ 在mysqli 扩展中,也提供了四种方式来获取mysqli
result结果集mysqli_result::fetch_assoc
<==>
mysql_fetch_assoc
mysqli_result::fetch_row
<==>
mysql_fetch_row
mysqli_result::fetch_array
<===> mysql_fetch_array
mysqli_result::fetch_object<===>
mysql_fetch_object
这里我们推荐大家使用前两种效率较高
☞ 在mysqli释放结果集有三种方式:
void mysqli_result::free ( void )
void mysqli_result::close ( void )
void mysqli_result::free_result ( void )
☞ mysql 的sql 语句的特别说明:
如果操作的字段类型是 string型,则要求我们的 要用 ‘’ 包括。
如果操作的字段类型是 数值型,则可以用 ’80’ 包括,也可以不用
mysqli的增强-批量执行sql语句
批量执行 dml语句
基本语法
$sqls=”sql1;sql2;...”
mysqli::multi_query($sqls)
体验案例: PHP 网站
//请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义
吴用
代码:
<?php
//请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义 吴用
//1.得到mysqli对象
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
$sqls="insert into user1 (name,password,email,age)
values('宋江','aaa','aa@shu.com',45);";
$sqls.="insert into user1 (name,password,email,age)
values('卢俊义','aaa','aa@shu.com',45);";
$sqls.="insert into user1 (name,password,email,age)
values('吴用','aaa','aa@shu.com',45);";
//$sqls.="update ;";
//$sqls.="delete ;";
//dml 和 dql
$b=$mysqli->multi_query($sqls);
if(!$b){
echo "执行失败".$mysqli->error;
}else{
echo "ok";
}
//关闭资源
$mysqli->close();
?>
PHP数据库编程⑨-使用mysqli扩展库增强(批量执行sql和事务控制)
☞ 批量执行dml语句可以混合使用 delete insert
update,但是最好不要使用select
批量执行 dql语句
它的作用是可以一次性的取回多个结果集
<?php
//练习2: 请使用mysqli的mysqi::multi_query()
一次性查询并显示①users表的结构 、 ②users表中用户id ,和用户名字
//1.得打mysqli对象(究竟是什么
代表的是和mysql数据库的连接. $conn)
$mysqli=new MySQLi("localhost","root","hsp123","test");
//2.批量查询
$sqls="select * from emp;";
$sqls.="select * from user1;";
$sqls.="desc user1";
//3.处理结果
//如果成功,则至少有一个结果集
$mysqli 对象 中 $mysqli result
数组
if($res=$mysqli->multi_query($sqls)){
do{
//从mysqli连接取出第一个结果集
$result=$mysqli->store_result();
//显示mysqli result对象
while($row=$result->fetch_row()){
foreach($row as $key => $val){
echo "--$val";
}
echo "<br/>";
}
//及时释放$result;
$result->free();
if(!$mysqli->more_results()){
break;
}
echo
"<br/>******新的结果集*******<br/>";
}while($mysqli->next_result());
}
//4.关闭资源
$mysqli->close();
?>
mysql的事务处理
看一个实际情况
有一张银行账号表
create table account
(id int primary key,
balance float);
现在有一段php程序, 要完成 把 1号 10 元钱,转到 2号账号上
<?php
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account2 set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1) or
die($mysqli->error);
$b2=$mysqli->query($sql2) or
die($mysqli->error);
if(!$b1||!$b2){
echo "失败";
}else{
echo "成功";
}
$mysqli->close();
?>
这时,我们需要有一种方法来控制两句sql语句同时成功,同时失败.
->事务
事务
基本:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性
现在我们使用事务来完成上面的代码
代码:
<?php
$mysqli=new
MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
//将提交设为false[事务一旦提交就没有机会回滚
$mysqli->autocommit(false);
//-> savepoint a;会把但前情况记录
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account2 set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1) ;
$b2=$mysqli->query($sql2) ;
if(!$b1||!$b2){
echo "失败,回滚".$mysqli->error;
//回滚!
$mysqli->rollback();
}else{
//提交[一旦提交没有机会回滚
$mysqli->commit();
}
$mysqli->close();
//显示控制台
?>
☞ 在mysql控制台可以使用事务来操作,具体步骤如下
1.
开启一个事务 start transaction
2.
做保存点 savepoint 保存点名称
3.
操作....
4.
可以回滚,可以提交
4.1
如果没有问题提交commit
4.2
如果你觉得有问题,就回滚
rollback to 保存点.
事务的acid特性
原子性,一致性,持久性,隔离性.
相关文章推荐
- java知识点概括
- JAVA知识点概括总结
- java集合知识点概括
- Java 知识点概括
- Java知识点概括
- 高级Java程序员 面试必备知识点概括
- Java知识点总结与概括
- [置顶] php超级预定数组( 类似javaWeb中域对象),函数,对象,进一步加深知识点
- php调用java写的webservices提示Uncaught SoapFault exception: [HTTP] Not Found
- PHP openssl_encrypt 加密 代替 mcrypt_encrypt 加密方式 兼容 java 3DESede加密
- php中调用java类的方法
- 测试开发系类之Java常用知识点
- java需要掌握的小碎知识点(8)
- 连接PHP和 Java -- PHP/Java Bridge [3]
- 连接PHP和 Java -- PHP/Java Bridge [3]
- Java 与 PHP 发送get请求并获取远程内容
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- 【Java解析XML】【一】XML解析技术概括
- php&java(二)
- 课1(JAVA知识点)