PHP7.0编程

基础配置(安装)

Download XAMPP (apachefriends.org)

下载XAMPP,修改端口如图

网站根目录的默认路径:xampp\htdocs。MySQL数据库默认路径:xampp\mysql\data。

XAMPP的默认密码如下。

●MySQL。User:root;Password:(空)。

●FileZilla FTP。User:newuser;Password:wampp。User:anonymous;Password:some@mail.net。

●Mercury。Postmaster:postmaster(postmaster@localhost)。Administrator:Admin(admin@localhost)。TestUser:newuser;Password:wampp。

●WEBDAV。User:wampp;Password:xampp。

并下载hbuilder,配置如图,安装php插件

第2章 PHP程序编写基础

PHP语句与Perl和C一样,结构比较严谨,需要在每条语句后使用分号“;”来作为结束,而且对语句中的大小写敏感。
常用的PHP程序结构有如下3种。
方法一:PHP标准结构(推荐)。
 

<?php
echo "123";
?>

PHP输出所有参数可以用echo命令,echo实际上不是一个函数,而是一个语言结构,它不能总是使用一个函数的上下文。使用该命令时,不一定要使用小括号来指明参数,用单引号或双引号也可以。另外,如果想给echo命令传递多个参数,那么就不能使用小括号。

提示:也可以使用print()命令来实现,但echo比print()函数快一点。下面举例用PHP输出语句,包括HTML格式化标签,如图2-2所示。

'' ''双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。

' '单引号里面的字段不进行解释,直接输出。

因此,单引号比双引号执行得要快了。

2.1.3 PHP程序注释

PHP中可以使用多种风格的注释方式,如下所示。

/∗第1种PHP注释 适合用于多行∗/

//第2种PHP注释 适合用于单行

#第3种PHP注释 适合用于单行

2.2 动态输出字符

要实现相应的字符控制就需要调用相应的函数命令,在PHP编程中调用相应的函数还是比较简单的,如使用rand()函数来产生一个随机数字(范围是0~100)。

<?php
echo rand(0,100);
?>

2.2.2 截去字符串首尾使用

trim()函数可以返回字符串string首尾的空白字符去除后的字符串。语法:string trim(string str);

<?php
$x='    1 2   ';
echo $x;
echo '<br/>';
echo trim($x);
?>

2.2.3 格式化输出字符

nl2br()函数可以将换行字符转换成HTML换行的<br>指令。语法:string nl2br(string string);

2.2.4 打印格式化输出

PHP支持print()结构在实现echo功能的同时能返回值(True或False,是否成功),使用printf()可以实现更复杂的格式。

语法:int printf(string format,mixed[args]...);

返回值:整数

<?php
//将$num里的数值以字符串的形式输出
$num=12.1;
printf("数值为:%s",$num);
echo '<br/>';
//转换成为带有两位小数的浮点数
printf("数值为:%.2f",$num);
echo '<br/>';
//解释为整数并作为二进制数输出
printf("数值为:%b",$num);
echo '<br/>';
//打印%符号
printf("数值为:%%%s",$num);
?>

2.2.5 字母大小写转换

字母的大小写转换在PHP网页转换中经常用到,涉及的函数命令也有常用的几个,如

strtoupper()可以将字符串转换成大写字母,

将每个单词的第一个字母转换成大写可以使用ucwords(),

将字符串的第一个字母转换成大写可以使用ucfirst(),

将字符串转换成小写字母可以使用strtolower()

2.2.6 处理特殊的字符

有些字符对于MySQL是有特殊意义的,例如引号、反斜杠和NULL字符。如何正确处理这些字符?可以使用addslashes()函数和stripslashes()函数。

<?php 
$str=" \" ' \ NULL" ; 
echo $str. " <br/>"; 
echo addslashes ( $str). "<br/> ";
echo stripslashes ($str). "<br/>"; 
?>

2.3 常量和变量


常量和变量是编程语言的最基本构成元素,代表了运算中所需要的各种值。通过变量和常量,程序才能对各种值进行访问和运算。常量和变量的功能就是用来存储数据的,但区别在于常量一旦初始化就不再发生变化,可以理解为符号化的常数。本节介绍PHP中的常量和变量。
2.3.1 PHP中的常量
常量是指在程序执行过程中无法修改的值。在程序中处理不需要修改的值时,常量非常有用,例如定义圆周率PI。常量一旦定义,在程序的任何地方都不可以修改,但是可以在程序的任何地方访问。
在PHP中使用define()函数定义常量。该函数有3个参数,第1个参数表示常量名,第2个参数表示常量的值。
name:必选参数,常量名称,即标识符。
value:必选参数,常量的值。
case_insensitive:可选参数,如果设置为True,则该常量不区分大小写,不设置则默认是区分大小的。
常量在定义后,可以在运行脚本的任何地方使用。
例如,下面定义一个名为HOST的常量,如图2-8所示。

<?php 
define('host', 'www.bing.com');
echo host;
?>

