第二十五回、PHP基础教程,PHP常用设置

1、memory_limit

当执行一条select * from tableName的SQL查询时,如果数据量比较大,会出现“Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in ”的错误,大概意思是可用内存已耗尽。这个问题是由于SQL的结果数据量超出了PHP默认的最大数据量,此时可通过以下方法来解决。

找到php.ini文件,修改

memory_limit = 128  //这里的单位是MB

此方法适合拥有主机配置权限的用户,如果是虚拟主机用户,可以借助PHP的ini_set()来实现,在要执行大数据量的SQL语句前先执行一下ini_set()命令,如下:

ini_set(” memory_limit “, ” 128M “);

2、ini_set(“display_errors”,”off”);

//关闭错误显示

3、ini_set(“session.save_path”,”d:/session”);

//修改session文件在服务器上的保存位置,也可以使用session_save_path(“d:/session”)

4、session_set_cookie_params(1800);

//设置session过期时间为1800秒

5、defined(“td_cms”) or exit(“Access Denied”);

//放在被引用程序文件的开头部分,可防止PHP文件被盗用。要先在引用主文件定义td_cms这个常量,当然常量名字可以是任意合法、可用的名称。

6、date_default_timezone_set(‘PRC’);

//设置PHP的运行时区为北京时区,把PRC改为Etc/GMT-8也是北京时间

date_default_timezone_set(“Etc/GMT”);

//设置PHP的运行时区为格林威治标准时间

第二十四回、PHP基础教程,载入与验证XML

在PHP程序载入XML文件是使用DOMDocument对象的方法。首先建立DOMDocument对象,如下所示:

$dom = new DOMDocument();

//下文出现的$dom都表示一个DOMDcument树状结构对象。

在设定剖析器的相关参数后,就可以载入XML文件,如下所示:

$dom->preserveWhiteSpace = false;

if ( $dom->load(“book.xml”) )

{

  如果载入成功则需要执行的代码写在这里;

}

9.1.3 DOMDocuement对象属性

DOMDocuement对象提供相关属性设定剖析器参数,如下表所示:

preserveWhiteSpace,设定是否保留元素内容是空白的字元的节点,默认值是true,表示删除。false为删除。

resolveExternals,设定是否截住外部实体节点,默认值是true,表示载入。false为不载入。

validateOnParse,载入XML就使用DTD进行验证,默认值是false,表示不验证。true表示验证。

如果将validateOnparse的属性值设置为true,则表示要对载入的XML文件进行验证,XML文件格式验证分为DTD和XML Schema两种验证方式。示例如下:

在PHP程序中验证XML文件是引用validate()和schemaValidate()方法,如下所示:

$dom->validate();

$dom->schemaValidate(“book.xsd”);

上述validate()方法是DTD验证,schemaValidate()方法是XML Schema验证,参数是XML Schema文件路径和名称,验证成功传回true,错误传回false。

9.1.4 DOMDocument文件对象

XML文件树状结构是DOMDocument对象,当DOM载入XML文件建立$dom对象后,就可以使用属性取得XML文件的根节点,如下所示:

$root = $dom->documentElement;

documentElement属性是XML文件的根节点。DOMDocument对象提供方法可以直接使用标签名称取得指定节点和其子节点,如下所示:

$nodes=$dom->getElementsByTagName(“book”);

上述指令取得所有<book>标签的子节点,取出的节点集合是DOMNodeList对象。

9.1.5 DOMNode节点对象

DOMDocument对象是由DOMNode节点对象所组成,在DOMNode对象中提供相关属性和方法可以取得XML元素的名称和内容,如下所示:

$root = $dom->documentElement;

echo “<b>根元素:</b>” . $root->nodeName . “<br>”;

nodeName属性可以取得节点名称。DOMNode对象提供childNodes属性取得这些子节点的DOMNodeList对象,如下所示:

$nodes=$root->childNodes;

9.1.6 DOMNode节点对象属性

DOMNode节点对象的相关属性说明,如下表所示:

childNodes,取得子节点的DOMNodeList节点清单对象,也就是子节点树。

attributes,如果是DOMElement节点对象,可以取得所有属性的DOMNamedNodeMap对象。

nodeName,节点名称,依不同节点的种类而不同。

nodeType,节点种类的代码。

nodeValue,节点的值。

textContent,取得子节点的内容,也就是XML元素的内容和其子节点。

例如:取得根节点的节点名称和值,如下所示:

echo $root->nodeName;

echo iconv(“utf-8″,”big5”,$root->nodeValue);

程序码取得根节点的名称和值,属性值需要使用iconv()函数,将utf-8的编码转换成big5编码。

因为DOMNode节点对象还能拥有其他子节点,所以DOMNode节点对象提供hasChildNodes()方法检查节点是否拥有子节点,如下所示:

if ( $node->hasChildNodes() )
{ ……….. }

nodeType节点属性值是前述的XML常数,不同节点种类影响相关的属性值,常见的节点种类如下表所示:

第二十四回、PHP基础教程,载入与验证XML

应用示例:

<?php

$dom = new DomDocument();

