php复习总结
2022-04-29 22:23:55 14 举报
AI智能生成
php复习
作者其他创作
大纲/内容
初识php
认识web系统
程序如何进行
c应用
java应用
C/S系统
B/S系统
浏览端web技术
客户端
HTML
JavaScript
CSS
WebSocket
WebGL等
JavaScript
CSS
WebSocket
WebGL等
HTTP与静态页面
HTTP与静态页面
代码简单分析
<html>
<head>
<meta charset="utf-8"> //页面编号
<title>HTML Test</title> //浏览器显示的标题
</head>
<script>
function showMsg() {
alert('hello');
}
</script> //一个Javascript函数
<body>
<h1>Hello world</h1>
<a href="http://www.w3school.com.cn">This is a link</a>
<p></p> //链接
<img src="/notice.jpg" onclick="showMsg();"/>
<p></p> //图片,点击图片弹出窗口显示hello
<video width="640" height="480" controls="controls">
<source src="/media/movie.mp4" type="video/mp4" />
</video> //定义的视频
</body>
</html>
<head>
<meta charset="utf-8"> //页面编号
<title>HTML Test</title> //浏览器显示的标题
</head>
<script>
function showMsg() {
alert('hello');
}
</script> //一个Javascript函数
<body>
<h1>Hello world</h1>
<a href="http://www.w3school.com.cn">This is a link</a>
<p></p> //链接
<img src="/notice.jpg" onclick="showMsg();"/>
<p></p> //图片,点击图片弹出窗口显示hello
<video width="640" height="480" controls="controls">
<source src="/media/movie.mp4" type="video/mp4" />
</video> //定义的视频
</body>
</html>
子主题
url介绍
带域(域口+端口)的绝对路径
<a href='http://www.otherdomain.com/upload/12/windows.iso'> Windows ISO 下载</a>
<img src='http://www.picturestore.com/user/fff/desk.jpg'>
<img src='http://www.picturestore.com/user/fff/desk.jpg'>
不带域的绝对路径
<img src='/upload/12/3345.jpg'>
相对路径
<a href='iso/windows.iso'> Windows ISO 下载</a>
<img src='fff/desk.jpg'>
<img src='fff/desk.jpg'>
子主题
动态web网页
CGI
这种技术可以用任何的编程语言编写服务器端的程序,用于动态生成HTML文件。search.exe 对应的URL是 http://www.test.com/search.exe 就可以通过如同 http://www.test.com/search.exe?userid=1333 的方式来查询用户id为 1333 的用户的订单。
PHP
!!!php作为动态页面生成技术,运行在服务器端,因此浏览器永远只能得到php运行后的结果,不可能得到php的源代码。
配置PHP
网站的根:DOCUMENT_ROOT
只能把php文件放在网站根对应的目录中。网站根之外的文件http服务器一般是不能访问的,或者说对浏览器是不可见的
网站根不是在php.ini中配置,而是在http服务器中配置。根据http服务器的不同,配置文件也不同。
php基础
第一个PHP程序
<h1>这是第一个程序</h1>
<h1>
<?php
echo 'Hello world!';
?>
</h1> //echo类似于c语言的print
<h1>
<?php
echo 'Hello world!';
?>
</h1> //echo类似于c语言的print
浏览器通过浏览器访问php页面时得到的时php运行后的结果
php和html代码都混在一个文件里面,文件后缀是php
标签<?php...?>来标注php代码的部分
php运行时会至上而下解析,遇见非php代码按照原样返回给浏览器
遇到php代码部分,php代码打印结果会放在php代码所在位置
标签标注php代码
<h1>这是第二个程序</h1>
<?php
$str = 'Hello world!';
?>
<h1>
<?= $str ?>
</h1>
<?php
$str = 'Hello world!';
?>
<h1>
<?= $str ?>
</h1>
<?= $str?> 是另外一段php的标注,这是简单的标注打印方式,和 <?php echo $str ?> 效果相同,但是更简单
一个PHP文件可以间隔穿插多个HTML代码和PHP代码,只需要使用标签说明那些是PHP代码
PHP缓冲区
因为PHP可以写HTTP协议的Head部分和Payload部分,而返回的HTML代码部分是在Payload部分当中的。因此有些写head缓冲区的函数必须放在HTML输出之前,例如 header 函数,set_cookie 函数等。
PHP语言特性
PHP没有一个编译成可执行文件(如EXE文件)的过程。PHP的源代码被PHP解析器直接运行,程序一行行按顺序运行。
PHP是动态语言(相对静态语言而言)。和静态语言C比较,PHP是若类型语言,变量声明可以不指定类型,变量的类型在运行的时候根据赋值的类型确定;同时PHP没有类是C的内存管理机制,不用关心内存回收的问题;PHP最有用的数据结构,数组,容量是可变的。
PHP程序的生命周期
一个php文件(程序)在收到request的时候被载入到内存中开始执行,一直到response后结束运行,被从内存中销毁,这就是PHP程序的生命周期。
当多次请求统一PHP程序的时候,每一次都是一个独立的运行,其中的变量会在每一次执行后销毁
要在一次请求后保持一些变量的值
子主题
把需要保存的变量进行持久化处理,例如存入到数据库,或者是写入文件
使用 Session 保存这些变量,有过期时间
使用cookie 保存这些变量,有过期时间
变量与常量
变量
$+变量名
变量名区分大小写
变量声明也可以不用指定类型,与c和Java不同
数据类型
标量类型
bool(布尔型)
int(整型)
float(浮点型,也称作double)
string(字符串)
复合类型
array(数组)
object(对象)
callable(可调用)不掌握
iterable(可迭代)不掌握
特殊类型
resource(资源)
NULL(无类型)
变量的变量
<?php
$a = 'hello';
$$a = 'world';
?>
$a = 'hello';
$$a = 'world';
?>
引用赋值
<?php
$string1 = "mingribook"; //声明变量$string1
$string2 = $string1; //使用$string1来初始化$string2
$string1 = "mrbccd"; //改变变量$string1的值
echo $string2; //输出变量$string2的值
$string1 = "mingribook"; //声明变量$string1
$string2 = $string1; //使用$string1来初始化$string2
$string1 = "mrbccd"; //改变变量$string1的值
echo $string2; //输出变量$string2的值
变量作用域
全局与局部变量
<?php
$example = "在…………函数外"; //声明全局变量
function example()
{
$example = "……在函数内……"; //声明局部变量
echo "在函数内输出的内容是:$example.<br>"; //输出局部变量
}
example(); //调用函数,输出变量值
echo "在函数外输出的内容是:$example.<br>"; //输出全局变量
$example = "在…………函数外"; //声明全局变量
function example()
{
$example = "……在函数内……"; //声明局部变量
echo "在函数内输出的内容是:$example.<br>"; //输出局部变量
}
example(); //调用函数,输出变量值
echo "在函数外输出的内容是:$example.<br>"; //输出全局变量
这里两个 $example 变量,一个在函数外部(全局变量),一个在函数内部(局部变量),其实是两个不同的变量,虽然名字相同。
<?php
$hr = "黄蓉"; //声明全局变量$hr
function lxt()
{
$gj = "郭靖"; //声明局部变量$gj
echo $gj . "<br>"; //输出局部变量的值
global $hr; //利用关键字global在函数内部定义全局变量
echo $hr . "<br>"; //输出全局变量的值
}
lxt();
$hr = "黄蓉"; //声明全局变量$hr
function lxt()
{
$gj = "郭靖"; //声明局部变量$gj
echo $gj . "<br>"; //输出局部变量的值
global $hr; //利用关键字global在函数内部定义全局变量
echo $hr . "<br>"; //输出全局变量的值
}
lxt();
全局变量的说明:全局变量可以在程序中的任何地方访问,但是在用户自定义函数内部是不可用的。想在用户自定义函数内部使用全局变量,要使用global关键字声明。
在函数内部声明全局变量的时候,不能同时对变量赋值,需要先申明,再赋值。
静态变量
静态变量的应用:在博客中使用静态变量记录浏览者的人数,每一次用户访问和离开时,都能够保留目前浏览者的人数。在聊天室中也可以用静态变量来记录用户的聊天内容。
可以把函数的静态变量作为全局变量来理解,只不过只能在函数内部是可见的。
检查与摧毁变量
isset 函数:判断一个变量是否已设置, 即变量已被声明,且其值不为 null。
unset 函数:销毁指定的变量
判断变量类型
is_array — 检测变量是否是数组
is_bool — 检测变量是否是布尔值
is_double — is_float 的别名
is_float — 检测变量是否是浮点型
is_int — 检测变量是否是整数
is_integer — is_int 的别名
is_long — is_int 的别名
is_null — 检测变量是否为 null
is_numeric — 检测变量是否为数字或数字字符串
is_object — 检测变量是否是一个对象
is_real — is_float 的别名
is_string — 检测变量是否是字符串
is_bool — 检测变量是否是布尔值
is_double — is_float 的别名
is_float — 检测变量是否是浮点型
is_int — 检测变量是否是整数
is_integer — is_int 的别名
is_long — is_int 的别名
is_null — 检测变量是否为 null
is_numeric — 检测变量是否为数字或数字字符串
is_object — 检测变量是否是一个对象
is_real — is_float 的别名
is_string — 检测变量是否是字符串
自动类型转换
<?php
$foo = "1"; // $foo 是字符串 (ASCII 49)
$foo *= 2; // $foo 现在是一个整数 (2)
$foo = $foo * 1.3; // $foo 现在是一个浮点数 (2.6)
$foo = 5 * "10 Little Piggies"; // $foo 是整数 (50)
$foo = 5 * "10 Small Pigs"; // $foo 是整数 (50)
?>
$foo = "1"; // $foo 是字符串 (ASCII 49)
$foo *= 2; // $foo 现在是一个整数 (2)
$foo = $foo * 1.3; // $foo 现在是一个浮点数 (2.6)
$foo = 5 * "10 Little Piggies"; // $foo 是整数 (50)
$foo = 5 * "10 Small Pigs"; // $foo 是整数 (50)
?>
强制类型转换
(int), (integer) - 转换为整形 int
(bool), (boolean) - 转换为布尔类型 bool
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(unset) - 转换为 NULL
(bool), (boolean) - 转换为布尔类型 bool
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(unset) - 转换为 NULL
在要转换的变量之前加上用括号括起来的目标类型。
<
<
布尔值
当转换为 bool 时,以下值被认为是 false:
布尔值 false 本身
整型值 0(零)
浮点型值 0.0(零)-0.0(零)
空字符串,以及字符串 “0”
不包括任何元素的数组
特殊类型 NULL(包括尚未赋值的变量)
由无属性的空元素创建 SimpleXML 对象,也就是既没有子节点也没有属性的元素。
布尔值 false 本身
整型值 0(零)
浮点型值 0.0(零)-0.0(零)
空字符串,以及字符串 “0”
不包括任何元素的数组
特殊类型 NULL(包括尚未赋值的变量)
由无属性的空元素创建 SimpleXML 对象,也就是既没有子节点也没有属性的元素。
所有其它值都被认为是 true(包括任何资源 和 NAN)。
预定义变量
__GET[ ]
__POST[ ]
__COOKIE[ ]
__SESSION[ ]
__FILES[ ]
上述的变量全部都是以数组的方式访问的
__POST[ ]
__COOKIE[ ]
__SESSION[ ]
__FILES[ ]
上述的变量全部都是以数组的方式访问的
常量
使用 const 关键字定义常量时,只能包含标量数据(bool、int、float 、string)。可以将常量定义为一个表达式,也可以定义为一个 array。
如果常量名是动态的,也可以用函数 constant() 来获取常量的值。用 get_defined_constants() 可以获得所有已定义的常量列表。
常量前面没有美元符号($);
常量可以不用理会变量的作用域而在任何地方定义和访问;
常量一旦定义就不能被重新定义或者取消定义;
常量只能计算标量值或数组。不掌握
常量可以不用理会变量的作用域而在任何地方定义和访问;
常量一旦定义就不能被重新定义或者取消定义;
常量只能计算标量值或数组。不掌握
在面向过程中,定义常量使用 define() 函数,在类中使用 const 关键字定义。
预定义常量
TRUE
FALSE
NULL
FALSE
NULL
魔术常量
__LINE__ 文件中的当前行号。
__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
字符串
单引号字符串
<?php
echo 'this is a simple string';
// 可以录入多行
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 输出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 输出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// 输出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// 输出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// 输出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
echo 'this is a simple string';
// 可以录入多行
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 输出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 输出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// 输出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// 输出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// 输出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。
要表达一个反斜线自身,则用两个反斜线(\\)。
其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想
使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。
要表达一个反斜线自身,则用两个反斜线(\\)。
其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想
使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。
在单引号字符串中的变量和特殊字符的转义序列将不会被替换。
双引号字符串
如果字符串是包围在双引号(“)中, PHP 将对特殊的字符进行解析
字符串连接
字符串可以用 '.'(点)运算符连接起来,注意 '+'(加号)运算符没有这个功能。更多信息参考字符串运算符。
<?php
echo "00123.13"+"3445AB";
echo "00123.13"+"3445AB";
结果为:3568.13
+为运算加法
字符串可以直接参与任何类型数值计算,php会自动先把字符串转换成合适的数值类型。
其他字符串操作函数
去掉字符串首尾的特殊字符:trim ltrim rtrim 函数,P83
转义、还原字符串数据:主要掌握 addslashes函数 P84
字符串长度:strlen 函数 P87
截取字符串:substr 函数 P89
格式化字符串格式化字符串:string_number_format 函数 P97
分割字符串:explode() 函数 P98
合成字符串:implode 函数 P99
转义、还原字符串数据:主要掌握 addslashes函数 P84
字符串长度:strlen 函数 P87
截取字符串:substr 函数 P89
格式化字符串格式化字符串:string_number_format 函数 P97
分割字符串:explode() 函数 P98
合成字符串:implode 函数 P99
数组
array()
array(
key => value,
key2 => value2,
key3 => value3,
...
)
key => value,
key2 => value2,
key3 => value3,
...
)
短数组语法对比
可以用短数组语法 [] 替代 array() 。
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// 使用短数组语法
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// 使用短数组语法
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
<?php
$array = array(
1 => 'a',
'1' => 'b', // 值 "a" 会被 "b" 覆盖
1.5 => 'c', // 值 "b" 会被 "c" 覆盖
-1 => 'd',
'01' => 'e', // 由于这不是整数字符串,因此不会覆盖键名 1
'1.5' => 'f', // 由于这不是整数字符串,因此不会覆盖键名 1
true => 'g', // 值 "c" 会被 "g" 覆盖
false => 'h',
'' => 'i',
null => 'j', // 值 "i" 会被 "j" 覆盖
'k', // 值 “k” 的键名被分配为 2。这是因为之前最大的整数键是 1
2 => 'l', // 值 "k" 会被 "l" 覆盖
);
var_dump($array);
?>
$array = array(
1 => 'a',
'1' => 'b', // 值 "a" 会被 "b" 覆盖
1.5 => 'c', // 值 "b" 会被 "c" 覆盖
-1 => 'd',
'01' => 'e', // 由于这不是整数字符串,因此不会覆盖键名 1
'1.5' => 'f', // 由于这不是整数字符串,因此不会覆盖键名 1
true => 'g', // 值 "c" 会被 "g" 覆盖
false => 'h',
'' => 'i',
null => 'j', // 值 "i" 会被 "j" 覆盖
'k', // 值 “k” 的键名被分配为 2。这是因为之前最大的整数键是 1
2 => 'l', // 值 "k" 会被 "l" 覆盖
);
var_dump($array);
?>
输出:
array(7) {
[1]=>
string(1) "g"
[-1]=>
string(1) "d"
["01"]=>
string(1) "e"
["1.5"]=>
string(1) "f"
[0]=>
string(1) "h"
[""]=>
string(1) "j"
[2]=>
string(1) "l"
}
array(7) {
[1]=>
string(1) "g"
[-1]=>
string(1) "d"
["01"]=>
string(1) "e"
["1.5"]=>
string(1) "f"
[0]=>
string(1) "h"
[""]=>
string(1) "j"
[2]=>
string(1) "l"
}
如果在数组定义时多个元素都使用相同键名,
那么只有最后一个会被使用,
其它的元素都会被覆盖。
那么只有最后一个会被使用,
其它的元素都会被覆盖。
PHP 数组可以同时含有 int 和 string 类型的键名,
因为 PHP 实际并不区分索引数组和关联数组。
因为 PHP 实际并不区分索引数组和关联数组。
数组单元可以通过 array[key] 语法来访问
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
结果:
string(3) "bar"
int(24)
string(3) "foo"
string(3) "bar"
int(24)
string(3) "foo"
用方括号的语法修改/新建
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 这与 $arr[13] = 56 相同;
// 在脚本的这一点上
$arr["x"] = 42; // 添加一个新元素
// 键名使用 "x"
unset($arr[5]); // 从数组中删除元素
unset($arr); // 删除整个数组
?>
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 这与 $arr[13] = 56 相同;
// 在脚本的这一点上
$arr["x"] = 42; // 添加一个新元素
// 键名使用 "x"
unset($arr[5]); // 从数组中删除元素
unset($arr); // 删除整个数组
?>
如上所述,如果给出方括号但没有指定键名,
则取当前最大 int 索引值,
新的键名将是该值加上 1(但是最小为 0)。
如果当前还没有 int 索引,则键名将为 0 。
则取当前最大 int 索引值,
新的键名将是该值加上 1(但是最小为 0)。
如果当前还没有 int 索引,则键名将为 0 。
数组操作函数
统计数组元素个数:P126
查询数组中指定元素:P127
获取数组中最后一个元素(数组堆栈使用):P128
向数组中添加元素(数组堆栈使用):P129
删除数组中重复元素:P129
查询数组中指定元素:P127
获取数组中最后一个元素(数组堆栈使用):P128
向数组中添加元素(数组堆栈使用):P129
删除数组中重复元素:P129
函数
PHP函数没有返回类型的说明,即使是没有返回也不能用void进行说明;
一个函数可以使用return返回,也可以不使用return返回;
函数可以返回任意类型的数据,同一函数因为条件不同,返回的类型可以不一致;
函数可以有缺省参数;
函数可以有值传递和引用传递,引用传递类似C的传指针;
变量函数是PHP的一个特点,可以使用类似变量的变量方式访问函数。
一个函数可以使用return返回,也可以不使用return返回;
函数可以返回任意类型的数据,同一函数因为条件不同,返回的类型可以不一致;
函数可以有缺省参数;
函数可以有值传递和引用传递,引用传递类似C的传指针;
变量函数是PHP的一个特点,可以使用类似变量的变量方式访问函数。
php与页面交互
GET与POST方法
与FORM交互
文件上传与读写
文件上传
<form enctype="multipart/form-data" action="" method="POST">
选择上传文件 <input name="userfile" type="file" />
<input type="submit" value="上传" /> //提交按钮
</form>
<pre>
<?php
if (@$_FILES['userfile'] && @$_FILES['userfile']['error'] == 0) {
move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name']);
echo "上传成功!\n\n\n";
print_r($_FILES); //解析文件
}
?>
</pre>
选择上传文件 <input name="userfile" type="file" />
<input type="submit" value="上传" /> //提交按钮
</form>
<pre>
<?php
if (@$_FILES['userfile'] && @$_FILES['userfile']['error'] == 0) {
move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name']);
echo "上传成功!\n\n\n";
print_r($_FILES); //解析文件
}
?>
</pre>
1
上传文件使用一个form,上传控件使用 type 为 file 的input 控件,当然,我们还需要一个提交按钮
注意form中 enctype 这个属性是必须的
action 为空表示上传的URL就是当前页面的URL
上传一个文件后,所有form内的控件内容会通过post方法提交到url指定的页面;
PHP的超级变量$_FILES 中有所有上传文件的内容,我们通过print_r看看这个数组中有什么
$FILES数组
$_FILES 数组是一个二维数组,包含了上传文件的所有信息
其中[userfile]是一个文件信息的一维数组,
对应的名称是HTML中设置的上传控件
对应的名称是HTML中设置的上传控件
name:上传文件的原始文件名
type表示上传文件的类型,这个类型是一个MIME表述字符串
tmp_name是上传文件的临时文件,这个位置一般在php.ini文件中设置,或者使用操作系统的临时文件目录;
error表示上传是否有错误,没有错误是0;
size是上传文件的大小
move_uploaded_file
把上传的临时文件移动到相应的位置,同时需要对文件名改名
因为临时文件是不需要有扩展名的,而最后保存最好加上文件名。如果上传的文件需要长久的保存,使用 move_uploaded_file 函数是必须的,因为临时文件会被系统定期清理
两个参数
参数1:临时文件的绝路路径,这里使用 $_FILES['userfile']['tmp_name'] 就可以得到
参数2:要移动到的目标位置和文件名:例子中我们使用了文件的原始文件名 $_FILES['userfile']['name'] 没有加路径。这是一个相对路径表达方式,意思是和当前php文件在一个路径下。当然你也可以使用其他路径,并改变文件名
使用文件的原始文件名并不是个好注意。因为如果新上传的文件和以前的文件同名,可能会覆盖以前的文件。所以可以考虑使用一个唯一的文件名来存放。
使用绝对路径,但是同样不是一个好注意,会给你程序的交付带来麻烦。例如你的程序需要安装到另外一台服务器,绝对路径可能和现有服务器有很大差别。
如何生成唯一的文件名?有很多方式,可以使用时间,或者是一个叫做 uniqid 的函数。另外,需要获取上传文件的扩展名有很多方法,扩展名前面是‘.’可以使用 explode 来把文件名字符串拆分成数组,数组的最后一个元素就是扩展名。
文件读写
file函数
<pre>
<?php
$lines = file('file.txt');
print_r($lines);
?>
</pre>
<?php
$lines = file('file.txt');
print_r($lines);
?>
</pre>
读取一个文本文件到数组
读取并显示csv文件
<?php
// 读取csv到一个数组
$lines = file('list.csv');
// 生成二维数组
$csv = array();
foreach ($lines as $line) {
$csv[] = explode(',', $line);
}
?>
<table border="1">
<?php
foreach ($csv as $cols) {
?>
<tr>
<?php
foreach ($cols as $col) {
?>
<td>
<?= $col ?>
</td>
<?php
}
?>
</tr>
<?php
}
?>
</table>
// 读取csv到一个数组
$lines = file('list.csv');
// 生成二维数组
$csv = array();
foreach ($lines as $line) {
$csv[] = explode(',', $line);
}
?>
<table border="1">
<?php
foreach ($csv as $cols) {
?>
<tr>
<?php
foreach ($cols as $col) {
?>
<td>
<?= $col ?>
</td>
<?php
}
?>
</tr>
<?php
}
?>
</table>
两个嵌套循环的写法,循环中又有HTML代码,又有PHP代码
json格式
JSON是一种轻量级的数据交换格式
通过浏览器提交一个留言,在 msg 目录中得到一个Json文件
{
"user": "Danny",
"sex": "\u7537",
"email": "127@mail.com",
"edu": "\u672c\u79d1",
"hobby": [
"\u7535\u8111"
],
"msg": "\u8fd9\u662f\u6211\u7684\u7b2c\u4e00\u4e2a\u7559\u8a00"
}
"user": "Danny",
"sex": "\u7537",
"email": "127@mail.com",
"edu": "\u672c\u79d1",
"hobby": [
"\u7535\u8111"
],
"msg": "\u8fd9\u662f\u6211\u7684\u7b2c\u4e00\u4e2a\u7559\u8a00"
}
读取JSON文件
<pre>
<?php
$msgDir = 'msg';
$fileList = scandir($msgDir);
$i = 1;
foreach ($fileList as $fname) {
$fileName = $msgDir . '/' . $fname; // 文件的相对路径+文件名
if (is_dir($fileName)) continue; // 判断文件是不是目录
if (substr($fname, -4) != 'json') continue; // 判断文件后缀名
$jsonStr = file_get_contents($fileName);
$msg = json_decode($jsonStr);
echo "------------------第 $i 个留言---------------------\n";
print_r($msg);
$i++;
}
?>
</pre>
<?php
$msgDir = 'msg';
$fileList = scandir($msgDir);
$i = 1;
foreach ($fileList as $fname) {
$fileName = $msgDir . '/' . $fname; // 文件的相对路径+文件名
if (is_dir($fileName)) continue; // 判断文件是不是目录
if (substr($fname, -4) != 'json') continue; // 判断文件后缀名
$jsonStr = file_get_contents($fileName);
$msg = json_decode($jsonStr);
echo "------------------第 $i 个留言---------------------\n";
print_r($msg);
$i++;
}
?>
</pre>
json_decode 返回的数据类型不是array,而是stdClass Object(一个对象)。你不能像使用数组一样使用对象,例如:$msg['user']是不正确的,应该换成 $msg→user 来取值;
如果要解码成数组,使用 json_decode($jsonStr, true)
Cookie与Session
HTTP的非保持连接状态
Cookie
<!-- 如何保存用户的状态 -->
<?php
if (@$_POST['user']){
setcookie("user", $_POST['user']);
setcookie('pwd', $_POST['pwd']);
}
?>
<form name="form1" method="post">
<table width="323" border="1" cellpadding="1" cellspacing="1" bordercolor="#66CC33" bgcolor="#FFFFFF">
<tr>
<td width="118" height="24" align="right" bgcolor="#CCFF33">用户名:</td>
<td width="192" height="24" bgcolor="#CCFF33"><input name="user" type="text" class="inputcss" id="user" size="24"></td>
</tr>
<tr>
<td height="24" align="right" bgcolor="#CCFF33">密 码:</td>
<td height="24" bgcolor="#CCFF33"><input name="pwd" type="password" class="inputcss" id="pwd" size="24"></td>
</tr>
<tr align="center" bgcolor="#CCFF33">
<td height="24" colspan="2"><input name="submit" type="submit" value="登录"></td>
</tr>
</table>
</form>
<pre>
<?php
print_r($_COOKIE);
?>
</pre>
<?php
if (@$_POST['user']){
setcookie("user", $_POST['user']);
setcookie('pwd', $_POST['pwd']);
}
?>
<form name="form1" method="post">
<table width="323" border="1" cellpadding="1" cellspacing="1" bordercolor="#66CC33" bgcolor="#FFFFFF">
<tr>
<td width="118" height="24" align="right" bgcolor="#CCFF33">用户名:</td>
<td width="192" height="24" bgcolor="#CCFF33"><input name="user" type="text" class="inputcss" id="user" size="24"></td>
</tr>
<tr>
<td height="24" align="right" bgcolor="#CCFF33">密 码:</td>
<td height="24" bgcolor="#CCFF33"><input name="pwd" type="password" class="inputcss" id="pwd" size="24"></td>
</tr>
<tr align="center" bgcolor="#CCFF33">
<td height="24" colspan="2"><input name="submit" type="submit" value="登录"></td>
</tr>
</table>
</form>
<pre>
<?php
print_r($_COOKIE);
?>
</pre>
使用GET请求
使用POST方法发送用户名和密码给服务器。这时,4、5行代码执行
user
pwd
使用GET方法访问
两种基本属性
域
路径
时效性
有效期是cookie可以存活到将来的一个时间,如果超过这个时间,cookie就会被浏览器删除。这种机制进一步保证安全性,例如有些网站,如果你停止刷新,过了一段时间再访问就需要重新鉴权。
可以通过cooke来存放用户名和密码
Session
时效性
这个时间在php.ini中进行设置。
时间一到,session就会从服务器删除。
session的好处就是关键信息保存在服务器,进一步提升了安全性。
时间一到,session就会从服务器删除。
session的好处就是关键信息保存在服务器,进一步提升了安全性。
在PHP种使用session
<?php
session_start();
if (@$_POST['user']) {
$_SESSION['user'] = $_POST['user'];
$_SESSION['pass'] = $_POST['pwd'];
}
?>
session_start();
if (@$_POST['user']) {
$_SESSION['user'] = $_POST['user'];
$_SESSION['pass'] = $_POST['pwd'];
}
?>
鉴别客户的页面第一行用 session_start()
使用Session
用户登录
<?php
@session_start();
if (!$_SESSION['uid']){
header('Location:login.php');
}
?>
@session_start();
if (!$_SESSION['uid']){
header('Location:login.php');
}
?>
使用 session_start 函数开启session,然后你就可以对session进行读写操作了
检测seesion中是否有键名为uid的值
如果uid这个值没有,那么使用 header 函数生成一个http头的重定向url。当浏览器读取到这个重定向后,立即刷新到重定向指定的url(通过get方法),这里就是登陆页面 login.php。跳转中的url是一个相对路径
header函数必须在任何HTML输出前使用
登录用户才能访问的网站
<?php
include_once('_protected.php');
?>
<h1>这里是需要登陆才能访问的页面</h1>
<h2>欢迎你:<?= $_SESSION['name'] ?></h2>
<h2>你的用户ID是:<?= $_SESSION['uid'] ?></h2>
<a href="_doLogout.php">退出登陆--注销</a>
include_once('_protected.php');
?>
<h1>这里是需要登陆才能访问的页面</h1>
<h2>欢迎你:<?= $_SESSION['name'] ?></h2>
<h2>你的用户ID是:<?= $_SESSION['uid'] ?></h2>
<a href="_doLogout.php">退出登陆--注销</a>
include_once 函数包含了 _protected.php 文件进来。
如果未登录 _protected.php 检测 $_SESSION[uid] 为假,会重新定向到 login.php 页面
如果登录了,就显示 Session 的用户信息
退出用户界面
<?php
session_start();
session_destroy();
header('Location:login.php');
?>
session_start();
session_destroy();
header('Location:login.php');
?>
直接使用 session_destroy 函数销毁 session ,并重定向到 login.php 页面
已经登录通过url进入
<?php
session_start();
if ($_SESSION['uid']){
header('Location:user.php');
}
?>
session_start();
if ($_SESSION['uid']){
header('Location:user.php');
}
?>
面向对象编程
类的定义与使用
<?php
class SportObject
{
public $name; //定义成员变量
public $height; //定义成员变量
public $avoirdupois; //定义成员变量
public function bootFootBall($name, $height, $avoirdupois)
{ //声明成员方法
$this->name = $name;
$this->height = $height;
$this->avoirdupois = $avoirdupois;
if ($this->height < 185 and $this->avoirdupois < 85) {
return $this->name . ",符合踢足球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合踢足球的要求!"; //方法实现的功能
}
}
}
$sport = new SportObject(); //实例化类,并传递参数
echo $sport->bootFootBall('明日', '185', '80'); //执行类中的方法
?>
class SportObject
{
public $name; //定义成员变量
public $height; //定义成员变量
public $avoirdupois; //定义成员变量
public function bootFootBall($name, $height, $avoirdupois)
{ //声明成员方法
$this->name = $name;
$this->height = $height;
$this->avoirdupois = $avoirdupois;
if ($this->height < 185 and $this->avoirdupois < 85) {
return $this->name . ",符合踢足球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合踢足球的要求!"; //方法实现的功能
}
}
}
$sport = new SportObject(); //实例化类,并传递参数
echo $sport->bootFootBall('明日', '185', '80'); //执行类中的方法
?>
$this→name 这个整体表示一个成员变量,不能写成 $this→$this。
如果在当前的代码块中,不存在和成员变量同名的局部变量,那么 $this 是可以省略的
类中的常量
<?php
class SportObject
{
const BOOK_TYPE = '计算机图书';
public $object_name; //图书名称
function setObjectName($name)
{ //声明方法setObjectName()
$this->object_name = $name; //设置成员变量值
}
function getObjectName()
{ //声明方法getObjectName()
return $this->object_name;
}
}
$c_book = new SportObject(); //实例化对象
$c_book->setObjectName("PHP类"); //调用方法setObjectName
echo SportObject::BOOK_TYPE . "->"; //输出常量BOOK_TYPE
echo $c_book->getObjectName(); //调用方法getObjectName
class SportObject
{
const BOOK_TYPE = '计算机图书';
public $object_name; //图书名称
function setObjectName($name)
{ //声明方法setObjectName()
$this->object_name = $name; //设置成员变量值
}
function getObjectName()
{ //声明方法getObjectName()
return $this->object_name;
}
}
$c_book = new SportObject(); //实例化对象
$c_book->setObjectName("PHP类"); //调用方法setObjectName
echo SportObject::BOOK_TYPE . "->"; //输出常量BOOK_TYPE
echo $c_book->getObjectName(); //调用方法getObjectName
类中的常量定义和普通常量(非类常量)的定义是不一样的
常量的调用使用 类名::常量名;这个语法结构需要注意,类名前面没有$的符号,因为类本身不是一个实体,而是一个抽象的定义
构造函数
<?php
class SportObject
{
public $name; //定义成员变量
public $height; //定义成员变量
public $avoirdupois; //定义成员变量
public $age; //定义成员变量
public $sex; //定义成员变量
public function __construct($name, $height, $avoirdupois, $age, $sex)
{ //定义构造方法
$this->name = $name; //为成员变量赋值
$this->height = $height; //为成员变量赋值
$this->avoirdupois = $avoirdupois; //为成员变量赋值
$this->age = $age; //为成员变量赋值
$this->sex = $sex; //为成员变量赋值
}
public function bootFootBall()
{ //声明成员方法
if ($this->height < 185 and $this->avoirdupois < 85) {
return $this->name . ",符合踢足球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合踢足球的要求!"; //方法实现的功能
}
}
}
$sport = new SportObject('明日', '185', '80', '20', '男'); //实例化类,并传递参数
echo $sport->bootFootBall(); //执行类中的方法
class SportObject
{
public $name; //定义成员变量
public $height; //定义成员变量
public $avoirdupois; //定义成员变量
public $age; //定义成员变量
public $sex; //定义成员变量
public function __construct($name, $height, $avoirdupois, $age, $sex)
{ //定义构造方法
$this->name = $name; //为成员变量赋值
$this->height = $height; //为成员变量赋值
$this->avoirdupois = $avoirdupois; //为成员变量赋值
$this->age = $age; //为成员变量赋值
$this->sex = $sex; //为成员变量赋值
}
public function bootFootBall()
{ //声明成员方法
if ($this->height < 185 and $this->avoirdupois < 85) {
return $this->name . ",符合踢足球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合踢足球的要求!"; //方法实现的功能
}
}
}
$sport = new SportObject('明日', '185', '80', '20', '男'); //实例化类,并传递参数
echo $sport->bootFootBall(); //执行类中的方法
构造函数和普通函数一样,可以有缺省参数
老版本的PHP可以使用与类名相同的函数名来作为构造函数(类似Java的方式),新版本的PHP已经不推荐,并有可能出现一些问题
析构函数
析构的含义是在对象被销毁前调用的最后一个函数,用于进行一些善后处理
<?php
class SportObject
{
public $name; //定义成员变量
public $height; //定义成员变量
public $avoirdupois; //定义成员变量
public $age; //定义成员变量
public $sex; //定义成员变量
public function __construct($name, $height, $avoirdupois, $age, $sex)
{ //定义构造方法
$this->name = $name; //为成员变量赋值
$this->height = $height; //为成员变量赋值
$this->avoirdupois = $avoirdupois; //为成员变量赋值
$this->age = $age; //为成员变量赋值
$this->sex = $sex; //为成员变量赋值
}
public function bootFootBall()
{ //声明成员方法
if ($this->height < 185 and $this->avoirdupois < 85) {
return $this->name . ",符合踢足球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合踢足球的要求!"; //方法实现的功能
}
}
function __destruct()
{
echo "<p><b>对象被销毁,调用析构函数。</b></p>";
}
}
$sport = new SportObject('明日', '185', '80', '20', '男'); //实例化类,并传递参数
//unset($sport);
class SportObject
{
public $name; //定义成员变量
public $height; //定义成员变量
public $avoirdupois; //定义成员变量
public $age; //定义成员变量
public $sex; //定义成员变量
public function __construct($name, $height, $avoirdupois, $age, $sex)
{ //定义构造方法
$this->name = $name; //为成员变量赋值
$this->height = $height; //为成员变量赋值
$this->avoirdupois = $avoirdupois; //为成员变量赋值
$this->age = $age; //为成员变量赋值
$this->sex = $sex; //为成员变量赋值
}
public function bootFootBall()
{ //声明成员方法
if ($this->height < 185 and $this->avoirdupois < 85) {
return $this->name . ",符合踢足球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合踢足球的要求!"; //方法实现的功能
}
}
function __destruct()
{
echo "<p><b>对象被销毁,调用析构函数。</b></p>";
}
}
$sport = new SportObject('明日', '185', '80', '20', '男'); //实例化类,并传递参数
//unset($sport);
要销毁一个对象,可以像销毁一个变量一样,使用 unset 函数
继承和多态
子类型的定义使用 extends 关键字
<?php
/* 父类 */
class SportObject
{
public $name; //定义姓名成员变量
public $age; //定义年龄成员变量
public $avoirdupois; //定义体重成员变量
public $sex; //定义性别成员变量
public function __construct($name, $age, $avoirdupois, $sex)
{ //定义构造方法
$this->name = $name; //为成员变量赋值
$this->age = $age; //为成员变量赋值
$this->avoirdupois = $avoirdupois; //为成员变量赋值
$this->sex = $sex; //为成员变量赋值
}
function showMe()
{ //定义方法
echo '这句话不会显示。';
}
}
/* 子类BeatBasketBall */
class BeatBasketBall extends SportObject
{ //定义子类,继承父类
public $height; //定义身高成员变量
function __construct($name, $height)
{ //定义构造方法
$this->height = $height; //为成员变量赋值
$this->name = $name; //为成员变量赋值
}
function showMe()
{ //定义方法
if ($this->height > 185) {
return $this->name . ",符合打篮球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合打篮球的要求!"; //方法实现的功能
}
}
}
/* 父类 */
class SportObject
{
public $name; //定义姓名成员变量
public $age; //定义年龄成员变量
public $avoirdupois; //定义体重成员变量
public $sex; //定义性别成员变量
public function __construct($name, $age, $avoirdupois, $sex)
{ //定义构造方法
$this->name = $name; //为成员变量赋值
$this->age = $age; //为成员变量赋值
$this->avoirdupois = $avoirdupois; //为成员变量赋值
$this->sex = $sex; //为成员变量赋值
}
function showMe()
{ //定义方法
echo '这句话不会显示。';
}
}
/* 子类BeatBasketBall */
class BeatBasketBall extends SportObject
{ //定义子类,继承父类
public $height; //定义身高成员变量
function __construct($name, $height)
{ //定义构造方法
$this->height = $height; //为成员变量赋值
$this->name = $name; //为成员变量赋值
}
function showMe()
{ //定义方法
if ($this->height > 185) {
return $this->name . ",符合打篮球的要求!"; //方法实现的功能
} else {
return $this->name . ",不符合打篮球的要求!"; //方法实现的功能
}
}
}
$this 与 get_class
<?php
class example
{
function exam()
{
if (isset($this)) {
echo '$this的值为:' . get_class($this);
} else {
echo '$this未定义';
}
}
}
$class_name = new example();
$class_name->exam();
?>
class example
{
function exam()
{
if (isset($this)) {
echo '$this的值为:' . get_class($this);
} else {
echo '$this未定义';
}
}
}
$class_name = new example();
$class_name->exam();
?>
get_class 返回一个对象所属类型的字符串,
如果参数中描述的变量不是对象,返回 false
如果参数中描述的变量不是对象,返回 false
范围解析操作符(::)
可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
当在类定义之外引用到这些项目时,要使用类名。
可以通过变量来引用类,该变量的值不能是关键字(如 self,parent 和 static)
当在类定义之外引用到这些项目时,要使用类名。
可以通过变量来引用类,该变量的值不能是关键字(如 self,parent 和 static)
<?php
class Book
{
const NAME = 'computer'; //常量NAME
function __construct()
{ //构造方法
echo '本月图书类冠军为:' . Book::NAME . ' '; //输出默认值
}
}
echo Book::NAME;
class Book
{
const NAME = 'computer'; //常量NAME
function __construct()
{ //构造方法
echo '本月图书类冠军为:' . Book::NAME . ' '; //输出默认值
}
}
echo Book::NAME;
操作用在类的内部,分别用来调用类
中的静态变量和父类的构造方法。
中的静态变量和父类的构造方法。
注意:常量是类的一个属性,并不是对象特有的;类是一个抽象定义,前面不能使用$,否则就是变量了。
访问控制修饰
public:公开,任何外部或者是子类型都可以访问;
private:私有,只能本类型访问;
protected:本类型和子类型访问
private:私有,只能本类型访问;
protected:本类型和子类型访问
没有修饰则为public
静态方法和静态变量
类外部调用使用 类名::静态成员;
类内部调用使用 self::静态成员
类内部调用使用 self::静态成员
final关键词
被修饰的类不能扩展子类;
被修饰的方法不能在子类中覆盖
被修饰的方法不能在子类中覆盖
对象类型检测
<?php
class SportObject
{
}
class MyBook extends SportObject
{
private $type;
}
$cBook = new MyBook();
if ($cBook instanceof MyBook)
echo '对象$cBook属于MyBook类<br>';
if ($cBook instanceof SportObject)
echo '对象$cBook属于SportObject类<br>';
class SportObject
{
}
class MyBook extends SportObject
{
private $type;
}
$cBook = new MyBook();
if ($cBook instanceof MyBook)
echo '对象$cBook属于MyBook类<br>';
if ($cBook instanceof SportObject)
echo '对象$cBook属于SportObject类<br>';
魔术方法
_ _set()和_ _get()方法
在给不可访问(protected 或 private)或不存在的属性赋值时,_ _set() 会被调用
读取不可访问(protected 或 private)或不存在的属性的值时,_ _get() 会被调用
public function __get($name)
{
if (isset($this->$name)) {
echo '变量' . $name . '的值为:' . $this->$name . '<br>';
} else {
echo '变量' . $name . '未定义,初始化为0<br>';
$this->$name = 100;
}
}
public function __set($name, $value)
{
if (isset($this->$name)) {
$this->$name = $value;
echo '变量' . $name . '赋值为:' . $value . '<br>';
} else {
$this->$name = $value;
echo '变量' . $name . '被初始化为:' . $value . '<br>';
}
}
{
if (isset($this->$name)) {
echo '变量' . $name . '的值为:' . $this->$name . '<br>';
} else {
echo '变量' . $name . '未定义,初始化为0<br>';
$this->$name = 100;
}
}
public function __set($name, $value)
{
if (isset($this->$name)) {
$this->$name = $value;
echo '变量' . $name . '赋值为:' . $value . '<br>';
} else {
$this->$name = $value;
echo '变量' . $name . '被初始化为:' . $value . '<br>';
}
}
属性重载只能在对象中进行。在静态方法中,
这些魔术方法将不会被调用。所以这些方法
都不能被 声明为 static
这些魔术方法将不会被调用。所以这些方法
都不能被 声明为 static
访问了一个不存在的类成员变量,这时14行输出;
通过15行对一个不存在的变量进行赋值(写操作)
会触发_ _set 函数
通过15行对一个不存在的变量进行赋值(写操作)
会触发_ _set 函数
_ _call()方法
在对象中调用一个不可访问方法时,_ _call() 会被调用
<?php
class SportObject
{
public function myDream()
{
echo '调用的方法存在,直接执行此方法。MyDream<p>';
}
public function __call($method, $parameter)
{
echo '如果方法不存在,则执行__call()方法。<br>';
echo '方法名为:' . $method . '<br>';
echo '参数有:';
var_dump($parameter);
}
}
$MyLife = new SportObject();
$MyLife->myDream();
$MyLife->mDream('how', 'what', 'why');
class SportObject
{
public function myDream()
{
echo '调用的方法存在,直接执行此方法。MyDream<p>';
}
public function __call($method, $parameter)
{
echo '如果方法不存在,则执行__call()方法。<br>';
echo '方法名为:' . $method . '<br>';
echo '参数有:';
var_dump($parameter);
}
}
$MyLife = new SportObject();
$MyLife->myDream();
$MyLife->mDream('how', 'what', 'why');
数据库应用
数据库实体关系
一对一
一对多
两张表
关系建在多中
多对多
三张表
关系加一张表
数据库维护
基于web的管理
导入数据库
在 HeidiSQL 中使用 文件→运行SQL文件 可以
加载一个数据库脚本,并运行
加载一个数据库脚本,并运行
使用函数访问数据库
数据查询
<?php
if (!$conn = mysqli_connect("127.0.0.1", "root", "123456", "db_database18")) {
echo '数据库连接错误';
}
mysqli_query($conn, "set names utf8"); //设置数据库编码格式utf8
if (!$conn = mysqli_connect("127.0.0.1", "root", "123456", "db_database18")) {
echo '数据库连接错误';
}
mysqli_query($conn, "set names utf8"); //设置数据库编码格式utf8
数据插入
<form name="intFrom" method="post" action="index_ok.php">
<table width="60%" border="1">
<tr>
<td>书名:</td>
<td><input type="text" name="bookname"></td>
</tr>
<td colspan="2">
<input type="hidden" name="action" value="insert">
<input type="submit" name="Submit" value="添加">
<input type="reset" name="reset" value="重置">
</td>
</tr>
</table>
</form>
<table width="60%" border="1">
<tr>
<td>书名:</td>
<td><input type="text" name="bookname"></td>
</tr>
<td colspan="2">
<input type="hidden" name="action" value="insert">
<input type="submit" name="Submit" value="添加">
<input type="reset" name="reset" value="重置">
</td>
</tr>
</table>
</form>
数据更新
update
<?php
include_once("conn.php");
?>
<table width="60%" border="1">
<tr>
<td width="5%">id</td>
<td width="30%">书名</td>
<td width="10%">价格</td>
<td width="20%">出版时间</td>
<td width="10%">类别</td>
<td width="10%">操作</td>
</tr>
<?php
$sqlstr = "select * from tb_demo02 order by id";
$result = mysqli_query($conn, $sqlstr);
while ($rows = mysqli_fetch_row($result)) {
?>
<tr>
<?php
for ($i = 0; $i < count($rows); $i++) {
?>
<td><?= $rows[$i] ?></td>
<?php
}
?>
<td><a href='update_form.php?action=update&id=<?= $rows[0] ?>'>修改</a></td>
</tr>
<?php
}
?>
</table>
include_once("conn.php");
?>
<table width="60%" border="1">
<tr>
<td width="5%">id</td>
<td width="30%">书名</td>
<td width="10%">价格</td>
<td width="20%">出版时间</td>
<td width="10%">类别</td>
<td width="10%">操作</td>
</tr>
<?php
$sqlstr = "select * from tb_demo02 order by id";
$result = mysqli_query($conn, $sqlstr);
while ($rows = mysqli_fetch_row($result)) {
?>
<tr>
<?php
for ($i = 0; $i < count($rows); $i++) {
?>
<td><?= $rows[$i] ?></td>
<?php
}
?>
<td><a href='update_form.php?action=update&id=<?= $rows[0] ?>'>修改</a></td>
</tr>
<?php
}
?>
</table>
<?php
include_once("conn.php"); //包含数据库连接文件
if ($_GET['action'] == "update") { //判断地址栏参数action的值是否等于update
$sqlstr = "select * from tb_demo02 where id = " . $_GET['id']; //定义查询语句
$result = mysqli_query($conn, $sqlstr); //执行查询语句
$rows = mysqli_fetch_row($result); //将查询结果返回为数组
?>
<form name="intFrom" method="post" action="update_ok.php">
<table border="1">
<tr>
<td align="right">书名:</td>
<td><input type="text" name="bookname" value="<?php echo $rows[1] ?>"></td>
</tr>
<td colspan="2">
<input type="hidden" name="action" value="update">
<input type="hidden" name="id" value="<?php echo $rows[0] ?>">
<input type="submit" name="Submit" value="修改">
<input type="reset" name="reset" value="重置">
</td>
</tr>
</table>
</form>
<?php
}
?>
include_once("conn.php"); //包含数据库连接文件
if ($_GET['action'] == "update") { //判断地址栏参数action的值是否等于update
$sqlstr = "select * from tb_demo02 where id = " . $_GET['id']; //定义查询语句
$result = mysqli_query($conn, $sqlstr); //执行查询语句
$rows = mysqli_fetch_row($result); //将查询结果返回为数组
?>
<form name="intFrom" method="post" action="update_ok.php">
<table border="1">
<tr>
<td align="right">书名:</td>
<td><input type="text" name="bookname" value="<?php echo $rows[1] ?>"></td>
</tr>
<td colspan="2">
<input type="hidden" name="action" value="update">
<input type="hidden" name="id" value="<?php echo $rows[0] ?>">
<input type="submit" name="Submit" value="修改">
<input type="reset" name="reset" value="重置">
</td>
</tr>
</table>
</form>
<?php
}
?>
数据删除
<script>
//删除确认
function del() {
if (!window.confirm('是否要删除数据??'))
return false;
}
//全部选择/取消
function chek() {
debugger;
var leng = this.form1.chk.length;
if (leng == undefined) {
leng = 1;
if (!form1.chk.checked)
document.form1.chk.checked = true;
else
document.form1.chk.checked = false;
} else {
for (var i = 0; i < leng; i++) {
if (!form1.chk[i].checked)
document.form1.chk[i].checked = true;
else
document.form1.chk[i].checked = false;
}
}
return false;
}
</script>
<?php
include_once("conn.php");
?>
<table border="1">
<form name="form1" id="form1" method="post" action="delete.php">
<tr>
<td> </td>
<td>id</td>
<td>书名</td>
<td>价格</td>
<td>出版时间</td>
<td>类别</td>
</tr>
<?php
$sqlstr1 = "select * from tb_demo02 order by id";
$result = mysqli_query($conn, $sqlstr1);
while ($rows = mysqli_fetch_row($result)) {
?>
<tr>
<td>
<input type=checkbox name='chk[]' id='chk' value=<?= $rows[0] ?>>
</td>
<?php
for ($i = 0; $i < count($rows); $i++) {
?>
<td><?= $rows[$i] ?></td>
<?php
}
?>
<?php
}
?>
<tr>
<td colspan="6">
<a href="" onClick="return chek();">全部选择/取消</a>
<input type="hidden" name="action" value="delall">
<input type="submit" value="删除选择" onclick='return del();'>
</td>
</tr>
</form>
</table>
//删除确认
function del() {
if (!window.confirm('是否要删除数据??'))
return false;
}
//全部选择/取消
function chek() {
debugger;
var leng = this.form1.chk.length;
if (leng == undefined) {
leng = 1;
if (!form1.chk.checked)
document.form1.chk.checked = true;
else
document.form1.chk.checked = false;
} else {
for (var i = 0; i < leng; i++) {
if (!form1.chk[i].checked)
document.form1.chk[i].checked = true;
else
document.form1.chk[i].checked = false;
}
}
return false;
}
</script>
<?php
include_once("conn.php");
?>
<table border="1">
<form name="form1" id="form1" method="post" action="delete.php">
<tr>
<td> </td>
<td>id</td>
<td>书名</td>
<td>价格</td>
<td>出版时间</td>
<td>类别</td>
</tr>
<?php
$sqlstr1 = "select * from tb_demo02 order by id";
$result = mysqli_query($conn, $sqlstr1);
while ($rows = mysqli_fetch_row($result)) {
?>
<tr>
<td>
<input type=checkbox name='chk[]' id='chk' value=<?= $rows[0] ?>>
</td>
<?php
for ($i = 0; $i < count($rows); $i++) {
?>
<td><?= $rows[$i] ?></td>
<?php
}
?>
<?php
}
?>
<tr>
<td colspan="6">
<a href="" onClick="return chek();">全部选择/取消</a>
<input type="hidden" name="action" value="delall">
<input type="submit" value="删除选择" onclick='return del();'>
</td>
</tr>
</form>
</table>
<?php
include_once("conn.php"); //连接数据库
if ($_POST['action'] == "delall") { //判断是否执行删除操作
if (count($_POST['chk']) <= 0) { //判断提交的删除记录是否为空
echo "<script>alert('请选择记录');history.go(-1);</script>";
} else {
for ($i = 0; $i < count($_POST['chk']); $i++) { //for语句循环读取复选框提交的值,
$sqlstr = "delete from tb_demo02 where id = " . $_POST['chk'][$i]; //循环执行删除操作
mysqli_query($conn, $sqlstr); //执行删除操作
}
echo "<script>alert('删除成功');location='delete_list.php';</script>";
}
}
include_once("conn.php"); //连接数据库
if ($_POST['action'] == "delall") { //判断是否执行删除操作
if (count($_POST['chk']) <= 0) { //判断提交的删除记录是否为空
echo "<script>alert('请选择记录');history.go(-1);</script>";
} else {
for ($i = 0; $i < count($_POST['chk']); $i++) { //for语句循环读取复选框提交的值,
$sqlstr = "delete from tb_demo02 where id = " . $_POST['chk'][$i]; //循环执行删除操作
mysqli_query($conn, $sqlstr); //执行删除操作
}
echo "<script>alert('删除成功');location='delete_list.php';</script>";
}
}
PDO数据抽象层
查询
$dsn = "$dbms:host=$host;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query = "select * from tb_pdo_mysql"; //定义SQL语句
$result = $pdo->prepare($query); //准备查询语句
$result->execute(); //执行查询语句,并返回结果集
while ($res = $result->fetch(PDO::FETCH_ASSOC)) { //while循环输出查询结果集,并且设置结果集的为关联索引
?>
try {
$pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query = "select * from tb_pdo_mysql"; //定义SQL语句
$result = $pdo->prepare($query); //准备查询语句
$result->execute(); //执行查询语句,并返回结果集
while ($res = $result->fetch(PDO::FETCH_ASSOC)) { //while循环输出查询结果集,并且设置结果集的为关联索引
?>
生成了一个叫做dsn的字符串,这个字符串是说
明所连接数据库服务器的类型、主机地址、数据
库(选择的数据库)等信息的
明所连接数据库服务器的类型、主机地址、数据
库(选择的数据库)等信息的
建立一个数据库连接
准备SQL查询字符串,并在对象上面调用prepare
函数执行SQL;prepare返回的是一个准备好的
SQL执行对象,需要在该对象上调用execute真正
执行sql;执行完sql后,可以在prepare返回的的
对象上面使用fetch方法逐个提取行
函数执行SQL;prepare返回的是一个准备好的
SQL执行对象,需要在该对象上调用execute真正
执行sql;执行完sql后,可以在prepare返回的的
对象上面使用fetch方法逐个提取行
fetch
PDO::FETCH_ASSOC:关联数组
PDO::FETCH_NUM:索引数组
PDO::FETCH_BOTH :关联数组和索引数组
PDO::FETCH_OBJ:对象
PDO::FETCH_NUM:索引数组
PDO::FETCH_BOTH :关联数组和索引数组
PDO::FETCH_OBJ:对象
插入数据
使用命名参数的方式
$dsn = "$dbms:host=$host;dbname=$dbName;port=3306";
$pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query = "insert into tb_pdo_mysql(pdo_type,database_name,dates)values(:pdo, :name, :date)";
$result = $pdo->prepare($query);
$result->execute(array(
':pdo' => $_POST['pdo'],
':name' => $_POST['databases'],
':date' => $_POST['dates']
));
$code = $result->errorCode();
echo "error code:" . $code . "<br>";
if ($code == 0) {
echo "数据添加成功!";
} else {
echo '数据库错误:<br/>';
echo 'SQL Query:' . $query;
echo '<pre>';
var_dump($result->errorInfo());
echo '</pre>';
}
}
$pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query = "insert into tb_pdo_mysql(pdo_type,database_name,dates)values(:pdo, :name, :date)";
$result = $pdo->prepare($query);
$result->execute(array(
':pdo' => $_POST['pdo'],
':name' => $_POST['databases'],
':date' => $_POST['dates']
));
$code = $result->errorCode();
echo "error code:" . $code . "<br>";
if ($code == 0) {
echo "数据添加成功!";
} else {
echo '数据库错误:<br/>';
echo 'SQL Query:' . $query;
echo '<pre>';
var_dump($result->errorInfo());
echo '</pre>';
}
}
使用索引数组的方式
$dsn = "$dbms:host=$host;dbname=$dbName;port=3306";
$pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query = "insert into tb_pdo_mysql(pdo_type,database_name,dates)values(?, ?, ?)";
$result = $pdo->prepare($query);
$result->execute(array(
$_POST['pdo'],
$_POST['databases'],
$_POST['dates']
));
$code = $result->errorCode();
echo "error code:" . $code . "<br>";
if ($code == 0) {
echo "数据添加成功!";
} else {
echo '数据库错误:<br/>';
echo 'SQL Query:' . $query;
echo '<pre>';
var_dump($result->errorInfo());
echo '</pre>';
}
$pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query = "insert into tb_pdo_mysql(pdo_type,database_name,dates)values(?, ?, ?)";
$result = $pdo->prepare($query);
$result->execute(array(
$_POST['pdo'],
$_POST['databases'],
$_POST['dates']
));
$code = $result->errorCode();
echo "error code:" . $code . "<br>";
if ($code == 0) {
echo "数据添加成功!";
} else {
echo '数据库错误:<br/>';
echo 'SQL Query:' . $query;
echo '<pre>';
var_dump($result->errorInfo());
echo '</pre>';
}
删除和修改
0 条评论
下一页