常量说明如下。
常量默认区分大小写,按照惯例,常量标识符总是大写。常量名和其他任何PHP标记遵循相同的命名规则。合法的常量名以字母或下画线开始,后面跟任何字母、数字或下画线。
PHP的系统常量包括5个魔术常量和大量的预定义常量。
魔术常量会根据它们使用的位置而改变,PHP提供的5个魔术常量分别如下。
(1)_LINE_:表示文件中的当前行号。
(2)_FILE_:表示文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自PHP 4.0.2起,_FILE_总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
(3)_FUNCTION_:表示函数名称(PHP 4.3.0新加)。自PHP 5起,该常量返回该函数被定义时的名字(区分大小写)。在PHP 4中,该值总是小写字母的。
(4)_CLASS_:表示类的名称(PHP 4.3.0新加)。自PHP 5起,该常量返回该类被定义时的名字(区分大小写)。在PHP 4中,该值总是小写字母的。
(5)_METHOD_:表示类的方法名(PHP 5.0.0新加)。返回该方法被定义时的名字(区分大小写)。

<?php 
echo __LINE__;
echo '<br/>';
echo __FILE__;
echo '<br/>';
echo __FUNCTION__;
echo '<br/>';
echo __CLASS__;
echo '<br/>';
echo __METHOD__;
?>

2.3.2 PHP中的变量
在PHP中,创建一个变量首先需要定义变量的名称。变量名区分大小写,总是以$符号开头,然后是变量名。如果在声明变量时忘记变量前面的$符号,那么该变量将无效。在PHP中设置变量的正确方法如下所示。
$var_name=value;
直接赋值
直接把一个数值通过赋值表达式传递给变量,会把该变量原来的数值覆盖,如果在声明变量时没有赋值,则其行为就形同NULL。在声明变量时赋值是一种常用的变量的赋值方法,使用示例如下。
引用赋值

<?php 
$a='123';
$yin=&$a;
echo $yin.'<br/>';
$yin='new:$a';
echo $yin.'<br/>'.$a;?>

从这里可以看出,对一个变量值的修改将会导致对另外一个变量值的修改。从本质上讲,变量的引用赋值导致两个变量指向同一个内存地址。因此,不论对哪一个变量进行修改,修改的都是同一个内存地址中的数据,从而出现同时被修改的结果。

常用的超全局变量如下。

(1)$GLOBALS:包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键名为全局变量的名称。从PHP 3开始存在$GLOBALS数组。

2.变量作用域

声明变量的位置决定了变量的作用域,变量的作用域决定了程序的哪些部分可以访问该变量,哪些部分不可以访问该变量。在PHP中,变量的作用域范围可以分为4类:局部变量、函数参数、全局变量和静态变量,这里介绍一下变量的这几种作用域范围。

(1)局部变量。在一个函数中声明的变量是这个函数的局部变量,也就是说,该变量只能被函数内部成员访问,函数外部成员不能访问该变量,并且不可见。默认情况下,函数内部成员不能访问函数外定义的变量(平常所说的全局变量)。有时局部变量很有用,因为局部变量能够消除出现意外副作用的可能性,否则这些副作用将导致可全局访问的变量被有意或无意地修改。下面是一个使用局部变量的示例。

<?php
$count = 10; 
function AddCount() {
$count = 100; 
$count = $count + $count; 
echo $count; 
echo "<br/>" ; }
AddCount(); 
echo $count;
?>200
10
不会发生变化

(2)函数参数。在PHP中,函数可以接收相应的参数。虽然这些参数接收函数外部的值,但退出函数后就无法访问这些参数。在函数执行结束后,参数的值就会消失,和函数的执行有很大的关系。函数参数在函数后面的括号内声明,运用函数参数的示例如下。

<?php
function add($x,$y)
{
	echo $x+$y;
}
add(1,2);
?>

(3)全局变量。全局变量可以在整个PHP程序中的任何地方访问,但是如果要修改一个全局变量,必须在修改该变量的函数中显式声明为全局变量。在函数中显式声明全局变量很简单,只需使用global关键字声明就可以。下面是一个使用全局变量的示例。

<?php
$x=1;
function add($a)
{    global $x;
    $x+=$a;
}add(100);
echo $x;
?>

(4)静态变量。静态变量在两次调用函数之间其值不变,静态变量仅在局部函数域中声明。用关键字static可以声明一个静态变量。静态变量在函数退出时不会丢失值,并且再次调用此函数时还能保留值。下面是一个使用静态变量的示例。

<?phpfunction add($a)
{    static $x;
    $x+=$a;
    echo $x;
}add(100);
echo '<br>';
add(100);
?>

2.3.3 PHP数据类型