//创建 DOM对象

if(!$dom->load(“example.xml”) )//读取 XML文件

{

echo”XML文件读取失败”;

exit();

}

$root = $dom->documentElement;

//获取 XML数据的根

read_child($root);

//调用 read_child函数读取根对象

function read_child($node)

{

$children = $node->childNodes;

//获得$node的所有子节点

foreach($children as $e) //循环读取每一个子节点

{

if($e->nodeType == XML_TEXT_NODE)//如果子节点为文本型则输出

{

echo $e->nodeValue. “<BR>”;

//获取的是一对标记符中的文本内容,如<a>hello</a>中的hello

}

else if($e->nodeType == XML_ELEMENT_NODE)//如果子节点为节点对象,则调用函数处理

{

read_child($e);

}

}

}

?>

9.1.7 DOMElement元素对象

DOMElement对象代表树状结构的XML元素节点,这也是一种DOMNode对象,如果元素拥有内容,文字内容是DOMText节点,DOMElement对象的属性tagName可以取得标签名称,如下所示:

$eles = $dom->getElementsByTagName(“book”);

foreach ( $eles as $ele )

{

echo $ele->tagName .”<br>”;

}

程序码在取得book所有DOMElement元素对象后,使用foreach循环和tagName属性取得标签名称。

9.1.8 DOMElement元素属性

如果DOMElement元素拥有属性,我们可以呼叫hasAttributes()方法检查是否有属性,getAttribute()方法取得XML元素的属性值,如下所示:

if ( $eles->hasAttributes() ) //如果此节点有属性,则取此节点指定属性的值

{

echo “sales属性值: “.$eles->getAttribute(“sales”).”->”;

}

if条件判断是否有属性,如果有,就可以取得元素指定的sales属性值。

9.1.9 DOMText内容节点对象

DOMText对象指的是XML元素的文字内容。

9.1.10 DOMNamedNodeMap属性清单对象

XML元素可能拥有多个属性,PHP程序可以使用DOMElement对象的attributes属性取得所有属性的DOMNamedNodeMap对象,如下所示:

$atts = $node->attributes;

foreach ( $atts as $att )

{

$v=iconv(“utf-8″,”big5”,$att->nodeValue);

echo “(“. $att->NodeName .”/”. $v .”)<br>”;

}

上述程序码在使用attributes属性取得属性清单后,使用foreach循环取得所有属性名称和值。

第二十三回、PHP基础教程,类的封装与继承

抽象关键字 abstract

抽象就是无法确切的说明,但又有一定的概念或者名称,在PHP中声明一个抽象类或方法时,我们使用的关键字是abstract。

8.1.2 抽象方法和类的定义

一个类中至少有一个方法是抽象的,我们称之为抽象类。就是说,如果一个类中含有抽象方法,我们就说这个类是一个抽象的类。

abstract class myPc{

abstract function fun1();

 ……

}

注意:1、类中至少有一个抽象方法

2、抽象方法中不允许有{ }

3、抽象方法前面必须要加abstract关键字

8.1.3 抽象类和方法的使用规则

抽象类的几个特点:

1、不能被实例化,只能被继承

2、继承的派生类中要把所有抽象方法重载才能实例化

第二十三回、PHP基础教程,类的封装与继承

举例:

abstract class Root{ /*定义一个抽象类*/

abstract function fun1();

abstract function fun2();

abstract function fun3();

/*连续定义3个抽象方法*/

function fun4(){ /*定义了一个普通的方法*/

……

}

}

class son{

function fun1(){/*重载父类中的方法fun1()*/

echo “第一个<br>”;

}

function fun2(){/*重载父类中的方法fun2()*/

Echo “第二个<br>”;

}

function fun3(){/*重载父类中的方法fun3()*/

echo “第三个<br>”;

}

}

第二十二回、PHP基础教程,类的封装与继承

类的封装就是把一些相关的属性和行为隐藏起来,从而得到保护和安全。

常用关键字:

public表示全局,该类内部及外部子类都可以使用

protected表示受保护的,只有本类或子类或父类中可以访问,可以继承

private表示私有的,只有本类内部可以使用,不能继承

例:

class myClass

{

public $name;

//定义全局属性

protected $price;

//定义受保护的属性

private function vod()//定义私有方法

{

return $this->name;

}

}

7.1.1 封装相关函数

__set()与__get()用以某些特定操作时候需要获取或向被封装的属性赋值或进行方法操作。

__set()取得当前类中封装过的私有属性或者方法重新执行或赋值操作。

格式:__set(对象名的别名,对应的新值);

__get()取得当前类中封装过属性或方法并转换成共有属性

格式:__get();

例1:

class myClass

{

public $name;

//定义全局属性

protected $price;

//定义受保护的属性

private function vod($name=””)//定义私有方法

{

return “你好”;

}

function ok()

{

return $this->vod();

}

}

$my1=new myClass(“我的电脑”);

echo $my1->name;

//正确

echo $my1->$price;

//出错

echo $my1->vod();

//出错

echo $my1->ok();

//正确

