java到php之:php知识点概括

本文详细介绍PHP的配置方法、常用语法及编程技巧,包括变量类型、类的定义与使用、异常处理等内容,帮助读者掌握PHP核心知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的一些常量,可以去查手册

__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特性

原子性,一致性,持久性,隔离性.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangleijay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值