数据是程序运行的基础,所有的程序都是在处理各种数据。例如,财务统计系统所要处理的员工工资额,论坛程序所要处理的用户名、密码、用户发帖数等,所有这些都是数据。在编程语言中,为了方便对数据的处理及节省有限的内容资源,需要对数据进行分类。
PHP支持7种原始类型,分别如下。(1)boolean(布尔型True/False)。(2)integer(整数类型)。(3)float(浮点型,也称为double,可用来表示实数)。(4)string(字符串类型)。(5)array(数组同一变量保存同类型的多条数据)。(6)object(对象)。(7)特殊类型(resource资源和NULL未设定)。
1.布尔型boolean
布尔型是最简单的类型,它表达了真值,可以为True或False。要指定一个布尔值,可使用关键字True或False,并且True或False不区分大小写。例如:$pay=true;//给变量$pay赋值为True
转换成布尔型可用bool或者boolean来强制转换。但是很多情况下不需要用强制转换,因为当运算符、函数或者流程控制需要一个布尔参数时,该值会被自动转换。
当转换为布尔型时,以下值被认为是False。
(1)布尔值False。(2)整型值0(零)。(3)浮点型值0.0(零)。(4)空白字符串和字符串“0”。(5)没有成员变量的数组。(6)没有单元的对象(仅适用于PHP 4)。(7)特殊类型NULL(包括尚未设定的变量)。所有其他值都被认为是True(包括任何资源)。