例2:对私有属性的引用

class myClass

{

private $name;

//定义私有属性

function __construct($name=””)

{

$this->name=$name;

}

function __get($name)

{

return “=====”.$this->name.”=====”;

//这样,就可以引用name属性了,返回的值会被加上多个=,但其原有值保持不变

}

}

$my1=new myClass(“我的电脑”);

echo $my1->name;

//正确

输出结果:=====我的电脑=====

例3:对私有属性赋值并引用

class myClass

{

private $name;

//定义私有属性

function __construct($name=””)

{

$this->name=$name;

}

function __get($name)

{

return “==”.$this->name.”==”;

//这样,就可以引用name属性了,但它的值会被加上多个=,且原有值保持不变

}

function __set($n,$v)//$n对应下面赋值时的name,$v则对应赋的值

{

$this->$n->$v;

//这样就修改了属性name的值

}

}

$my1=new myClass(“我的电脑”);

$my1->name=”你的电脑”;

//这样做原本会出错,但由于在定义类时我们使用了__set()将name属

性进行了设置,也就不会出错,并可以对它进行赋值了。

echo $my1->name;

//正确

输出结果:==你的电脑==

7.2.1 继承关键定:exends

PHP类的继承,我们可以理解成共享被继承类的内容。PHP中使用extends单一继承的方法,请切忌:(非C++多继承)被继承的我们称之为父类(基类),继承者称之为子类(派生类)。

7.2.2 PHP继承的规则

第二十二回、PHP基础教程,类的封装与继承

依次被继承,Class3拥有Class1、Class2所有的功能和属性。注意:在子类中定义方法和属性时应避免与基类方法和属性重名。

第二十二回、PHP基础教程,类的封装与继承

此例先定义了一个类myPc,然后又定义了一个myPc的子类home,这样home就拥有了myPc类中可以被继承的属性和方法。

7.2.3基类方法的重载和基类方法的访问

因为方法和属性的继承是向下继承,即派生类继承基类,故基类不能使用派生类里的方法和属性,但派生类可以使用基类中的方法和属性。当我们在派生类中需要用到基类中的一个方法,但这个方法又不能完成派生类中所需要的功能时,我们可以在派生类中定义一个与基类中当前这个方法名称相同的方法,然后就可以在原有功能的基础上给它定义新的功能,这就是方法的重载。

class home{

function 方法名称(){

基类名称::方法名称;

新的方法的功能

……

}

类的继承举例:

例1:

<?php

class Root{ /*定义基类*/

function dayin(){

return “Root print<br>”;

}

}

class Son extends Root{ /*定义子类*/

function dayin2(){

return “Son print<br>”;

}

}

$p=new Son();

/*实例化类Son()*/

echo $p->dayin();

/*使用子类继承父类的方法dayin()*/

echo $p->dayin2();

/*使用子类中的方法dayin();

*/

?>

输出:输出:Root print

Son print

例2:

<?php

class Root{ /*定义基类*/

function dayin(){

return “Root print<br>”;

}

}

class Son extends Root{ /*定义子类*/

function dayin2(){

return this->dayin(). “Son print<br>”;

/*引用父类中的方法dayin()并与一个字符串连接后返回*/

}

}

$p=new Son();

/*实例化类Son()*/

echo $p->dayin2();

/*使用子类中的方法dayin();

*/

?>

输出:Root print

Son print

例3:

<?php

class Root{ /*定义基类*/

function dayin(){

return “Root print<br>”;

}

}

class Son extends Root{ /*定义子类*/

function dayin(){ /*在子类中定义一个与父类方法相同的方法,即方法重载*/

return Root::dayin(). “Son print<br>”;

/*引用父类中的方法dayin()并与一个字符串连接后返回*/

}

}

$p=new Son();

/*实例化类Son()*/

echo $p->dayin();

/*使用子类重载父类的方法dayin()*/

?>

输出:Root print

Son print

第二十一回、PHP基础教程,析构函数

能够对对象进行自动释放和调用的函数,我们称之为析构函数。在PHP5中正式支持析构函数,我们称之为垃圾回收机制——使用__destruct()函数(注意前面是两个下划线)。

当对象的操作执行完毕时,该函数将会被自动调用,这样以来,对象所使用的内存就被释放。它有一个规则:先进后出。

阶段举例:

例1:创建多个对象并引用对象中的方法和修改属性

<?php

class myClass

{

public $key;

public $name;

function vod()

{

return $this->name.”,PHP高级编程进阶”;

}

function game()

{

return $this->name.”,玩游戏”;

}

function net()

{

return $this->name.”,上网”;

}

}

$my1=new myClass();

$my2=new myClass();

$my1->name=”家用电脑”;

$my2->name=”游戏电脑”;

echo $my1->vod().”<br>”;

echo $my2->game().”<br>”;

?>

输出:家用电脑,PHP高级编程进阶

游戏电脑,玩游戏

例2:对象的初始化

<?php

class myClass

{

public $type;

public $name;

function __construct($name=””,$type=””)

{

$this->name=$name;

$this->type=$type;

}

function vod()

{

return $this->name.”,”.$this->type.”,PHP高级编程进阶”;

}

function game()

{

return $this->vod();

}

}

$my1=new myClass(“家用电脑”,”台式机”);

//第一个参数传递给初始化中的第一个变量,第二参数传递给第二个变量

$my2=new myClass(“游戏电脑”,”笔记本”);

echo $my1->vod().”<br>”;

echo $my2->game().”<br>”;

?>

输出:家用电脑,台式机,PHP高级编程进阶

游戏电脑,笔记本,PHP高级编程进阶

例3:析构函数的应用(对象使用过后自动释放占用的内存)

<?php

class myClass

{

public $type;

public $name;

function __construct($name=””,$type=””)

{

$this->name=$name;

$this->type=$type;

}

function vod()

{

return $this->name.”,”.$this->type.”,PHP高级编程进阶”;

}

function game()

{

return $this->vod();

}

function __destruct()

{

echo ‘$this->name:’.$this->name;

//在这里列出了要释放的name的值”;

//为了能够看到释放的结果,在这里加了这一句输出语句

}

}

$my1=new myClass(“家用电脑”,”台式机”);

//第一个参数传递给初始化中的第一个变量,第二参数传递给第二个变量

$my2=new myClass(“游戏电脑”,”笔记本”);

echo $my1->vod().”<br>”;

//$my1=NULL;

如果想要将对象使用之后立即释放它所占用的内存可以使用这条语句

echo $my2->game().”<br>”;

?>

第二十回、PHP基础教程,面向对象的基本概念及类的定义

什么是面向对象

起初,“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Program)。

传统的程序开发存在着以下的问题:

1.软件重用性差 ,2.软件可维护性差,3.无很好的扩展性。

面向对象程序设计的要素:

1. 抽象性 , 2. 封装性 ,3.共享性 ,4. 强调对象结构而不是程序结构

面向对象的三大特点(封装,继承,多态)缺一不可。

1.1.2 什么是类

所谓类就是指由变量和作用于变量的函数组成的集合。类提供了一种对现实世界中事物的描述方式。通过有效的使用类,我们可以将描述同一对象的多个变量和函数组合在一起,作为一个整体使用,从而使编写出来的程序更直观,更合理,更易于维护。

举一个比较通俗的例子,我们可以创建一个名为Bike的类来描述现实生活中的一辆自行车。

首先,我们设定该类中的变量包括踏板$pedals,链条$chain,前轮$front wheel,后轮$rear wheel,刹车$brakes,以及手柄$handle。然后,我们创建停车Stop(),加速Accelerate(),左转TurnLeft()和右转TurnRight()等函数。这样,我们就有了一个可以描述自行车这一对象所有行为和属性的类。例如,我们可以将$front wheel 和$rear wheel变量传入TurnLeft()函数,从而得到某种输出结果。

也许有人会问上述例子虽然有趣,但是我们完全可以使用常规的变量和函数实现同样功能,为什么一定要坚持使用这么烦琐的类呢?当然,如果我们在脚本中只需要描述一辆自行车的话,定义一个类似乎没有什么特殊的价值。但是,如果当脚本需要涉及多辆自行车时呢?如果我们还是采用常规的为每辆自行车都定义变量和函数的方法,那么光是跟踪每个变量,确保正确的变量输入正确的函数就是一项相当复杂的工作。相反,如果采用类的方式,就可以有效的减少所需变量的数量。此外,一个已经定义的类还可以被包含在其它文件或脚本中,从而实现代码的重复利用。

基本语法:

class 类名

{

……

}

举例:

class myClass//定义一个名为myClass的类

{

public $name;

var $price;

//为这个类定义了两个成员属性$name和$price

function vod()//为这个类定义了一个成员方法vod

{

return “PHP进阶”;

}

}

注释:

var是PHP4中使用的变量定义形式,在PHP5中被public取代,建议使用public。

6.2.1 类的实例化

类被定义后并不能像自定义函数一样拿来直接的使用,要使用类,必需对其进行实例化,也就是将类所表现的对象进行实例化。

基本语法:

$varName=new 类名(参数列表);

//不需要向类中传递参数时,使用空的小括号,否则将实参放入小括号中

$x=$varName->name;

//使用”->”访问对象中的内容,注意这里name前没有$符号了

阶段实例:

<?php

class myClass

{

public $key;

var $name;

function vod()

{

echo “PHP高级编程进阶”;

}

}

$my=new myClass();

$my->name=”PHP”;

//给myClass类中的属性name赋值”php”

echo $my->name;

//输出属性name的值”PHP”

echo $my->vod();

//访问类中的方法vod(),输出”PHP高级编程进阶”

?>

6.2.2 通过一个类创建一个或多个对象

通过一个类创建一个或多个对象我们需要多次使用new函数。

例:

$my1=new myClass();

$my2=new myClass();

$my3=new myClass();

通过一个myClass创建了三个对象$my1、$my2、$my3。

6.2.3类中$this关键字的使用

$this关键字是用来访问当前对象中的对象属性和对象方法的系统变量。它使用在书写一个类的源码中。