4.字符串string
字符串是由引号括起来的一些字符,常用来表示文件名、显示消息、输入提示符等。字符串是一系列字符,字符串的大小没有限制。字符串可以用单引号、双引号或定界符3种方法定义,下面分别介绍这3种方法。
(1)单引号。指定一个简单字符串的最简单的方法是用单引号(')括起来。
例如:[插图]如果字符串中有单引号,要表示这样一个单引号,和很多其他语言一样,需要用反斜线(\)转义。例如:[插图]如果在单引号之前或字符串结尾需要出现一个反斜线(\),则需要用两个反斜线(\\)表示。例如:[插图]对于单引号(')括起的字符串,PHP只懂得单引号和反斜线的转义序列。如果试图转义任何其他字符,则反斜线本身也会被显示出来。另外,还有不同于双引号和定界符的很重要的一点就是,单引号字符串中出现的变量不会被解析。
(2)双引号。如果用双引号(")括起字符串,则PHP懂得更多特殊字符的转义序列(如表2-1所示)。表2-1 转义字符[插图]如果试图转义任何其他字符,则反斜线本身也会显示出来。双引号字符串最重要的一点是能够解析其中的变量。
(3)定界符。另一种给字符串定界的方法使用定界符语法(<<<)。应该在<<<之后提供一个标识符,接着是字符串,最后是同样的标识符结束字符串。例如:

<?php
echo<<<a
hello world
a;
?>


输出hello5.数组array
PHP中的数组实际上是一个有序图,图是一种把值(value)映射到键(key)的类型。新建一个数组可使用array()
语言结构,它接收一定数量用逗号分隔的键-值对。语法如下:
$arrayName[key]=value;
$arrayName[]=value;
其中,键key可以是整型或者字符串,值value可以是任何类型。

<?php
$a1=array(1,2,3,'4');
$a2[0]=1;echo $a1[0];
echo '<br>';
echo $a2[0];
?>
<?php
$a1=array(1,2,3,'4');
$a2[0]=1;echo $a1[0];
echo '<br>';
echo "a1[3]是$a1[3]";
?>


6.对象object
使用class定义一个类,然后使用new类名(构造函数参数)来初始化类的对象。该数据类型将在后面的实例中具体应用时进行解析。
7.其他数据类型
除了以上介绍的6种数据类型,还有资源和NULL两种特殊类型。下面简单介绍一下资源和NULL两种特殊类型。
(1)资源。资源是通过专门函数来建立和使用的一个特殊变量,保存了外部资源的一个引用。可以保存打开文件、数据库连接、图形画布区域等的特殊句柄,无法将其他类型的值转换为资源。资源大部分可以被系统自动回收。
(2)NULL。NULL类型只有一个值,就是大写的关键字NULL。特殊的NULL值表示一个变量没有值。


2.3.4 数据类型转换


在PHP中,若要进行数据类型的转换,就要在转换的变量之前加上用括号括起来的目标类型。在变量定义中不需要显式的类型定义,变量类型是根据使用该变量的上下文决定的。

<?php
$a1=123;
$s=(string)$a1;
echo gettype($a1);
echo '<br>';
echo gettype($s);
?>
integer
string


2.4 PHP中的运算符


对于学过其他编程语言的读者,运算符应该不会陌生了。运算符可以用来处理数字、字符串及比较运算和逻辑运算等。在PHP中,运算符两侧的操作数会自动地进行类型转换,这在其他编程语言中并不多见。在PHP的编程中主要有3种类型的运算符。
(1)一元运算符,只运算一个值,例如!(取反运算符)或++(加一运算符)。
(2)二元运算符,PHP支持的大多数运算符都是这种,例如$a+$b。
(3)三元运算符,即?,用来根据一个表达式的结果在另两个表达式中选择一个,而不是用来在两个语句或者程序路线中选择。
PHP中的常用运算符有算术运算符、赋值运算符、比较运算符、三元运算符、错误抑制运算符、逻辑运算符、字符串运算符、数组运算符等。本节就主要介绍常用的运算符,以及运算符的优先级。
2.4.4 三元运算符
三元运算符是?:,三元运算符的功能和if...else语句很相似,语法如下:
(expr1)?(expr2):(expr3)
首先对expr1求值,若结果为True,则表达式(expr1)?(expr2):(expr3)的值为expr2,否则其值为expr3。

<?php
echo 1 ? 2: 3;
?>
2


2.4.5 错误抑制运算符
错误抑制运算符(@)可在任何表达式前使用,PHP支持错误抑制运算符@。当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略。@运算符只对表达式有效。
那么,何时使用此运算符呢?一个简单的规则就是,如果能从某处得到值,就能在它前面加上@运算符。例如,可以把它放在变量、函数和include()调用、常量等之前。不能把它放在函数或类的定义之前,也不能用于条件结构,例如if和foreach等。

<?php
$con=@ mysqli_connect('localhost','root','') or die ("Couldn't connect to");if($con) echo"成功";else echo"失败";
?>


2.4.7 字符串运算符
字符串运算符(String Operator)有两种。第一种是连接运算符(.),它返回其左右参数连接后的字符串。第二种是连接赋值运算符(.=),它将右边参数附加到左边的参数后。2.5 表单变量的使用

2.5 表单变量的使用(post、get)


在HTML中,表单拥有一个特殊功能:它们支持交互作用。除了表单之外,几乎所有的HTML元素都与设计及展示有关,只要愿意就可将内容传送给用户。另一方面,表单为用户提供了将信息传送回Web站点创建者和管理者的可能性。如果没有表单,那么Web就是一个静态的网页图片。对于PHP的动态网页开发,使用表单变量对象也是经常遇到的,通常主要有post()和get()两种方法,这和其他动态语言开发的命令是一样的,本节就介绍表单变量的使用方法。


2.5.1 POST表单
变量作为处理表单数据的方式之一,POST是系统的默认值,表示将数据表单的数据提交到“动作”属性设置的文件中进行处理。假设有一个HTML表单用method="post"的方式传递给本页一个name="test"的文字信息,可用3种格式的表单变量来显示这个表单变量,如图2-12所示。

<?php
Echo$test; //简短格式,需配置php.ini中的默认设置
echo$_POST["test"]; //中等格式,推荐使用这种方式
echo$HTTP_POST_VARS["test"]; //冗长格式
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>   
        <form action=" " method="post">
        <input type="text" name="test">
        <input type="submit" value="提交">
        </form>        <?php
        echo @$_POST["test"] or die('123');
        ?>
    </body>
</html>

2.5.2 GET表单变量


GET可以追加表单的值到URL并且发送服务器请求,对于数据量比较大的长表单,最好不要用这种数据处理方式。
假设有一个HTML表单用method="get"的方式传递给本页一个name="test"的文字信息,可用3种格式的表单变量来显示这个表单变量。

制作form.html网页并输入如下的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表单传递</title>
</head>
<body>
    <form action="welcome.php" action="get">
		用户:<input type="text" name="username">
		<br>
		年龄:<input type="text" name="age">
		<br>
		<input type="submit">
	</form>
</body>
</html>

再制作一个welcome.php代码页面,输入登录的代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>欢迎</title>
    </head>
    <body>           欢迎 <?php echo @$_GET['username'];?> 登陆,<br>
您的年龄是<?php echo @$_GET['age'];?>
    </body>
</html>

结果如图2-13所示,在浏览器地址栏里显示了表单变量传递的值。所以在发送密码或其他敏感信息时,不应该使用这个方法。但是,正因为变量显示在URL中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。HTTP GET方法不适合大型的变量值。它的值不能超过2000个字符。

2.5.3 字符串的连接

在PHP程序里要让多个字符串进行连接,要用到一个“点”号(.)

有一种情况,当echo后面使用的是双引号(")的话,可以达到和以上同样的效果:

$website="baidu";

echo"$website.com"

2.5.4 表单的验证
在PHP表单提交的时候需要对用户输入进行验证。验证的方法是,通过客户端脚本直接进行验证后再提交到服务器,这样操作会让浏览器验证速度更快,并且可以减轻服务器的负载。如果用户输入需要插入数据库,则应该考虑使用服务器验证。在服务器端验证表单的一种好的方式是,把表单传给页面自己,而不是跳转到不同的页面。这样用户就可以在同一个表单页面得到错误信息。用户也就更容易发现错误了。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>验证</title>		<style>
			.error{color: red;}
		</style>
	</head>	<body>
    <?php 
	$nameerror="";
	if(empty($_POST["test"]))
	$nameerror="账号名不能为空";
	else
	$nameerror="";
	?>
    		<form action=" " method="post">
		账号:<input type="text" name="test">
		<span class="error"><?php echo$nameerror ?><br/></span>
		
		密码:<input type="password" name="test1"><br/>
        <input type="submit" value="提交">
        </form>        <?php
		
		if(! empty($_POST["test"]))
		{
		echo "注册成功,您的账号为:";
        echo @$_POST["test"] or die('123');
	}
        ?>
	</body>
</html>

运行后直接提交,会在相关的字段后面显示错误提示文字,如图2-14所示。

这里对用户所有提交的数据都通过PHP的htmlspecialchars()函数进行验证。当用户提交表单时,可能输入的字符前面有空格或者换行,需要将提交的字符做以下处理。
(1)使用trim()函数去除用户输入数据中不必要的字符(如空格、tab、换行)。
(2)使用stripslashes()函数去除用户输入数据中的反斜杠(\)。
在执行以上脚本时,会通过$_SERVER["REQUEST_METHOD"]来检测表单是否被提交。如果REQUEST_METHOD是POST,表单将被提交,数据将被验证。如果表单未提交,则将跳过验证,并显示空白。

* <span> 是一个内联元素,没有实际意义,它的存在纯粹是为了应用样式,给一段内容加上 <span> 标记可以通过在 <span> 上定义样式来设定其内容的样式。
* <span> 与 <div> 元素很相似,但是 <div> 是一个块元素而 <span> 则是行内元素。
* <span> 通常用于以下场景:
* 将文本的一部分或者文档的一部分独立出来,从而对独立出来的内容设置单独的样式。
* 编组元素以达到某种样式意图(通过使用类或者 ID 属性),或者这些元素有着共同的属性,比如 lang。
* <span> 可以设置 ID 或 class 属性,以便增加语义,更方便地对元素应用样式。

第3章 PHP高级函数

在PHP高级编程应用里面,还需要掌握PHP的表达式。表达式是一个短语,能够执行一个动作,并具有返回值。PHP包括了1000多个函数,程序在完成一个功能时,可以把众多的程序写在一起,但这样容易引起混乱。另一种策略就是把总的功能分成小的功能模块,把每一个模块分别实现,在总的框架中根据需要把模块搭建在一起。实现程序模块化的策略就是使用函数,直观来说,函数就是代表一组语句的标识符,在使用函数时,外部调用者不需要关心函数的内部处理过程,只需要关心函数的输入和输出接口的应用即可。本章主要介绍PHP的表达式、函数的应用及一些常见的高级编程应用,通过学习这些内容,读者能精通PHP的常规应用。

第5章 PHP与MySQL联用编程

PHP之所以那么受欢迎,就是因为只要了解一些基本的语法和语言特色,就可以开始PHP编码之旅了。之后在编码过程中如果遇到了什么麻烦,还可以再去翻阅相关文档。PHP的语法类似于C、Perl、ASP或者JSP。对于那些对上述之一的语言较熟悉的人来说,只需要掌握PHP的核心语言特点即可。PHP可以编译成能与许多数据库连接的函数。PHP与MySQL是绝佳的组合。可以自己编写外围的函数间接存取数据库。通过这样的途径,当更换使用的数据库时,可以轻松地更改编码以适应这样的变化。本章就介绍一下PHP与MySQL联用必须掌握的一些基础知识,包括连接数据库、查询、插入、更新及分页等制作网页时常用的功能。

5.1.1 连接数据库mysqli_connect()


在能够访问并处理数据库中的数据之前,必须创建到达数据库的连接。在PHP中,这个任务通过MySQLi和PDO函数完成。

MySQLi和PDO的区别如下。

PDO应用在12种不同数据库中,MySQLi只针对MySQL数据库。所以,如果用户的项目需要在多种数据库中切换,建议使用PDO,这样只需要修改连接字符串和部分查询语句即可。使用MySQLi进行连接的话,如果使用不同的数据库,需要重新编写所有代码,包括查询。两者都是面向对象的,但MySQLi还提供了API接口。两者都支持预处理语句。预处理语句可以防止SQL注入,对Web项目的安全性是非常重要的。对于专业使用PHP+MySQL的最佳配合开发的网站,建议还是使用更有针对性的MySQLi连接方法。

下面是mysqli_connect()函数的语法格式:
mysqli_connect(servername,username,password,database);
在上述语法中涉及的参数说明如下。
●server:连接的服务器地址。
●username:连接数据库的用户名,默认值是服务器进程所有者的用户名。
●password:连接数据库的密码,默认值为空。
●database:连接的数据表名称。
mysqli_connect()函数如果成功执行,则返回一个MySQL连接标识,失败将返回False。
在下面的例子中,在一个变量中($conn)存放了在脚本中稍后使用的连接。如果连接失败,将执行die部分,需要在phpMyAdmin中预先创建一个数据库db_shop。

$conn=mysqli_connect('localhost','root','','test');
mysqli_close($conn);

脚本一结束,就会关闭连接。如需提前关闭连接,可使用mysqli_close()函数实现。在默认情况下,脚本执行完毕会自动断开与服务器的连接,但是使用mysqli_close()函数则可以在指定的位置来关闭连接以释放内存。

5.1.2 查询数据库mysqli_query()

SQL语句对大小写不敏感。INSERT INTO与insert into相同。为了让PHP执行该语句,必须使用mysqli_query()函数。该函数用于向MySQL连接发送查询命令。

mysqli_query($conn,"INSERT INTO `test`.`test1` (`id`, `name`, `age`) VALUES (12, '111', 111)");

mysqli_query($conn,"DELETE FROM `test`.`test1` WHERE `id` = 112");

mysqli_query($conn,"UPDATE `test`.`test1` SET `id` = 112 WHERE `id` = 111");

在PHP中,获取数据库中的一行可通过函数mysqli_fetch_array()来实现,该函数会将从结果集中获取的行放入一个数组中,并将其返回。

<!DOCTYPE html>
<html>
<head>
  <meta charset='utf-8'>
  <title>导出</title>
  </head>
  <body>
<?php  
$conn=mysqli_connect('localhost','root','');mysqli_select_db($conn,'test');$result=mysqli_query($conn,"select * from test1");
while($row = mysqli_fetch_array($result)){
    echo "$row[id] \t $row[name] \t $row[age] <br>";}?>
  </body>
  </html>

上面这个例子在$result变量中存放由mysqli_query()函数返回的数据。接下来,使用mysqli_fetch_array()函数以数组的形式从记录集返回第一行。随后对mysqli_fetch_array()函数的调用都会返回记录集中的下一行。while语句会循环记录集中的所有记录。为了输出每行的值,使用了PHP的$row变量($row['FirstName']和$row['LastName'])。

5.2 MySQLi函数应用

5.2.2 MySQLi扩展类功能表

 

 

 5.2.3 连接错误报告

在连接过程中难免会出现错误,应该及时让用户得到通知。在连接出错时,MySQLi对象并没有创建成功,所以不能调用MySQLi对象中的成员获取这些错误信息,要通过MySQLi扩展中的过程方式获取。

可使用mysqli_connect_errno()函数测试在建立连接的过程中是否发生错误,相关的出错消息由mysqli_connect_error()函数负责返回,如下实例代码所示:

5.3 PHP中MySQL的分页处理

5.3.2 创建数据库连接在Dreamweaver中创建一个conn.php网页

<?php $conn=mysqli_connect('localhost','root','','test');// 检查连接是否成功
if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
  }
  // 设置字符集
  mysqli_set_charset($conn, "utf8");?>

5.3.3 查询标题并分页

实现分页首先要确定每页显示的行数(可根据自己的实际需要确定每页显示多少条记录),将每页显示的行数设定成20,然后根据结果集中的总行数和每页显示的行数计算出总页数,根据当前页码和每页显示的行数计算出起始记录数。在查询语句中用limit根据起始记录和每页显示的行数来显示一段一段的记录,这样一个简单的分页就完成了,显示的效果如图5-9所示。

 

 

<?php 
require_once('conn.php');
?>
<!DOCTYPE html>
<html>
<head>
<style>
			.mytable {
	width: 90%;
	margin: 10px auto;
	border-collapse: collapse;
	height: 25px;
	line-height: 25px;
	text-align: center;
	border: 1px solid #ccc;
	background: #eee;
	font-weight: normal;
			}
  </style>  <meta charset='utf-8'>
  <title>分页查询</title>
  </head>
  <?php 
  if(empty($_GET['lookpage'])){
    $_GET['lookpage']=0;
}
$lookpage=$_GET['lookpage'] ;
  ?>
  <body>  <form method="get">
  页面:<input type="text1" name="lookpage"><input type="submit">
	</form>
查看页面:
<?php echo @$_GET['lookpage'].'<br>';?><?php  
$result = mysqli_query($conn,"SELECT COUNT(*) FROM test1");
$row = mysqli_fetch_row($result);
$count = $row[0];
// 当前页数
$ye=0;// 每页显示条数
$pageLine = 5;
// 计算总页数
$totalPages = ceil($count / $pageLine);
echo "本地有 $count 条公告";
?>
<table class='mytable'>
  <thead>
    <tr>
      <th>ID</th>
      <th>Name</th>
      <th>age</th>
    </tr>
  </thead>
  <tbody>
    <?php
        $result=mysqli_query($conn,"select * from test1 limit ".$lookpage * $pageLine." ,$pageLine");
        while($row = mysqli_fetch_assoc($result)) {
          echo "<tr>";
          echo "<td>" . $row["id"] . "</td>";
          echo "<td>" . $row["name"] . "</td>";
          echo "<td>" . $row["age"] . "</td>";
          echo "</tr>";
        }
      // 关闭连接
            mysqli_close($conn);
    ?>
  </tbody></table>
<?php   echo "现在是第$lookpage 页,共$totalPages 页"; ?>  </body>
  </html>

5.4 错误和异常处理

使用PHP+MySQL开发动态网站时,会遇到一些失误,如误输入字母、漏掉输入符号,或其他原因造成的错误。当然,用户如果不愿意或不遵循应用程序的约束,也会在使用时引起一些错误发生。PHP程序的错误发生一般归属于下列3个方面。

(1)语法错误。语法错误最常见,并且最容易修复。例如,遗漏了一个分号,就会显示错误信息。这类错误会阻止脚本执行。通常发生在程序开发时,可以通过错误报告进行修复,再重新运行。

(2)运行错误。这种错误一般不会阻止PHP脚本的运行,但是会阻止脚本做希望它所做的任何事情。例如,在调用header()函数前如果有字符输出,PHP通常会显示一条错误消息,虽然PHP脚本继续运行,但header()函数并没有执行成功。

(3)逻辑错误这种错误实际上是最麻烦的,不但不会阻止PHP脚本的执行,也不会显示出错误消息。例如,在if语句中判断两个变量的值是否相等,如果错把比较运算符号“==”写成赋值运算符号“=”就是一种逻辑错误,很难发现。

一个异常则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行。所以异常处理经常被当作程

当用户在访问时,看到显示的这些消息不仅会感到迷惑,而且还可能会过多地泄露有关服务器的信息,使服务器变得很不安全。所以在项目开发或测试期间启用此指令,可以根据不同的错误报告更好地调试程序。但出于安全性和美感的目的,让用户查看PHP的详细出错消息一般是不明智的,所以在网站投入使用时要将其禁用。

方法1:可以通过在配置文件php.ini中修改配置指令error_reporting的值,修改成功后重新启动Web服务器,则每个PHP脚本都可以按调整后的错误级别输出错误报告。下面是修改php.ini配置文件的示例,列出几种为error_reporting指令设置不同级别值的方式,可以将位运算符[&(与)、(或)、~(非)]和错误级别常量一起使用。
如下所示:
;可以抛出任何非注意的错误,默认值
error_reporting=E_ALL&~E_NOTICE
;只考虑致命的运行时错误、解析错误和核心错误
;error_reporting=E_ERROR E_PARSE E_CORE_ERROR
;报告除用户导致的错误之外的所有错误
;error_reporting=E_ALL&~(E_USER_ERROR E_USER_WARNING E_USER_NOTICE)
方法2:或者可以在PHP脚本中使用error_reporting()函数基于各个脚本来调整这种行为。这个函数用于确定PHP应该在特定的页面内报告哪些类型的错误。该函数获取一个数字或错误级别常量作为参数,如下所示。

5.4.2 错误日志
对于PHP开发者来说,一旦某个产品投入使用,应该立即将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?开发者可以在单独的文本文件中将错误报告作为日志记录。错误日志的记录,可以帮助开发人员或者管理人员查看系统是否存在问题。如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中将配置指令log_errors开启即可。错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。当然也可以记录错误日志到指定的文件中或发送给系统syslog,分别介绍如下。

5.4.3 异常处理
异常(Exception)处理用于在指定的错误发生时改变脚本的正常流程,是PHP中的一个新的重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。
1.异常处理实现
异常处理和编写程序的流程控制相似,所以也可以通过异常处理实现一种另类的条件选择结构。异常就是在程序运行过程中出现的一些意料之外的事件,如果不对此事件进行处理,则程序在执行时遇到异常将崩溃。处理异常需要在PHP脚本中使用
以下语句:
在PHP代码中所产生的异常可以被throw语句抛出,并被catch语句捕获。需要进行异常处理的代码都必须放入try代码块内,以便捕获可能存在的异常。每一个try至少要有一个与之对应的catch,也不能出现单独的catch,另外try和catch之间也不能有任何代码出现。一个异常处理的简单实例如下所示:

try{}
catch(){
    echo "error";
}

在上面的代码中,如果try代码块中出现某些错误,就可以执行一个抛出异常的操作。在某些编程语言中,例如Java,在出现异常时将自动抛出异常。而在PHP中,异常必须手动抛出。throw关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但必须给它传递一个对象作为值。在最简单的情况下,可以实例化一个内置的Exception类,就像以上代码所示那样。如果在try语句中有异常对象被抛出,则该代码块不会再向下执行,而是直接跳转到catch中执行,并传递给catch代码块一个对象,也可以理解为被catch代码块捕获的对象,其实就是导致异常被throw语句抛出的对象。在catch代码块中可以简单地输出一些异常的原因,也可以是try代码块中任务的另一个版本解决方案,此外,也可以在这个catch代码块中产生新的异常。最重要的是,在异常处理之后,程序不会崩溃,而会继续执行。

5.5 面向对象的开发


使用PHP进行网站建设的时候,经常会遇到面向对象的开发概念,本节就介绍一下面向对象和面向过程的区别。
5.5.1 面向对象的概念
编程语言大多支持甚至要求使用面向对象的方法。面向对象(Object Oriented,OO)的开发方法试图在系统中引入对象的分类、关系和属性,从而有助于程序开发和代码重用。

5.5.2 创建类、属性和操作

当创建一个PHP类的时候,必须使用关键词“class”。一个最小的、最简单的类定义如下所示:

class classname{
}

1.构造函数
大多数类都有一种称为构造函数的特殊操作。当创建一个对象时,它将调用构造函数,通常,这将执行一些有用的初始化任务,例如,设置属性的初始值或者创建该对象需要的其他对象。
构造函数的声明与其他操作的声明一样,只是其名称必须是__construct()。这是PHP 5以后版本的变化。在以前的版本中,构造函数的名称必须与类名称相同。为了向下兼容,如果一个类中没有名为__construct()的方法,那么PHP将搜索一个与类名称相同的方法。虽然人们可以手动地调用构造函数,但是其主要用途是在创建一个对象时自动调用的。如今,PHP 7已经支持函数重载,这就意味着可以提供多个具有相同名称及不同数量或类型的参数的函数。
2.析构函数
与构造函数相对的就是析构函数。析构函数也是PHP 5以上版本新添加的内容。它们允许在销毁一个类之前执行一些操作或完成一些功能。这些操作或功能通常在所有对该类的引用都被重置或超出作用域时自动发生。
与构造函数的名称类似,一个类的析构函数名称必须是__destruct()。析构函数不能带有任何参数。
3.类实例化
在声明一个类后,需要创建一个对象,也就是一个特定的个体,即类的一个成员,并使用这个对象。这也叫创建一个实例或实例化一个类。可以使用关键词new来创建一个对象。需要指定创建的对象是哪一个类的实例,并且通过构造函数提供任何所需的参数。
4.使用类的属性
在一个类中,可以访问一个特殊的指针——$this。如果当前类的一个属性为$atrribute,则当在该类中通过一个操作设置或访问该变量时,可以使用$this→atrribute来引用。
5.5.3 控制访问和类操作
PHP引入了访问修饰符。它们可以控制属性和方法的可见性。通常,它们放置在属性和方法声明之前。
1.private和public关键字
PHP支持如下3种访问修饰符。
(1)默认选项是public,这意味着如果没有为一个属性或方法指定访问修饰符,那么它将是public。公有的属性或方法可以在类的内部和外部进行访问。
(2)private访问修饰符意味着被标记的属性或方法只能在类的内部进行访问。如果没有使用__get()和__set()方法,则可能会对所有的属性都使用这个关键字。也可以使得部分方法成为私有的,例如,如果某些方法只是在类内部使用的工具性函数,则私有的属性和方法将不会被继承。
(3)protected访问修饰符意味着被标记的属性或方法只能在类内部进行访问。它也存在于任何子类。
2.类操作的调用
可以像调用其他函数一样调用类操作:通过使用类名称以及将所有所需的参数放置在括号中,因为这些操作属于一个对象而不是常规的函数,所以需要指定它们所属的对象。对象名称的使用方法与对象属性一样。

5.5.4 PHP中的继承
如果类是另一个类的子类,则可以用关键词extends来指明其继承关系。值得注意的是,继承是单方向的。子类可以从父类或超类继承特性,但父类却不能从子类继承特性。
1.通过继承使用private和protected访问修饰符控制可见性
可以使用private和protected访问修饰符来控制需要继承的内容。如果一个属性或方法被指定为private,则它将不能被继承。如果一个属性或方法被指定为protected,则它将在类外部不可见(就像一个private元素),但是可以被继承。
2.重载
在子类中,再次声明相同的属性和操作也是有效的,而且在有些情况下这将会是非常有用的。用户可能需要在子类中给某个属性赋予一个与其超类属性不同的默认值,或者给某个操作赋予一个与其超类操作不同的功能,这就叫重载。如果不使用替代定义,一个子类将继承超类的所有属性和操作。如果子类提供了替代定义,则替代定义将有优先级,并且重载初始定义。
3.使用final关键字禁止继承和重载
PHP引入了final关键字。当在一个函数声明前面使用这个关键字时,这个函数将不能在任何子类中被重载。也可以使用final关键字来禁止一个类被继承。
4.实现接口
PHP中引入了接口。接口可以看作是多重继承问题的解决方法,它类似于其他面向对象编程语言如Java所支持的接口实现。接口的思想是指定一个实现了该接口的类必须实现的一系列函数

5.5.5 面向对象和面向过程的区别

封装一个类:mysql_class.php

<?php 
 class mysql1{
var $conn;
var $result;
function  Connect($host,$username,$password,$database){
    $this->conn=mysqli_connect($host,$username,$password,$database);
}
function getrow(){
    $result = mysqli_query($this->conn,"SELECT COUNT(*) FROM test1");
    $row = mysqli_fetch_row($result);
    return $row[0];
}
function printall(){
    $result=mysqli_query($this->conn,"select * from test1");
    while($row = mysqli_fetch_array($result)){
    echo "$row[id] \t $row[name] \t $row[age] <br>";}
}
 }
?>

使用:
 

<!DOCTYPE html>
<html>
<head>
  <meta charset='utf-8'>
  <title></title>
  </head>
  <body>
<?php 
include_once("mysql_class.php");
$mysql=new mysql1;
$mysql->Connect('localhost','root','','test');
$row=$mysql->getrow();
echo '共'.$row.'条数据<br/>';
$mysql->printall();?>
  </body>
  </html>

点赞(2) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部