例:

Class myClass

{

public $name;

public $price;

function vod()

{

$this->name;

}

……

$this-vod();

//使用$this访问本身的vod()方法

 ……

}

第十九回、PHP基础教程,PHP源程序及MYSQL数据库的上传

PHP网站及本地测试的MYSQL数据库设置好之后,就可以申请虚拟空间了,当虚拟空间申请成功之后,可以使用如FlashFXP之类的FTP上传工具将PHP源代码及MYSQL数据库上传至虚拟空间。

至于PHP源代码的上传比较简单,直接上传其文件及文件的所在的文件夹即可,但MYSQL数据库的上传就要有一定的说法了。MYSQL数据库的上传方式法有多种,本教程将其中的一中比较简单的方法介绍之——用phpmyadmin来实现。

其操作步骤如下:

一、如果空间提供商提供的phpmyadmin,那么,你应先向空间提供商索要phpmyadmin的登录地址、用户名和密码——用户名和密码一般是你在空间商那里申请的用户名和密码。如果空间商没有提供phpmyadmin,那么,你就应该先将你本地的phpmyadmin上传至空间中——最好是将phpmyadmin保存在空间中新建的一个专用文件夹,然后配置phpmyadmin——前面已经介绍过了,这里略。

二、在本地作如下操作。用phpmyadmin将你当前网站用到的MYSQL数据库“导出”——在phpmyadmin的界面里有一“导出”项供你导出数据库使用,在导出时,选择导出的文件类型为SQL类型,并选中“另存为文件”选项,并给这个文件起上名字,其它可以使用默认设置,点击“执行”按钮进行导出操作。导出成功后,会弹出一个“另存为”对话框来保存这个导出的SQL文件,选择保存的位置之后,点保存即可。至此,MYSQL数据库的导出操作完成。

三、在浏览器中打开你空间中的phpmyadmin主页,输入正确的用户名和密码后即可登录到phpmyadmin的主页。在主页中有一项命令“import”或“导入”,它的功能就是将外部的数据库文件导入到MYSQL数据库管理系统中。点击之后,在进入的页面中有一项“文本文件的位置”,在其右侧是一个文件路径输入框,点“浏览”按钮,在本地找到刚才导出的扩展名是.sql的SQL文本文件,点击“打开”,点击“执行”。至此,本地的数据库已经成功导入到远程空间服务器的MYSQL数据库管理系统中,数据库上传成功。

打开你的网站主页,看一看你炫目的网站吧!

第十八回、PHP基础教程,MYSQL数据类型

MySQL 支持大量的列类型,它们可以被分为 3 类:数字类型、日期和时间类型以及字符串(字符)类型。这个章节首先给出可用类型的概述,并且总结各类型所需的存储需求,然后提供各类型中的类型范畴更详细的描述。概述有意地简化了。更详细的说明应该参考特写列类型的附加信息,例如你能为其指定值的允许格式。

MySQL 支持的列类型在下面列出。下列代码字母用于描述中:

M指出最大的显示尺寸。最大的显示尺寸长度为 255。

D 适用于浮点类型。指出跟随在十进制小数点后的数字数量。最大可能值为 30,但不应大于M-2。

方括号 (“[”and“]”) 指定可选的类型修饰部份。

注意,如果为一个列指定了ZEROFILL,MySQL 将自动为这个列添加UNSIGNED属性。

警告:你应该知道当在两个整数类型值中使用减法时,如有一个为UNSIGNED类型,那么结果也是无符号的。查看章节6.3.5 Cast 函数。

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

-128到127。无符号的范围是0到255。

BIT,BOOL它们是TINYINT(1)的同义词。

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

一个小整数。有符号的范围是-32768到32767。无符号的范围是0到65535。

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

一个中等大小的整数。有符号的范围是-8388608到8388607。无符号的范围是0到16777215。

INT[(M)] [UNSIGNED] [ZEROFILL]

一个正常大小的整数。有符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

INTEGER[(M)] [UNSIGNED] [ZEROFILL]

INT的同义词。

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

一个大的整数。有符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。

BIGINT是用DOUBLE值来记录的,因此不能使用大于9223372036854775807(63 bits) 的无符号大整数,除了位函数之外!如果你这样做了,结果中的某些大数字可能会出错,因为将BIGINT转换成DOUBLE时产生了舍入错误。MySQL 4.0 在下列情况下可以处理BIGINT:

在一个BIGINT列中使用整数存储一个大的无符号值。

在MIN(big_int_column)和MAX(big_int_column)中。

当两个操作数都是整数时使用操作符 (+、-、*、等)。

通常你可以在一个BIGINT列中以字符串方式存储的一个精确的整数。在这种情况下,MySQL 将执行一个字符串到数字的转换,包括无 intermediate 的双精度表示法。

当两个参数均是整数值时,“-”、“+”和“*”将使用BIGINT运算!这就意味着,如果两个大整数的乘积(或函数的结果返回整数)的结果大于9223372036854775807时,你可能会得到意想不到的结果。

FLOAT(precision) [UNSIGNED] [ZEROFILL]

一个浮点型数字。precision可以是<=24作为一个单精度的浮点数字和介于 25 和 53 之间作为一个双精度的浮点数字。这些类型与下面描述的FLOAT和DOUBLE类型相似。FLOAT(X)有与相应的FLOAT和DOUBLE类型同样的范围,但是显示尺寸和十进制小数位数是未定义的。在 MySQL 3.23 中,它是一个真实的浮点值。而在 MySQL 早期的版本中,FLOAT(precision)通常有 2 小数位。 注意,由于在 MySQL 中所有的计算都是以双精度执行的,所以使用FLOAT可能带来一些意想不到的问题。查看章节A.5.6 解决没有匹配行的问题。

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

一个小的(单精度) 浮点数字。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。FLOAT没有参数或有X<= 24 的FLOAT(X)代表一个单精度的浮点数字。

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

一个正常大小的(双精度)浮上数字。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。DOUBLE没胡参数或有 25 <=X<= 53 的FLOAT(X)代表一个双精度的浮点数字。

DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL],REAL[(M,D)] [UNSIGNED] [ZEROFILL]

它们是DOUBLE同义词。

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

一个未压缩(unpacked)的浮点数。运作如同一个CHAR列:“unpacked” 意味着数字是以一个字符串存储的,值的每一位将使用一个字符。小数点并且对于负数,“-”符号不在M中计算(但是它们的空间是被保留的)。如果D是 0,值将没有小数点或小数部份。DECIMAL值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL列,实际的范围可以被所选择的M和D限制。如果UNSIGNED被指定,负值是不允许的。 如果D被忽略,缺省为 0。如果M被忽略,缺省为 10。 在 MySQL 3.23 以前,M参数必须包含符号与小数点所需的空间。

DEC[(M[,D])] [UNSIGNED] [ZEROFILL],NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]它们是DECIMAL的同义词。

DATE

一个日期。支持的范围是’1000-01-01’到’9999-12-31’。MySQL 以’YYYY-MM-DD’格式显示DATE值,但是允许你以字符串或数字给一个DATE列赋值。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。

DATETIME

一个日期和时间的组合。支持的范围是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。MySQL 以’YYYY-MM-DD HH:MM:SS’格式显示DATETIME值,但是允许你以字符串或数字给一个DATETIME列赋值。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。

TIMESTAMP[(M)]

一个时间戳。范围是’1970-01-01 00:00:00’到2037年间的任意时刻。 MySQL 4.0 和更早版本中,TIMESTAMP值是以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式显示的,它取决于M是否是14(或省略)、12、8或6,但是允许你以字符串或数字给一个TIMESTAMP列赋值。 从 MySQL 4.1 开始,TIMESTAMP以’YYYY-MM-DD HH:MM:DD’格式作为字符返回。如果你你希望以数字形式返回则必须在该时间戳字段后加上 +0。不同的时间戳长度是不支持的。从 MySQL 4.0.12 开始,选项–new可以被用来使服务器与 4.1 一样运作。TIMESTAMP列有益于记录一个INSERT或UPDATE操作的日期和时间,因为如果你自己没有给它赋值,它将被自动地设置为最近一次操作的日期和时间。也可以通过给它赋一个NULL而使它设置为当前的日期和时间。查看章节6.2.2 Date 和 Time 类型。 参数M只影响一个TIMESTAMP列的显示格式;它的值总是占用 4 个字节存储。 注意,当TIMESTAMP(M)列的M是 8 或 14 时,它返回的是数字而其它的TIMESTAMP(M)列返回的是字符串。这仅仅是为了可以可靠地转储并恢复到其它格式的表中。查看章节6.2.2.2DATETIME、DATE和TIMESTAMP类型。

TIME

一个时间。范围是’-838:59:59’到’838:59:59’。MySQL 以’HH:MM:SS’格式显示TIME值,但是允许你使用字符串或数字来给TIME列赋值。查看章节6.2.2.3TIME类型。

YEAR[(2|4)]

一个 2 或 4 位数字格式的年(缺省为 4 位)。允许的值是1901到2155、0000(4 位年格式) 以及使用 2 位格式的 1970-2069 (70-69)。MySQL 以YYYY格式显示YEAR值,但是允许你使用字符串或数字来给YEAR列赋值。(YEAR类型在 MySQL 3.22 之前不支持。) 查看章节6.2.2.4YEAR类型。

[NATIONAL] CHAR(M) [BINARY]

一个定长的字符串,当存储时,总是以空格填满右边到指定的长度。M的范围是 0 到 255 (在 MySQL 3.23 版本之前为 1 到 255)。当该值被检索时,尾部空格将被删除。CHAR值根据缺省的字符集进行忽略大小写的排索与比较,除非指定了关键词BINARY。NATIONAL CHAR(或短形式NCHAR) 是以 ANSI SQL 方式定义一个CHAR列,它将使用缺省的字符集。这在 MySQL 中是默认的。CHAR是CHARACTER的缩写。 MySQL 允许以CHAR(0)类型建立一个列。一些老程序运行时必需一个列,却又并不使用这个列的值,你就不得不为了适应它而建立该列,在这情况下,CHAR(0)将是很有益的。当需要一个列仅保存两个值时:一个为CHAR(0)(该列没有定义为NOT NULL),这将仅占用一个比特位来存储 2 个值:NULL或””。查看章节6.2.3.1CHAR和VARCHAR类型。

CHAR

这是CHAR(1)的同义词。

[NATIONAL] VARCHAR(M) [BINARY]

一个变长的字符串。注意:尾部的空格在存储时将会被删除(这与 ANSI SQL 约规不同)。M的范围是 0 到 255 (在 MySQL 4.0.2 之前的版本中是 1 到 255)。VARCHAR值以大小写忽略方式进行排索与比较,除非关键词BINARY被指定。查看章节6.5.3.1 隐式的列定义变化。VARCHAR是CHARACTER VARYING的缩写。查看章节6.2.3.1CHAR和VARCHAR类型。

TINYBLOB

TINYTEXT

一个BLOB或TEXT列,最大长度为 255 (2^8 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。

BLOB

TEXT

一个BLOB或TEXT列,最大长度为 65535 (2^16 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。

MEDIUMBLOB

MEDIUMTEXT

一个BLOB或TEXT列,最大长度为 16777215 (2^24 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。查看章节6.2.3.2BLOB和TEXT类型。

LONGBLOB

LONGTEXT

一个BLOB或TEXT列,最大长度为 4294967295 (2^32 – 1) 个字符。查看章节6.5.3.1 隐式的列定义变化。注意,由于服务器/客户端的协议以及 MyISAM 表通常有一个 16M 每通信包/表行的限制,你仍然不能使用这个类型的整个范围。查看章节6.2.3.2BLOB和TEXT类型。

ENUM(‘value1′,’value2’,…)

一个枚举类型。一个仅能有一个值的字符串对象,这个值选自值列’value1’、’value2’、…、NULL或特殊的””出错值。一个ENUM列可以有最大 65535 不同的值。查看章节6.2.3.3ENUM类型。

SET(‘value1′,’value2’,…)

一个集合。一个能有零个或更多个值的字符串对象,其中每个值必须选自值列’value1’、’value2’、…。一个SET列可以有最大 64 个成员。查看章节6.2.3.4SET类型。

MySQL 支持所有的 ANSI/ISO SQL92 数字类型。这些类型包括准确数字的数据类型(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包括近似数字的数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键词INT是INTEGER的同义词,关键词DEC是DECIMAL的同义词。

NUMERIC和DECIMAL类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;

例如:salary DECIMAL(5,2)在这个例子中,5(精度(precision)) 代表重要的十进制数字的数目,2(数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary列可以存储的值范围是从-99.99到99.99。(实际上 MySQL 在这个列中可以存储的数值可以一直到999.99,因为它没有存储正数的符号)。

总结:

整数型:TINYINT,SMALLINT,INT,BIGINT

小数型:FLOAT,DOUBLE,DECIMAL(M,D)

字符型:CHAR,VARCHAR

日期型:DATETIME ,DATE,TIMESTAMP

备注型:TINYTEXT ,TEXT ,LONGTEXT

第十七回、PHP基础教程,事件处理

事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

MYSQL的事务处理功能:

mySQL数据库从4.1版本开始支持事务处理功能。事务是DBMS得执行单位。它由有限得数据库操作序列组成的。但不是任意的数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)

原子性(Autmic):事务在执行时,要做到“要么不做,要么全做!”,就是说不允许事务部分的执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库的影响。

一致性(Consistency):事务的操作应该使使数据库从一个一致状态转变到另一个一致的状态!就拿网上购物来说吧,你只有既让商品出库,又让商品进入顾客的购物篮才能构成事务!

隔离性(Isolation):如果多个事务并发执行,应像各个事务独立执行一样!

持久性(Durability):一个成功执行的事务对数据库的作用是持久的,即使数据库因故障出错,也应该能够恢复!

MYSQL的事务处理主要有两种方法来实现。

1、用begin,rollback,commit来实现

begin 或 start transaction 开始一个事务

rollback 事务回滚(即取消所有对数据库的操作)

commit 事务确认(即执行对数据库的所有操作)

2、直接用set来改变mysql的自动提交模式

MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过

set autocommit=0 禁止自动提交

set autocommit=1 开启自动提交

  来实现事务的处理。

但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了一个新的事务!按第一种方法只将当前的操作作为一个事务!我们推荐使用第一种方法。

PHP中实现数据库操作的事务功能范例:

<?php

…数据库连接…

mysql_query(‘BEGIN’);

//开启事务,也可以使用mysql_query(“START TRANSACTION”)开启事务

mysql_query(“SET AUTOCOMMIT=0”);

//设置事务不自动commit,用第二种形式时不加此语句

$sql =”一条SQL语句”;

Mysql_query($sql,$conn);

if(mysql_errno)

{

mysql_query(“ROLLBACK”);

exit;

}

$sql=”一条sql语句”;

mysql_query($sql);

if(mysql_errno)
{

print mysql_error();

mysql_query(‘ROLLBACK’);

//如果出错就回卷

exit();

}

else

{

mysql_query(“COMMIT”);

}

} //每执行一次SQL查询都要判断一次是否出错,如果出错则事务回滚,并exit;

终止程序执行。

mysql_query(‘COMMIT’);

//能够到这里,代表上述数据库操作都没有错,正式提交执行数据库操作

?>

还有就是注意要建立能用事务操作的表类型。以及除了commit外还有什么语句能结束一个事务。

第十六回、PHP基础教程,PHP与mySQL的连接

mySQL的连接

建议按以下将信息赋值给变量的形式,以后用到时,可以直接用变量。

$sqlServerName=”localhost/127.0.0.1/自己的IP地址”;

$userName=”登录数据库的用户名”;

$userPass=”登录数据库的密码”;

$sqlDataBase=”数据库的路径”;

$sql=”sql语句”;

//mySql数据库连接的语法:

$conn=mysql_connect($sqlServerName,$userName,$userPass);

mysql_select_db($sqlDataBase,$conn);

$queryResult=@ mysql_query($sql,$conn) or die(mysql_error());

$row=mysql_fetch_row($queryResult);

或$row=mysql_fetch_array($queryResult);

//说明:mysql_fetch_row($queryResult);

与mysql_fetch_array($queryResult);

的区别是,使用前者生成的数组$row只能使用下标来显示其每个元素的值——即每条记录中字段的值,而用后者则既可以用下标也可以使用数据表中的字段名来显示每个元素的值。

//下面是输出查询结果中每个字段的名称,按行输出

for($i=0;

$i<=mysql_num_fields($queryResult)-1;

$i++)

{

echo mysql_field_name($queryResult,$i).”&

nbsp;

&

nbsp”;

//输出查询结果中每个字段的名称

}

mysql_data_seek($queryResult,0);

//将记录指针移动到查询结果中指定的记录行上,行号从0开始,取值范围是0到(mysql_num_rows-1)

//下面是输出查询的每个记录

while($row=mysql_fetch_row($queryResult))//从结果集中取得一行作为枚举数组,返回根据所取得的行生成的数组,如果没有更多行则返回 FALSE。它会将记录指针自动移动到下一条

{

for($i=0;

$i<mysql_num_fields($queryResult);

$i++)

{

echo $row[$i].”&

nbsp;

&

nbsp;

“;

}

echo “<br>”;

}

mysql_free_result($queryResult);

//释放查询结果

PHP中有关数据查询的常用函数:

$myConnect=mysql_connect: 开启 MySQL 链接,建立PHP与MYSQL的连接

$mysql_select_db: 打开一个数据库,与MYSQL建立连接后,就可以打开一个数据库了

@ 和 or die(“错误信息”):在PHP中把@放在某语句的前面,就可以隐藏这条语句运行时出现的错误;把“or die”放在某条语句的后面,当这条语句在运行时出现错误时就可以显示指定的错误信息

说明:

mysql_connect(“主机”, “用户名”, “密码”) //说明:主机名可以是localhost或IP地址

mysql_select_db(“需打开的数据库名”,连接标识符);

mysql_query(“set names ‘GBK'”);

如果数据表中涵有中文,则在SQL查询前加入之可解决中文乱码

mysql_num_rows;

用于计算查询结果中所得行的数目

mysql_insert_id;

传回最后一次使用 INSERT 指令的 ID。

mysql_tablename;

取得数据库名称

mysql_error;

返回错误信息

mysql_free_result($queryResult);

//释放查询结果

mysql_clos;

关闭 MySQL 链接

htmlspecialchars(string,quotestyle,character-set);

// 主要功能是将HTML格式化,防止在输出html时被浏览器执行;string必要参数,指定需要解码的字符串对象;quotestyle可选参数,定义如何对单引号和双引号进行编码;character-set可选参数,指定使用什么样的字符串设置。详细说明见PHP5手册。

mysql_create_db(“webjx”);

//创建一个名称为webjx的新数据库

SQL语句中limit的用法(MYSQL的这个功能很好,可以比较容易的来实现分页操作):

Select * from table where 条件 limit 开始位置,操作记录数 //开始位置从0开始

Select * from table where 条件 limit 0,20//从满足条件的第1条记录开始,取20条满足条件的记录

Select * from table where 条件 limit 10,20//从满足条件的第11条刻录开始,取20条满足条件的记录

PHP无法向MYSQL保存中文文字或输出MYSQL中的中文文字出现乱码的解决:

PHP操作MYSQL,汉字出现乱码或无法将汉字插入到数据库中,究其原因是字符集设置不当。当数据库中的字符集采取的是UTF-8时,就在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码;对于GBK的数据库则使用SET NAMES GBK,示例代码如下:

$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);

mysql_query(“SET NAMES ‘GBK'”);

parse_url()解析URL函数:

parse_url() 是将URL解析成有固定键值的数组的函数

第十六回、PHP基础教程,PHP与mySQL的连接