<?php
/*
$a="learn PHP";
$b="W3cScholl";
$c=array("我是1","我是2","我是3");
print "$a"."<br>";
print "my car is a{$c[0]}";
*/
/*
$x=10.1212;
$y=2.4e3;
$z=8e-5;
var_dump($x."---".$y."---".$z);
*/
/*
// PHP 对象
//对象是存储数据和有关如何处理数据的信息的数据类型。
//在 PHP 中,必须明确地声明对象。
//首先我们必须声明对象的类。对此,我们使用 class 关键词。类是包含属性和方法的结构。
//然后我们在对象类中定义数据类型,然后在该类的实例中使用此数据类型:
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
function print_vars($obj) {
foreach (get_object_vars($obj) as $prop => $val) {
echo "\t$prop = $val\n";
}
}
// instantiate one object
$herbie = new Car("white");
// show herbie properties
echo "\herbie: Properties\n";
print_vars($herbie);
*/
/*
//PHP strlen() 函数
//strlen() 函数返回字符串的长度,以字符计。
//下例返回字符串 "Hello world!" 的长度:
//实例
<?php
echo strlen("Hello world!");
?>
*/
/*
//PHP strpos() 函数
//strpos() 函数用于检索字符串内指定的字符或文本。
//如果找到匹配,则会返回首个匹配的字符位置。如果未找到匹配,则将返回 FALSE。
//下例检索字符串 "Hello world!" 中的文本 "world":
//实例
<?php
echo strpos("Hello world!","world");
?>
*/
/*
<?php
// 定义对大小写敏感的常量
define("GREETING", "Welcome to W3School.com.cn!");
echo GREETING;
echo "<br>";
// 不会输出常量的值
echo greeting;
?>
*/
/*
<?php
define("GREETING", "Welcome to W3School.com.cn!", true);
echo greeting;
?>
*/
//################################运算符#########################################
//PHP 算数运算符
/*
$x=10;
$y=6;
echo ($x + $y); // 输出 16
echo ($x - $y); // 输出 4
echo ($x * $y); // 输出 60
echo ($x / $y); // 输出 1.6666666666667
echo ($x % $y); // 输出 4
*/
//PHP 赋值运算符
/*
$x=10;
echo $x; // 输出 10
$y=20;
$y += 100;
echo $y; // 输出 120
$z=50;
$z -= 25;
echo $z; // 输出 25
$i=5;
$i *= 6;
echo $i; // 输出 30
$j=10;
$j /= 5;
echo $j; // 输出 2
$k=15;
$k %= 4;
echo $k; // 输出 3
*/
//PHP 字符串运算符
/*
*
//运算符
名称
例子
结果
//.
串接
$txt1 = "Hello" $txt2 = $txt1 . " world!"
现在 $txt2 包含 "Hello world!"
//.=
串接赋值
$txt1 = "Hello" $txt1 .= " world!"
现在 $txt1 包含 "Hello world!"
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出 Hello world!
$x="Hello";
$x .= " world!";
echo $x; // 输出 Hello world!
*/
/*
PHP 递增/递减运算符
运算符
名称
描述
++$x
前递增
$x 加一递增,然后返回 $x
$x++
后递增
返回 $x,然后 $x 加一递增
--$x
前递减
$x 减一递减,然后返回 $x
$x--
后递减
返回 $x,然后 $x 减一递减
*/
/*
PHP 比较运算符
PHP 比较运算符用于比较两个值(数字或字符串):
运算符
名称
例子
结果
==
等于
$x == $y
如果 $x 等于 $y,则返回 true。
===
全等(完全相同)
$x === $y
如果 $x 等于 $y,且它们类型相同,则返回 true。
!=
不等于
$x != $y
如果 $x 不等于 $y,则返回 true。
<>
不等于
$x <> $y
如果 $x 不等于 $y,则返回 true。
!==
不全等(完全不同)
$x !== $y
如果 $x 不等于 $y,且它们类型不相同,则返回 true。
>
大于
$x > $y
如果 $x 大于 $y,则返回 true。
<
大于
$x < $y
如果 $x 小于 $y,则返回 true。
>=
大于或等于
$x >= $y
如果 $x 大于或者等于 $y,则返回 true.
<=
小于或等于
$x <= $y
如果 $x 小于或者等于 $y,则返回 true。
<?php
$x=100;
$y="100";
var_dump($x == $y);
echo "<br>";
var_dump($x === $y);
echo "<br>";
var_dump($x != $y);
echo "<br>";
var_dump($x !== $y);
echo "<br>";
$a=50;
$b=90;
var_dump($a > $b);
echo "<br>";
var_dump($a < $b);
?>
* */
/*
PHP 逻辑运算符
运算符
名称
例子
结果
and
与
$x and $y
如果 $x 和 $y 都为 true,则返回 true。
or
或
$x or $y
如果 $x 和 $y 至少有一个为 true,则返回 true。
xor
异或
$x xor $y
如果 $x 和 $y 有且仅有一个为 true,则返回 true。
&&
与
$x && $y
如果 $x 和 $y 都为 true,则返回 true。
||
或
$x || $y
如果 $x 和 $y 至少有一个为 true,则返回 true。
!
非
!$x
如果 $x 不为 true,则返回 true。
PHP 数组运算符
PHP 数组运算符用于比较数组:
运算符
名称
例子
结果
+
联合
$x + $y
$x 和 $y 的联合(但不覆盖重复的键)
==
相等
$x == $y
如果 $x 和 $y 拥有相同的键/值对,则返回 true。
===
全等
$x === $y
如果 $x 和 $y 拥有相同的键/值对,且顺序相同类型相同,则返回 true。
!=
不相等
$x != $y
如果 $x 不等于 $y,则返回 true。
<>
不相等
$x <> $y
如果 $x 不等于 $y,则返回 true。
!==
不全等
$x !== $y
如果 $x 与 $y 完全不同,则返回 true。
* */
//###############################判断##############################
//PHP - if 语句
/*
<?php
$t=date("H");
if ($t<"20") {
echo "Have a good day!";
}
?>
*/
//PHP - if...else 语句
/*
$t=date("H");
if ($t<"20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
*/
//PHP - if...elseif....else 语句
/*
$t=date("H");
if ($t<"10") {
echo "Have a good morning!";
} elseif ($t<"20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
*/
//Switch 语句
//工作原理:
//对表达式(通常是变量)进行一次计算
//把表达式的值与结构中 case 的值进行比较
//如果存在匹配,则执行与 case 关联的代码
//代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
//如果没有 case 为真,则使用 default 语句
/*
switch ($x)
{
case 1:
echo "Number 1";
break;
case 2:
echo "Number 2";
break;
case 3:
echo "Number 3";
break;
default:
echo "No number between 1 and 3";
}
*/
//#########################循环########################
/*
while - 只要指定条件为真,则循环代码块
do...while - 先执行一次代码块,然后只要指定条件为真则重复循环
for - 循环代码块指定次数
foreach - 遍历数组中的每个元素并循环代码块
*/
//PHP while 循环
/*
$x=1;
while($x<=5) {
echo "这个数字是:$x <br>";
$x++;
}
*/
//PHP do...while 循环
/*
$a=1;
do{
echo "我是$a";
$a++;
}while($a<=5);
*/
//for循环
/*
for ($x=0; $x<=10; $x++) {
echo "数字是:$x <br>";
}
*/
//PHP foreach 循环
/*
$colors = array("red","green","blue","yellow");
foreach ($colors as $value) {
echo "$value <br>";
}
*/
//#########################PHP 函数#############################
//在 PHP 创建用户定义函数
/*
function writeMsg() {
echo "Hello world!";
}
writeMsg(); // 调用函数
*/
//PHP 函数参数
/*
function familyName($fname) {
echo "$fname Zhang.<br>";
}
familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
*/
//PHP 默认参数值
/*
function setHeight($minheight=50) {
echo "The height is : $minheight <br>";
}
setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
* */
//PHP 函数 - 返回值
/*
function sum($a,$b){
$z=$a+$b;
return $z;
}
echo "5+10=".sum(5,10)."<br>";
echo "10+1=".sum(10,1);
*/
//###########################PHP 数组#########################
/*
$a=array("1","3","4","5","7");
echo "$a的0位数是:".$a[0];
echo "$a的3位数是:".$a[3];
*/
//索引数组 - 带有数字索引的数组
//关联数组 - 带有指定键的数组
//多维数组 - 包含一个或多个数组的数组
//获得数组的长度 - count() 函数
//count() 函数用于返回数组的长度(元素数):
//实例
/*
$cars=array("Volvo","BMW","SAAB");
echo count($cars);
*/
//遍历数组
/*
$a=array("1","2","3","4");
for ($i=0;$i<=count($a);$i++){
echo "你是sb".$i."<br>";
}
*/
//PHP 关联数组
/*
$a=array(
"小明"=>"23",
"小红"=>"35",
"小王"=>"18"
);
echo "小王的年龄:".$a['小王'];
*/
//多维数组(没概述,另找)
//#####################PHP - 数组的排序函数##########################
//PHP - 数组的排序函数
//在本节中,我们将学习如下 PHP 数组排序函数:
//sort() - 以升序对数组排序
//rsort() - 以降序对数组排序
//asort() - 根据值,以升序对关联数组进行排序
//ksort() - 根据键,以升序对关联数组进行排序
//arsort() - 根据值,以降序对关联数组进行排序
//krsort() - 根据键,以降序对关联数组进行排序
//#######################PHP 全局变量 - 超全局变量############################
/*
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
*/
//$GLOBALS — 引用全局作用域中可用的全部变量
/*
$a=10;
$b=15;
function add(){
$GLOBALS['z']=$GLOBALS['a']+$GLOBALS['b'];
}
add();
echo $z;
*/
//PHP $_SERVER
/*
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
echo "<br>";
echo "返回开始时间时间戳:".$_SERVER['REQUEST_TIME'];
*/
/*
下表列出了您能够在 $_SERVER 中访问的最重要的元素:
元素/代码
描述
$_SERVER['PHP_SELF']
返回当前执行脚本的文件名。
$_SERVER['GATEWAY_INTERFACE']
返回服务器使用的 CGI 规范的版本。
$_SERVER['SERVER_ADDR']
返回当前运行脚本所在的服务器的 IP 地址。
$_SERVER['SERVER_NAME']
返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn)。
$_SERVER['SERVER_SOFTWARE']
返回服务器标识字符串(比如 Apache/2.2.24)。
$_SERVER['SERVER_PROTOCOL']
返回请求页面时通信协议的名称和版本(例如,“HTTP/1.0”)。
$_SERVER['REQUEST_METHOD']
返回访问页面使用的请求方法(例如 POST)。
$_SERVER['REQUEST_TIME']
返回请求开始时的时间戳(例如 1577687494)。
$_SERVER['QUERY_STRING']
返回查询字符串,如果是通过查询字符串访问此页面。
$_SERVER['HTTP_ACCEPT']
返回来自当前请求的请求头。
$_SERVER['HTTP_ACCEPT_CHARSET']
返回来自当前请求的 Accept_Charset 头( 例如 utf-8,ISO-8859-1)
$_SERVER['HTTP_HOST']
返回来自当前请求的 Host 头。
$_SERVER['HTTP_REFERER']
返回当前页面的完整 URL(不可靠,因为不是所有用户代理都支持)。
$_SERVER['HTTPS']
是否通过安全 HTTP 协议查询脚本。
$_SERVER['REMOTE_ADDR']
返回浏览当前页面的用户的 IP 地址。
$_SERVER['REMOTE_HOST']
返回浏览当前页面的用户的主机名。
$_SERVER['REMOTE_PORT']
返回用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER['SCRIPT_FILENAME']
返回当前执行脚本的绝对路径。
$_SERVER['SERVER_ADMIN']
该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
$_SERVER['SERVER_PORT']
Web 服务器使用的端口。默认值为 “80”。
$_SERVER['SERVER_SIGNATURE']
返回服务器版本和虚拟主机名。
$_SERVER['PATH_TRANSLATED']
当前脚本所在文件系统(非文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME']
返回当前脚本的路径。
$_SERVER['SCRIPT_URI']
返回当前页面的 URI。
*/
//PHP $_REQUEST 用于收集 HTML 表单提交的数据。
/*
*
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
*
* */
//****PHP $_POST******************
//PHP $_POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。
/*
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>
</body>
</html>
<html>
<body>
Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?>
</body>
</html>
*/
//*********************
//PHP $_GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据。
/*
<html>
<body>
<a href="test_get.php?subject=PHP&web=W3school.com.cn">测试 $GET</a>
<?php
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>
</body>
</html>
*/
/*********************PHP 表单处理********************************
*
*
* */
//GET vs. POST
//GET 和 POST 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, ...))。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。
//GET 和 POST 被视作 $_GET 和 $_POST。它们是超全局变量,这意味着对它们的访问无需考虑作用域 - 无需任何特殊代码,您能够从任何函数、类或文件访问它们。
//$_GET 是通过 URL 参数传递到当前脚本的变量数组。
//$_POST 是通过 HTTP POST 传递到当前脚本的变量数组。
//何时使用 GET?
//通过 GET 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。限制在大于 2000 个字符。不过,由于变量显示在 URL 中,把页面添加到书签中也更为方便。
//GET 可用于发送非敏感的数据。
//注释:绝不能使用 GET 来发送密码或其他敏感信息!
//何时使用 POST?
//通过 POST 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量也无限制。
//此外 POST 支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。
//不过,由于变量未显示在 URL 中,也就无法将页面添加到书签。
//提示:开发者偏爱 POST 来发送表单数据。
//接下来让我们看看如何安全地处理 PHP 表单!
//##########################PHP 表单验证################################
/*
上面的表单使用如下验证规则:
字段
验证规则
Name
必需。必须包含字母和空格。
E-mail
必需。必须包含有效的电子邮件地址(包含 @ 和 .)。
Website
可选。如果选填,则必须包含有效的 URL。
Comment
可选。多行输入字段(文本框)。
Gender
必需。必须选择一项。
首先我们看一下这个表单的纯 HTML 代码:
文本字段
name、email 和 website 属于文本输入元素,comment 字段是文本框。HTML 代码是这样的:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
单选按钮
gender 字段是单选按钮,HTML 代码是这样的:
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
表单元素
表单的 HTML 代码是这样的:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
当提交此表单时,通过 method="post" 发送表单数据。
什么是 $_SERVER["PHP_SELF"] 变量?
$_SERVER["PHP_SELF"] 是一种超全局变量,它返回当前执行脚本的文件名。
因此,$_SERVER["PHP_SELF"] 将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。
什么是 htmlspecialchars() 函数?
htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
关于 PHP 表单安全性的重要提示
$_SERVER["PHP_SELF"] 变量能够被黑客利用!
如果您的页面使用了 PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS)。
提示:跨站点脚本(Cross-site scripting,XSS)是一种计算机安全漏洞类型,常见于 Web 应用程序。XSS 能够使攻击者向其他用户浏览的网页中输入客户端脚本。
假设我们的一张名为 "test_form.php" 的页面中有如下表单:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
现在,如果用户进入的是地址栏中正常的 URL:"http://www.example.com/test_form.php",上面的代码会转换为:
<form method="post" action="test_form.php">
到目前,一切正常。
不过,如果用户在地址栏中键入了如下 URL:
http://www.example.com/test_form.php/">
在这种情况下,上面的代码会转换为:
<form method="post" action="test_form.php"/><script>alert('hacked')</script>
这段代码加入了一段脚本和一个提示命令。并且当此页面加载后,就会执行 JavaScript 代码(用户会看到一个提示框)。这仅仅是一个关于 PHP_SELF 变量如何被利用的简单无害案例。
您应该意识到 <script> 标签内能够添加任何 JavaScript 代码!黑客能够把用户重定向到另一台服务器上的某个文件,该文件中的恶意代码能够更改全局变量或将表单提交到其他地址以保存用户数据,等等。
如果避免 $_SERVER["PHP_SELF"] 被利用?
通过使用 htmlspecialchars() 函数能够避免 $_SERVER["PHP_SELF"] 被利用。
表单代码是这样的:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() 函数把特殊字符转换为 HTML 实体。现在,如果用户试图利用 PHP_SELF 变量,会导致如下输出:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
无法利用,没有危害!
通过 PHP 验证表单数据
我们要做的第一件事是通过 PHP 的 htmlspecialchars() 函数传递所有变量。
在我们使用 htmlspecialchars() 函数后,如果用户试图在文本字段中提交以下内容:
<script>location.href('http://www.hacked.com')</script>
- 代码不会执行,因为会被保存为转义代码,就像这样:
<script>location.href('http://www.hacked.com')</script>
现在这条代码显示在页面上或 e-mail 中是安全的。
在用户提交该表单时,我们还要做两件事:
(通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
(通过 PHP stripslashes() 函数)删除用户输入数据中的反斜杠(\)
接下来我们创建一个检查函数(相比一遍遍地写代码,这样效率更好)。
我们把函数命名为 test_input()。
现在,我们能够通过 test_input() 函数检查每个 $_POST 变量,脚本是这样的:
实例
<?php
// 定义变量并设置为空值
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
运行实例
请注意在脚本开头,我们检查表单是否使用 $_SERVER["REQUEST_METHOD"] 进行提交。如果 REQUEST_METHOD 是 POST,那么表单已被提交 - 并且应该对其进行验证。如果未提交,则跳过验证并显示一个空白表单。
不过,在上面的例子中,所有输入字段都是可选的。即使用户未输入任何数据,脚本也能正常工作。
下一步是制作必填输入字段,并创建需要时使用的错误消息
*/
//############PHP 表单验证 - 必填字段#####################
/*
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "姓名是必填的";
} else {
$name = test_input($_POST["name"]);
}
if (empty($_POST["email"])) {
$emailErr = "电邮是必填的";
} else {
$email = test_input($_POST["email"]);
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "性别是必选的";
} else {
$gender = test_input($_POST["gender"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 验证实例</h2>
<p><span class="error">* 必需的字段</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
姓名:<input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
电邮:<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
网址:<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
评论:<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性别:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的输入:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>
*/
//********PHP 表单验证 - 验证 E-mail 和 URL****************
/*
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "姓名是必填的";
} else {
$name = test_input($_POST["name"]);
// 检查姓名是否包含字母和空白字符
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允许字母和空格";
}
}
if (empty($_POST["email"])) {
$emailErr = "电邮是必填的";
} else {
$email = test_input($_POST["email"]);
// 检查电子邮件地址语法是否有效
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "无效的 email 格式";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// 检查 URL 地址语法是否有效(正则表达式也允许 URL 中的斜杠)
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "无效的 URL";
}
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "性别是必选的";
} else {
$gender = test_input($_POST["gender"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 验证实例</h2>
<p><span class="error">* 必需的字段</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
姓名:<input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
电邮:<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
网址:<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
评论:<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性别:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的输入:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>
*
* */
//********PHP 表单验证 - 完成表单实例*************
/*
*
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "姓名是必填的";
} else {
$name = test_input($_POST["name"]);
// 检查姓名是否包含字母和空白字符
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允许字母和空格";
}
}
if (empty($_POST["email"])) {
$emailErr = "电邮是必填的";
} else {
$email = test_input($_POST["email"]);
// 检查电子邮件地址语法是否有效
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "无效的 email 格式";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// 检查 URL 地址语法是否有效(正则表达式也允许 URL 中的斜杠)
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "无效的 URL";
}
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "性别是必选的";
} else {
$gender = test_input($_POST["gender"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 验证实例</h2>
<p><span class="error">* 必需的字段</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
姓名:<input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
电邮:<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
网址:<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
评论:<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性别:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的输入:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>
* */
/*********************PHP 高级教程********************************
*
*
* */
//***********PHP 多维数组(多维数组指的是包含一个或多个数组的数组。)*************
/*
$a=array(
array("小明",22,15),
array("小红",14,12),
array("小宝",18,32),
array("Land Rover",17,15)
);
for ($i=0;$i<4;$i++){
echo "<p>行数:$i</p>";
echo "<ul>";
for ($y=0;$y<3;$y++){
echo "<li>".$a[$i][$y]."</li>";
}
echo "</ul>";
}
*/
//############################PHP 日期和时间#########################
//PHP date() 函数用于对日期或时间进行格式化。
/*
获得简单的日期
date() 函数的格式参数是必需的,它们规定如何格式化日期或时间。
下面列出了一些常用于日期的字符:
d - 表示月里的某天(01-31)
m - 表示月(01-12)
Y - 表示年(四位数)
1 - 表示周里的某天
其他字符,比如 "/", "." 或 "-" 也可被插入字符中,以增加其他格式。
echo "今天是 " . date("Y/m/d") . "<br>";
echo "今天是 " . date("Y.m.d") . "<br>";
echo "今天是 " . date("Y-m-d") . "<br>";
echo "今天是 " . date("l");
*/
/*
PHP 提示 - 自动版权年份
使用 date() 函数在您的网站上自动更新版本年份:
实例
© 2010-<?php echo date("Y")?>
* */
/*
获得简单的时间
下面是常用于时间的字符:
h - 带有首位零的 12 小时小时格式
i - 带有首位零的分钟
s - 带有首位零的秒(00 -59)
a - 小写的午前和午后(am 或 pm)
下面的例子以指定的格式输出当前时间:
实例
<?php
echo "现在时间是 " . date("h:i:sa");
?>
* */
//获得时区
/*
date_default_timezone_get("Asia/Beijing");
echo "北京当前夏令时时区(sa是上午或下午)".date("h:i:sa");
*/
//通过 PHP mktime() 创建日期
//mktime() 函数返回日期的 Unix 时间戳。Unix 时间戳包含 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)与指定时间之间的秒数。
//mktime(hour,minute,second,month,day,year);
/*
<?php
$d=mktime(9, 12, 31, 6, 10, 2015);
echo "创建日期是 " . date("Y-m-d h:i:sa", $d);
?>
*/
//通过 PHP strtotime() 用字符串来创建日期
/*
<?php
$d=strtotime("tomorrow");
echo date("Y-m-d h:i:sa", $d) . "<br>";
$d=strtotime("next Saturday");
echo date("Y-m-d h:i:sa", $d) . "<br>";
$d=strtotime("+3 Months");
echo date("Y-m-d h:i:sa", $d) . "<br>";
?>
* */
//更多日期实例
/*
<?php
$d1=strtotime("December 31");
$d2=ceil(($d1-time())/60/60/24);
echo "距离十二月三十一日还有:" . $d2 ." 天。";
?>
*/
//######################PHP include 和 require 语句#############################
//require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
//include 只生成警告(E_WARNING),并且脚本会继续
/*
<?php
echo '<a href="/index.asp">首页</a> -
<a href="/html/index.asp">HTML 教程</a> -
<a href="/css/index.asp">CSS 教程</a> -
<a href="/js/index.asp">JavaScript 教程</a> -
<a href="/php/index.asp">PHP 教程</a>';
?>
<html>
<body>
<div class="menu">
<?php include 'menu.php';?>
</div>
<h1>欢迎访问我的首页!</h1>
<p>Some text.</p>
<p>Some more text.</p>
</body>
</html>
*/
//############PHP readfile() 函数####################
/*
PHP readfile() 函数
readfile() 函数读取文件,并把它写入输出缓冲。
假设我们有一个名为 "webdictionary.txt" 的文本文件,存放在服务器上,就像这样:
AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language
读取此文件并写到输出流的 PHP 代码如下(如读取成功则 readfile() 函数返回字节数):
实例
<?php
echo readfile("webdictionary.txt");
?>
*/
//##############PHP 文件打开/读取/读取######################
/*
PHP Open File - fopen()
打开文件的更好的方法是通过 fopen() 函数。此函数为您提供比 readfile() 函数更多的选项。
在课程中,我们将使用文本文件 "webdictionary.txt":
AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language
fopen() 的第一个参数包含被打开的文件名,第二个参数规定打开文件的模式。如果 fopen() 函数未能打开指定的文件,下面的例子会生成一段消息:
实例
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);
?>
*/
//模式
描述
//r
打开文件为只读。文件指针在文件的开头开始。
//w
打开文件为只写。删除文件的内容或创建一个新的文件,如果它不存在。文件指针在文件的开头开始。
//a
打开文件为只写。文件中的现有数据会被保留。文件指针在文件结尾开始。创建新的文件,如果文件不存在。
//x
创建新文件为只写。返回 FALSE 和错误,如果文件已存在。
//r+
打开文件为读/写、文件指针在文件开头开始。
//w+
打开文件为读/写。删除文件内容或创建新文件,如果它不存在。文件指针在文件开头开始。
//a+
打开文件为读/写。文件中已有的数据会被保留。文件指针在文件结尾开始。创建新文件,如果它不存在。
//x+
创建新文件为读/写。返回 FALSE 和错误,如果文件已存在。
//PHP 读取文件 - fread()
/*fread() 的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。
fread($myfile,filesize("webdictionary.txt"));
*/
//PHP 关闭文件 - fclose()
/*
<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed....
fclose($myfile);
?>
* */
//PHP 读取单行文件 - fgets()
/*
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);
?>
*/
//############PHP 文件创建/写入############
//如果您用 fopen() 打开并不存在的文件,此函数会创建文件,假定文件被打开为写入(w)或增加(a)。
/*
$myfile = fopen("testfile.txt", "w");
*/
//PHP 写入文件 - fwrite()
//fwrite() 的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串。
/*
<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "Bill Gates\n";
fwrite($myfile, $txt);
$txt = "Steve Jobs\n";
fwrite($myfile, $txt);
fclose($myfile);//关闭
?>
* */
//PHP 覆盖(Overwriting)
/*
<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "Mickey Mouse\n";
fwrite($myfile, $txt);
$txt = "Minnie Mouse\n";
fwrite($myfile, $txt);
fclose($myfile);
?>
* */
//#################文件上传####################
/*
//创建一个文件上传表单
//允许用户从表单上传文件是非常有用的。
//请看下面这个供上传文件的 HTML 表单:
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
*/
//创建上传脚本
//"upload_file.php" 文件含有供上传文件的代码:
/*
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
*/
//上传限制
//在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb:
/*
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file";
}
?>
*/
//保存被上传的文件
//上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。
//这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
/*
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
*/
//如何创建 cookie?
/*
<?php
setcookie("user", "Alex Porter", time()+3600);
?>
*/
//如何取回 Cookie 的值?
/*
<?php
// Print a cookie
echo $_COOKIE["user"];
// A way to view all cookies
print_r($_COOKIE);
?>
*/
//如何删除 cookie?
/*
<?php
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>
* */
//如果浏览器不支持 cookie 该怎么办?
//下面的表单在用户单击提交按钮时向 "welcome.php" 提交了用户输入:
/*
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
*/
//取回 "welcome.php" 中的值,就像这样:
/*
<html>
<body>
Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old.
</body>
</html>
*/
//##############session#####################
//PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
//开始 PHP Session
/*
<?php session_start(); ?>
*/
//存储 Session 变量
/*
<?php
session_start();
// store session data
$_SESSION['views']=1;
?>
<html>
<body>
<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>
</body>
</html>
* */
//终结 Session
/*
nset() 函数用于释放指定的 session 变量:
<?php
unset($_SESSION['views']);
?>
您也可以通过 session_destroy() 函数彻底终结 session:
<?php
session_destroy();
?>
*
* */
//PHP 发送电子邮件
//语法
//mail(to,subject,message,headers,parameters)
//参数
描述
//to
必需。规定 email 接收者。
//subject
必需。规定 email 的主题。注释:该参数不能包含任何新行字符。
//message
必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。
//headers
//可选。规定附加的标题,比如 From、Cc 以及 Bcc。
//应当使用 CRLF (\r\n) 分隔附加的标题。
//parameters
可选。对邮件发送程序规定额外的参数。
//PHP Mail Form
//通过 PHP,您能够在自己的站点制作一个反馈表单。下面的例子向指定的 e-mail 地址发送了一条文本消息:
/*
<html>
<body>
<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
{
//send email
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail( "someone@example.com", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
else
//if "email" is not filled out, display the form
{
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text' /><br />
Subject: <input name='subject' type='text' /><br />
Message:<br />
<textarea name='message' rows='15' cols='40'>
</textarea><br />
<input type='submit' />
</form>";
}
?>
</body>
</html>
*/
//例子解释:
//首先,检查是否填写了邮件输入框
//如果未填写(比如在页面被首次访问时),输出 HTML 表单
//如果已填写(在表单被填写后),从表单发送邮件
//当点击提交按钮后,重新载入页面,显示邮件发送成功的消息
//################PHP 安全的电子邮件########################
//PHP E-mail 注入
/*
someone@example.com
Cc:person2@example.com
Bcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
BTo:person6@example.com
**/
//PHP 防止 E-mail 注入
/*
<html>
<body>
<?php
function spamcheck($field)
{
//filter_var() sanitizes the e-mail
//address using FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL);
//filter_var() validates the e-mail
//address using FILTER_VALIDATE_EMAIL
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}
if (isset($_REQUEST['email']))
{//if "email" is filled out, proceed
//check if the email address is invalid
$mailcheck = spamcheck($_REQUEST['email']);
if ($mailcheck==FALSE)
{
echo "Invalid input";
}
else
{//send email
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("someone@example.com", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
}
else
{//if "email" is not filled out, display the form
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text' /><br />
Subject: <input name='subject' type='text' /><br />
Message:<br />
<textarea name='message' rows='15' cols='40'>
</textarea><br />
<input type='submit' />
</form>";
}
?>
</body>
</html>
//在上面的代码中,我们使用了 PHP 过滤器来对输入进行验证:
//FILTER_SANITIZE_EMAIL 从字符串中删除电子邮件的非法字符
//FILTER_VALIDATE_EMAIL 验证电子邮件地址
*/
//#############PHP 错误处理##################
/*
<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
*/
//创建自定义错误处理器
//error_level
//必需。为用户定义的错误规定错误报告级别。必须是一个值数。
//参见下面的表格:错误报告级别。
//error_message
必需。为用户定义的错误规定错误消息。
//error_file
可选。规定错误在其中发生的文件名。
//error_line
可选。规定错误发生的行号。
//error_context
可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
//###############PHP 异常处理##########################
//********异常的基本使用***************
//Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
//Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
//Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象
/*
*
<?php
//创建可抛出一个异常的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
//在 "try" 代码块中触发异常
try
{
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
//上面代码将获得类似这样一个错误:
//Message: Value must be 1 or below
//例子解释:
//上面的代码抛出了一个异常,并捕获了它:
//创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
//在 "try" 代码块中调用 checkNum() 函数。
//checkNum() 函数中的异常被抛出
//"catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
//通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息
//不过,为了遵循“每个 throw 必须对应一个 catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。
* */
//****************重新抛出异常*******************
/*
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
try
{
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e)
{
//re-throw exception
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
例子解释:
上面的代码检测在邮件地址中是否含有字符串 "example"。如果有,则再次抛出异常:
customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
把 $email 变量设置为一个有效的邮件地址,但含有字符串 "example"。
"try" 代码块包含另一个 "try" 代码块,这样就可以再次抛出异常。
由于 e-mail 包含字符串 "example",因此触发异常。
"catch" 捕获到该异常,并重新抛出 "customException"。
捕获到 "customException",并显示一条错误消息。
如果在其目前的 "try" 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。
*/
//异常的规则
//需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
//每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
//使用多个 catch 代码块可以捕获不同种类的异常。
//可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
//简而言之:如果抛出了异常,就必须捕获它。
//#####################PHP 过滤器(Filter)######################
//什么是 PHP 过滤器?
//PHP 过滤器用于验证和过滤来自非安全来源的数据。
//验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
//设计 PHP 的过滤器扩展的目的是使数据过滤更轻松快捷。
//为什么使用过滤器?
//几乎所有 web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应有程序获得正确的输入类型。
//函数和过滤器
//如需过滤变量,请使用下面的过滤器函数之一:
//filter_var() - 通过一个指定的过滤器来过滤单一的变量
//filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
//filter_input - 获取一个输入变量,并对它进行过滤
//filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
//在下面的例子中,我们用 filter_var() 函数验证了一个整数:
/*
<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
{
echo("Integer is not valid");
}
else
{
echo("Integer is valid");
}
?>
*/
//总共两种过滤器,分别以下:
//Validating 过滤器:
//用于验证用户输入
//严格的格式规则(比如 URL 或 E-Mail 验证)
//如果成功则返回预期的类型,如果失败则返回 FALSE
//Sanitizing 过滤器:
//用于允许或禁止字符串中指定的字符
//无数据格式规则
//始终返回字符串
//1.选项和标志
/*
<?php
$var=300;
$int_options = array(
"options"=>array
(
"min_range"=>0,
"max_range"=>256
)
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
{
echo("Integer is not valid");
}
else
{
echo("Integer is valid");
}
?>
//就像上面的代码一样,选项必须放入一个名为 "options" 的相关数组中。如果使用标志,则不需在数组内。
//由于整数是 "300",它不在指定的范围内,以上代码的输出将是 "Integer is not valid"。
* */
//2.验证输入
/*
<?php
if(!filter_has_var(INPUT_GET, "email"))
{
echo("Input type does not exist");
}
else
{
if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
{
echo "E-Mail is not valid";
}
else
{
echo "E-Mail is valid";
}
}
?>
*/
//<!--例子解释:-->
//<!--上面的例子有一个通过 "GET" 方法传送的输入变量 (email):-->
//<!--检测是否存在 "GET" 类型的 "email" 输入变量-->
//<!--如果存在输入变量,检测它是否是有效的邮件地址-->
//3.净化输入
/*
<?php
if(!filter_has_var(INPUT_POST, "url"))
{
echo("Input type does not exist");
}
else
{
$url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
}
?>
*/
//<!--例子解释:-->
//<!--上面的例子有一个通过 "POST" 方法传送的输入变量 (url):-->
//<!--检测是否存在 "POST" 类型的 "url" 输入变量-->
//<!--如果存在此输入变量,对其进行净化(删除非法字符),并将其存储在 $url 变量中-->
//<!--假如输入变量类似这样:"http://www.W3非o法ol.com.c字符n/",则净化后的 $url 变量应该是这样的:-->
//<!--http://www.W3School.com.cn/-->
//4.过滤多个输入
/*
<?php
$filters = array
(
"name" => array
(
"filter"=>FILTER_SANITIZE_STRING
),
"age" => array
(
"filter"=>FILTER_VALIDATE_INT,
"options"=>array
(
"min_range"=>1,
"max_range"=>120
)
),
"email"=> FILTER_VALIDATE_EMAIL,
);
$result = filter_input_array(INPUT_GET, $filters);
if (!$result["age"])
{
echo("Age must be a number between 1 and 120.<br />");
}
elseif(!$result["email"])
{
echo("E-Mail is not valid.<br />");
}
else
{
echo("User input is valid");
}
?>
*/
//例子解释:
//上面的例子有三个通过 "GET" 方法传送的输入变量 (name, age and email)
//设置一个数组,其中包含了输入变量的名称,以及用于指定的输入变量的过滤器
//调用 filter_input_array 函数,参数包括 GET 输入变量及刚才设置的数组
//检测 $result 变量中的 "age" 和 "email" 变量是否有非法的输入。(如果存在非法输入,)
//filter_input_array() 函数的第二个参数可以是数组或单一过滤器的 ID。
//如果该参数是单一过滤器的 ID,那么这个指定的过滤器会过滤输入数组中所有的值。
//如果该参数是一个数组,那么此数组必须遵循下面的规则:
//必须是一个关联数组,其中包含的输入变量是数组的键(比如 "age" 输入变量)
//此数组的值必须是过滤器的 ID ,或者是规定了过滤器、标志以及选项的数组
//5.使用 Filter Callback
/*
<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>
*/
//以上代码的结果是这样的:
//Peter is a great guy!
//例子解释:
//上面的例子把所有 "_" 转换成空格:
//创建一个把 "_" 替换为空格的函数
//调用 filter_var() 函数,它的参数是 FILTER_CALLBACK 过滤器以及包含我们的函数的数组
/*********************PHP MySQL 简介********************************
*
*
* */
//#################查询###############
//SELECT LastName FROM Persons
//################连接到一个 MySQL 数据库##############
/*
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
// some code
?>
*/
//关闭连接
//脚本一结束,就会关闭连接。如需提前关闭连接,请使用 mysql_close() 函数。
/*
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
// some code
mysql_close($con);
?>
*/
###################PHP MySQL 创建数据库和表###############
//CREATE DATABASE database_name
/*
创建表
CREATE TABLE 用于在 MySQL 中创建数据库表。
语法
CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
.......
)
*/
//主键和自动递增字段
/*
$sql = "CREATE TABLE Persons
(
personID int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(personID),
FirstName varchar(15),
LastName varchar(15),
Age int
)";
mysql_query($sql,$con);
*/
//###############PHP MySQL Insert Into########################
//INSERT INTO table_name (column1, column2,...)
//VALUES (value1, value2,....)
//把来自表单的数据插入数据库
/*这是这个 HTML 表单:
<html>
<body>
<form action="insert.php" method="post">
Firstname: <input type="text" name="firstname" />
Lastname: <input type="text" name="lastname" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
*/
//当用户点击上例中 HTML 表单中的提交按钮时,表单数据被发送到 "insert.php"。"insert.php" 文件连接数据库,并通过 $_POST 变量从表单取回值。然后,mysql_query() 函数执行 INSERT INTO 语句,一条新的记录会添加到数据库表中。
/*下面是 "insert.php" 页面的代码:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "1 record added";
mysql_close($con)
?>
* */
//##############SELECT 语句用于从数据库中选取数据###########
//SELECT column_name(s) FROM table_name
//###############PHP MySQL Where 子句################
//SELECT column FROM table WHERE column operator value
//运算符
说明
// =
等于
// !=
不等于
// >
大于
//<
小于
//>=
大于或等于
//<=
小于或等于
//BETWEEN
介于一个包含范围内
//LIKE
搜索匹配的模式
//#################PHP MySQL Order By 关键词##################
//1.ORDER BY 关键词用于对记录集中的数据进行排序。
//SELECT column_name(s) FROM table_name ORDER BY column_name
//2.升序或降序的排序
//SELECT column_name(s) FROM table_name ORDER BY column_name DESC
//3.根据两列进行排序
//SELECT column_name(s) FROM table_name ORDER BY column_name1, column_name2
//################PHP MySQL Update################
//UPDATE table_name SET column_name = new_value WHERE column_name = some_value
//###########PHP MySQL Delete From############
//DELETE FROM table_name WHERE column_name = some_value
//################PHP Database ODBC###############
//连接到 ODBC
//odbc_connect() 函数用于连接到 ODBC 数据源。该函数有四个参数:数据源名、用户名、密码以及可选的指针类型参数。
/*
$conn=odbc_connect('northwind','','');
$sql="SELECT * FROM customers";
$rs=odbc_exec($conn,$sql);
*/
//取回记录
//odbc_fetch_row() 函数用于从结果集中返回记录。如果能够返回行,则返回 true,否则返回 false。
//该函数有两个参数:ODBC 结果标识符和可选的行号:
//odbc_fetch_row($rs)
//关闭 ODBC 连接
//odbc_close()函数用于关闭 ODBC 连接。
//odbc_close($conn);
/*********************PHP AJAX 简介********************************
*
*
* */
//############AJAX 简介###################
/*
AJAX = Asynchronous JavaScript And XML(异步 JavaScript 及 XML)
AJAX 是 Asynchronous JavaScript And XML 的首字母缩写。
AJAX 使用 XML 和 HTTP 请求
传统的 web 应用程序会把数据提交到 web 服务器(使用 HTML 表单)。在 web 服务器把数据处理完毕之后,会向用户返回一张完整的新网页。
由于每当用户提交输入,服务器就会返回新网页,传统的 web 应用程序往往运行缓慢,且越来越不友好。
通过 AJAX,web 应用程序无需重载网页,就可以发送并取回数据。完成这项工作,需要通过向服务器发送 HTTP 请求(在幕后),并通过当服务器返回数据时使用 JavaScript 仅仅修改网页的某部分。
一般使用 XML 作为接收服务器数据的格式,尽管可以使用任何格式,包括纯文本。
PHP 和 AJAX
不存在什么 AJAX 服务器。
AJAX 是一种在浏览器运行的技术。它使用浏览器与 web 服务器之间的异步数据传输,使网页从服务器请求少量的信息,而不是整张页面。
AJAX 是一种独立于 web 服务器软件的 web 浏览器技术。
但是,在本教程中,我们将集中在运行在 PHP 服务器上的实际案例,而不是 AJAX 的工作原理。
*/
//##################AJAX XMLHttpRequest##################
//判断IE浏览器兼容性
/*
var XMLHttp=null
if (window.XMLHttpRequest)
{
XMLHttp=new XMLHttpRequest()
}
else if (window.ActiveXObject)
{
XMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
}
*/
//下面的例子试图加载微软最新版本的 "Msxml2.XMLHTTP",在 Internet Explorer 6 中可用,如果无法加载,则后退到 "Microsoft.XMLHTTP",在 Internet Explorer 5.5 及其后版本中可用。
/*
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
}
*/
//代码解释:
//首先创建用作 XMLHttpRequest 对象的 XMLHttp 变量。把它的值设置为 null。
//按照 web 标准创建对象 (Mozilla, Opera 以及 Safari):XMLHttp=new XMLHttpRequest()
//按照微软的方式创建对象,在 Internet Explorer 6 及更高的版本可用:XMLHttp=new ActiveXObject("Msxml2.XMLHTTP")
//如果捕获错误,则尝试更老的方法 (Internet Explorer 5.5) :XMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
//##################PHP 和 AJAX 请求##################
//AJAX 请求(三个页面)
/*这是 HTML 表单。它包含一个简单的 HTML 表单和指向 JavaScript 的链接:
<html>
<head>
<script src="clienthint.js"></script>
</head>
<body>
<form>
First Name:
<input type="text" id="txt1"
οnkeyup="showHint(this.value)">
</form>
<p>Suggestions: <span id="txtHint"></span></p>
</body>
</html>
//例子解释 - HTML 表单
//正如您看到的,上面的 HTML 页面含有一个简单的 HTML 表单,其中带有一个名为 "txt1" 的输入字段。
//该表单是这样工作的:
//当用户在输入域中按下并松开按键时,会触发一个事件
//当该事件被触发时,执行名为 showHint() 的函数
//表单的下面是一个名为 "txtHint" 的 <span>。它用作 showHint() 函数所返回数据的占位符。
* */
/*JavaScript 代码存储在 "clienthint.js" 文件中,它被链接到 HTML 文档:
var xmlHttp
function showHint(str)
{
if (str.length==0)
{
document.getElementById("txtHint").innerHTML=""
return
}
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="gethint.php"
url=url+"?q="+str
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("txtHint").innerHTML=xmlHttp.responseText
}
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
}
//showHint() 函数
//每当在输入域中输入一个字符,该函数就会被执行一次。
//如果文本框中有内容 (str.length > 0),该函数这样执行:
//定义要发送到服务器的 URL(文件名)
//把带有输入域内容的参数 (q) 添加到这个 URL
//添加一个随机数,以防服务器使用缓存文件
//调用 GetXmlHttpObject 函数来创建 XMLHTTP 对象,并在事件被触发时告知该对象执行名为 stateChanged 的函数
//用给定的 URL 来打开打开这个 XMLHTTP 对象
//向服务器发送 HTTP 请求
//如果输入域为空,则函数简单地清空 txtHint 占位符的内容。
//stateChanged() 函数
//每当 XMLHTTP 对象的状态发生改变,则执行该函数。
//在状态变成 4 (或 "complete")时,用响应文本填充 txtHint 占位符 txtHint 的内容。
*
* */
/*被 JavaScript 代码调用的服务器页面是一个名为 "gethint.php" 的简单服务器页面。
<?php
// Fill up array with names
$a[]="Anna";
$a[]="Brittany";
$a[]="Cinderella";
$a[]="Diana";
$a[]="Eva";
$a[]="Fiona";
$a[]="Gunda";
$a[]="Hege";
$a[]="Inga";
$a[]="Johanna";
$a[]="Kitty";
$a[]="Linda";
$a[]="Nina";
$a[]="Ophelia";
$a[]="Petunia";
$a[]="Amanda";
$a[]="Raquel";
$a[]="Cindy";
$a[]="Doris";
$a[]="Eve";
$a[]="Evita";
$a[]="Sunniva";
$a[]="Tove";
$a[]="Unni";
$a[]="Violet";
$a[]="Liza";
$a[]="Elizabeth";
$a[]="Ellen";
$a[]="Wenche";
$a[]="Vicky";
//get the q parameter from URL
$q=$_GET["q"];
//lookup all hints from array if length of q>0
if (strlen($q) > 0)
{
$hint="";
for($i=0; $i<count($a); $i++)
{
if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))
{
if ($hint=="")
{
$hint=$a[$i];
}
else
{
$hint=$hint." , ".$a[$i];
}
}
}
}
//Set output to "no suggestion" if no hint were found
//or to the correct values
if ($hint == "")
{
$response="no suggestion";
}
else
{
$response=$hint;
}
//output the response
echo $response;
?>
//如果存在从 JavaScript 送来的文本 (strlen($q) > 0),则:
//找到与 JavaScript 所传送的字符相匹配的名字
//如果找到多个名字,把所有名字包含在 response 字符串中
//如果没有找到匹配的名字,把 response 设置为 "no suggestion"
//如果找到一个或多个名字,把 response 设置为这些名字
//把 response 发送到 "txtHint" 占位符
*
* */
//##################PHP 和 AJAX XML 实例##################
//HTML 表单
//上面的例子包含了一张简单的 HTML 表单,以及指向 JavaScript 的链接:
/*
<html>
<head>
<script src="selectcd.js"></script>
</head>
<body>
<form>
Select a CD:
<select name="cds" οnchange="showCD(this.value)">
<option value="Bob Dylan">Bob Dylan</option>
<option value="Bee Gees">Bee Gees</option>
<option value="Cat Stevens">Cat Stevens</option>
</select>
</form>
<p>
<div id="txtHint"><b>CD info will be listed here.</b></div>
</p>
</body>
</html>
*/
//例子解释:
//正如您看到的,它仅仅是一张简单的 HTML 表单,其中带有名为 "cds" 的下拉列表。
//表单下面的段落包含了一个名为 "txtHint" 的 div。这个 div 用作从 web 服务器检索到的数据的占位符。
//当用户选择数据时,会执行名为 "showCD" 的函数。这个函数的执行是由 "onchange" 事件触发的。
//换句话说,每当用户改变了下拉列表中的值,就会调用 showCD 函数。
//XML 文件
//XML 文件是 "cd_catalog.xml"。该文件中包含了有关 CD 收藏的数据。
//JavaScript
//这是存储在 "selectcd.js" 文件中的 JavaScript 代码:
/*
var xmlHttp
function showCD(str)
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="getcd.php"
url=url+"?q="+str
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("txtHint").innerHTML=xmlHttp.responseText
}
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
}
*/
//例子解释:
//stateChanged() 和 GetXmlHttpObject 函数与上一节中的相同,您可以参阅上一页中的相关解释。
//showCD() 函数
//假如选择了下拉列表中的某个项目,则函数执行:
//调用 GetXmlHttpObject 函数来创建 XMLHTTP 对象
//定义发送到服务器的 URL(文件名)
//向 URL 添加带有下拉列表内容的参数 (q)
//添加一个随机数,以防服务器使用缓存的文件
//当触发事件时调用 stateChanged
//通过给定的 URL 打开 XMLHTTP 对象
//向服务器发送 HTTP 请求
//PHP 页面
//这个被 JavaScript 调用的服务器页面,是一个名为 "getcd.php" 的简单 PHP 文件。
//这张页面是用 PHP 编写的,使用 XML DOM 来加载 XML 文档 "cd_catalog.xml"。
//代码运行针对 XML 文件的查询,并以 HTML 返回结果:
/*
<?php
$q=$_GET["q"];
$xmlDoc = new DOMDocument();
$xmlDoc->load("cd_catalog.xml");
$x=$xmlDoc->getElementsByTagName('ARTIST');
for ($i=0; $i<=$x->length-1; $i++)
{
//Process only element nodes
if ($x->item($i)->nodeType==1)
{
if ($x->item($i)->childNodes->item(0)->nodeValue == $q)
{
$y=($x->item($i)->parentNode);
}
}
}
$cd=($y->childNodes);
for ($i=0;$i<$cd->length;$i++)
{
//Process only element nodes
if ($cd->item($i)->nodeType==1)
{
echo($cd->item($i)->nodeName);
echo(": ");
echo($cd->item($i)->childNodes->item(0)->nodeValue);
echo("<br />");
}
}
?>
*/
//例子解释
//当请求从 JavaScript 发送到 PHP 页面时,发生:
//PHP 创建 "cd_catalog.xml" 文件的 XML DOM 对象
//循环所有 "artist" 元素 (nodetypes = 1),查找与 JavaScript 所传数据向匹配的名字
//找到 CD 包含的正确 artist
//输出 album 的信息,并发送到 "txtHint" 占位符
//##################PHP 和 AJAX MySQL 数据库实例##################
//省略
//##################PHP 和 AJAX responseXML 实例##################
//HTML 表单
//上面的例子包含了一个简单的 HTML 表单,以及指向 JavaScript 的链接:
/*
<html>
<head>
<script src="responsexml.js"></script>
</head>
<body>
<form>
Select a User:
<select name="users" οnchange="showUser(this.value)">
<option value="1">Peter Griffin</option>
<option value="2">Lois Griffin</option>
<option value="3">Glenn Quagmire</option>
<option value="4">Joseph Swanson</option>
</select>
</form>
<h2>
<span id="firstname"></span> <span id="lastname"></span>
</h2>
<span id="job"></span>
<div style="text-align: right">
<span id="age_text"></span>
<span id="age"></span>
<span id="hometown_text"></span>
<span id="hometown"></span>
</div>
</body>
</html>
*/
//例子解释 - HTML 表单
//HTML 表单是一个下拉列表,其 name 属性的值是 "users",可选项的值与数据库的 id 字段相对应
//表单下面有几个 <span> 元素,它们用作我们所接收到的不同的值的占位符
//当用户选择了具体的选项,函数 "showUser()" 就会执行。该函数的执行由 "onchange" 事件触发
//换句话说,每当用户在下拉列表中改变了值,函数 showUser() 就会执行,并在指定的 <span> 元素中输出结果。
//JavaScript
//这是存储在文件 "responsexml.js" 中的 JavaScript 代码:
/*
var xmlHttp
function showUser(str)
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="responsexml.php"
url=url+"?q="+str
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
xmlDoc=xmlHttp.responseXML;
document.getElementById("firstname").innerHTML=
xmlDoc.getElementsByTagName("firstname")[0].childNodes[0].nodeValue;
document.getElementById("lastname").innerHTML=
xmlDoc.getElementsByTagName("lastname")[0].childNodes[0].nodeValue;
document.getElementById("job").innerHTML=
xmlDoc.getElementsByTagName("job")[0].childNodes[0].nodeValue;
document.getElementById("age_text").innerHTML="Age: ";
document.getElementById("age").innerHTML=
xmlDoc.getElementsByTagName("age")[0].childNodes[0].nodeValue;
document.getElementById("hometown_text").innerHTML="<br/>From: ";
document.getElementById("hometown").innerHTML=
xmlDoc.getElementsByTagName("hometown")[0].childNodes[0].nodeValue;
}
}
function GetXmlHttpObject()
{
var objXMLHttp=null
if (window.XMLHttpRequest)
{
objXMLHttp=new XMLHttpRequest()
}
else if (window.ActiveXObject)
{
objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
}
return objXMLHttp
}
*/
//例子解释:
//showUser() 与 GetXmlHttpObject 函数与 PHP 和 AJAX MySQL 数据库实例 这一节中的例子是相同的。您可以参阅其中的相关解释。
//stateChanged() 函数
//如果选择了下拉列表中的项目,该函数执行:
//通过使用 responseXML 函数,把 "xmlDoc" 变量定义为一个 XML 文档
//从这个 XML 文档中取回数据,把它们放在正确的 "span" 元素中
//PHP 页面
//这个由 JavaScript 调用的服务器页面,是一个名为 "responsexml.php" 的简单的 PHP 文件。
//该页面由 PHP 编写,并使用 MySQL 数据库。
//代码会运行一段针对数据库的 SQL 查询,并以 XML 文档返回结果:
/*
<?php
header('Content-Type: text/xml');
header("Cache-Control: no-cache, must-revalidate");
//A date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
$q=$_GET["q"];
$con = mysql_connect('localhost', 'peter', 'abc123');
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("ajax_demo", $con);
$sql="SELECT * FROM user WHERE id = ".$q."";
$result = mysql_query($sql);
echo '<?xml version="1.0" encoding="ISO-8859-1"?>
<person>';
while($row = mysql_fetch_array($result))
{
echo "<firstname>" . $row['FirstName'] . "</firstname>";
echo "<lastname>" . $row['LastName'] . "</lastname>";
echo "<age>" . $row['Age'] . "</age>";
echo "<hometown>" . $row['Hometown'] . "</hometown>";
echo "<job>" . $row['Job'] . "</job>";
}
echo "</person>";
mysql_close($con);
?>
//例子解释:
//当查询从 JavaScript 送达 PHP 页面时,会发生:
//PHP 文档的 content-type 被设置为 "text/xml"
//PHP 文档被设置为 "no-cache",以防止缓存
//用 HTML 页面送来的数据设置 $q 变量
//PHP 打开与 MySQL 服务器的连接
//找到带有指定 id 的 "user"
//以 XML 文档输出数据
*/
//##################PHP 和 AJAX Live Search(模糊百度)##################
//AJAX Live Search
//在下面的 AJAX 例子中,我们将演示一个实时的搜索。
//实时的搜索与传统搜索相比,具有很多优势:
//当键入数据时,就会显示出匹配的结果
//当继续键入数据时,对结果进行过滤
//如果结果太少,删除字符就可以获得更宽的范围
/*
//HTML 表单
//这是 HTML 页面。它包含一个简单的 HTML 表单,针对此表单的 CSS 样式,以及指向 JavaScript 的链接:
<html>
<head>
<script src="livesearch.js"></script>
<style type="text/css">
#livesearch
{
margin:0px;
width:194px;
}
#txt1
{
margin:0px;
}
</style>
</head>
<body>
<form>
<input type="text" id="txt1" size="30"
οnkeyup="showResult(this.value)">
<div id="livesearch"></div>
</form>
</body>
</html>
*/
//例子解释 - HTML 表单
//正如你看到的,HTML 页面包含一个简单的 HTML 表单,其中的文本框名为 "txt1"。
//表单是这样工作的:
//当用户在文本框中按键并松开按键时,会触发一个事件
//当事件触发时,会执行名为 showResult() 的函数
//表单下面是名为 "livesearch" 的 <div> 元素。它用作 showResult() 所返回数据的占位符
//JavaScript
//JavaScript 代码存储在与 HTML 文档连接的 "livesearch.js" 中:
/*
var xmlHttp
function showResult(str)
{
if (str.length==0)
{
document.getElementById("livesearch").
innerHTML="";
document.getElementById("livesearch").
style.border="0px";
return
}
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="livesearch.php"
url=url+"?q="+str
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("livesearch").
innerHTML=xmlHttp.responseText;
document.getElementById("livesearch").
style.border="1px solid #A5ACB2";
}
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
}
*/
//例子解释:
//GetXmlHttpObject 与 PHP 和 AJAX 请求 中的例子相同。
//showResult() 函数
//该函数每当一个字符输入文本框就会执行一次。
//如果文本域中没有输入 (str.length == 0),该函数把返回字段设置为空,并删除周围的任何边框。
//不过,如果文本域中存在输入,则函数执行:
//定义发送到服务器的 url (文件名)
//把带有输入框内容的参数 (q) 添加到 url
//添加一个随机数,以防止服务器使用缓存文件
//调用 GetXmlHttpObject 函数来创建 XMLHTTP 对象,并在触发一个变化时告知此函数执行名为 stateChanged 的一个函数
//使用给定的 url 来打开 XMLHTTP 对象
//向服务器发送 HTTP 请求
//stateChanged() 函数
//每当 XMLHTTP 对象的状态发生变化时,该函数就会执行。
//当状态变为 4 (或 "complete") 时,就会使用响应文本来填充 txtHint 占位符的内容,并在返回字段周围设置一个边框。
/*
//PHP 页面
//由 JavaScript 代码调用的服务器页面是名为 "livesearch.php" 的 PHP 文件。
//"livesearch.php" 中的代码检查那个 XML 文档 "links.xml"。该文档 w3school.com.cn 上的一些页面的标题和 URL。
//这些代码会搜索 XML 文件中匹配搜索字符串的标题,并以 HTML 返回结果:
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("links.xml");
$x=$xmlDoc->getElementsByTagName('link');
//get the q parameter from URL
$q=$_GET["q"];
//lookup all links from the xml file if length of q>0
if (strlen($q) > 0)
{
$hint="";
for($i=0; $i<($x->length); $i++)
{
$y=$x->item($i)->getElementsByTagName('title');
$z=$x->item($i)->getElementsByTagName('url');
if ($y->item(0)->nodeType==1)
{
//find a link matching the search text
if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q))
{
if ($hint=="")
{
$hint="<a href='" .
$z->item(0)->childNodes->item(0)->nodeValue .
"' target='_blank'>" .
$y->item(0)->childNodes->item(0)->nodeValue . "</a>";
}
else
{
$hint=$hint . "<br /><a href='" .
$z->item(0)->childNodes->item(0)->nodeValue .
"' target='_blank'>" .
$y->item(0)->childNodes->item(0)->nodeValue . "</a>";
}
}
}
}
}
// Set output to "no suggestion" if no hint were found
// or to the correct values
if ($hint == "")
{
$response="no suggestion";
}
else
{
$response=$hint;
}
//output the response
echo $response;
?>
//例子解释:
//如果从 JavaScript 送来了任何文本 (strlen($q) > 0),会发生:
//PHP 创建 "links.xml" 文件的一个 XML DOM 对象
//遍历所有 "title" 元素 (nodetypes = 1),以便找到匹配 JavaScript 所传数据的 name
//找到包含正确 title 的 link,并设置为 "$response" 变量。如果找到多于一个匹配,所有的匹配都会添加到变量
//如果没有找到匹配,则把 $response 变量设置为 "no suggestion"
//$result 是送往 "livesearch" 占位符的输出
*/
//##################PHP 和 AJAX RSS 阅读器##################
//RSS 阅读器用于阅读 RSS Feed。
//RSS 允许对新闻和更新进行快速浏览。
//AJAX RSS 阅读器
//在下面的 AJAX 实例中,我们将演示一个 RSS 阅读器,通过它,来自 RSS 的内容在不进行刷新的情况下载入网页。
//##################PHP 和 AJAX 投票##################
//HTML 表单
//这是 HTML 页面。它包含一个简单的 HTML 表单,以及一个与 JavaScript 文件的连接:
/*
<html>
<head>
<script src="poll.js"></script>
</head>
<body>
<div id="poll">
<h2>Do you like PHP and AJAX so far?</h2>
<form>
Yes:
<input type="radio" name="vote"
value="0" οnclick="getVote(this.value)">
<br />
No:
<input type="radio" name="vote"
value="1" οnclick="getVote(this.value)">
</form>
</div>
</body>
</html>
*/
//例子解释 - HTML 表单
//正如您看到的,上面的 HTML 页面包含一个简单的 HTML 表单,其中的 <div> 元素带有两个单选按钮。
//表单这样工作:
//当用户选择 "yes" 或 "no" 时,会触发一个事件
//当事件触发时,执行 getVote() 函数
//围绕该表单的是名为 "poll" 的 <div>。当数据从 getVote() 函数返回时,返回的数据会替代该表单。
//文本文件
//文本文件 (poll_result.txt) 中存储来自投票程序的数据。
//它类似这样:
//0||0
//第一个数字表示 "Yes" 投票,第二个数字表示 "No" 投票。
//注释:记得只允许您的 web 服务器来编辑该文本文件。不要让其他人获得访问权,除了 web 服务器 (PHP)。
//JavaScript
//JavaScript 代码存储在 "poll.js" 中,并于 HTML 文档相连接:
/*
var xmlHttp
function getVote(int)
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="poll_vote.php"
url=url+"?vote="+int
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("poll").
innerHTML=xmlHttp.responseText;
}
}
function GetXmlHttpObject()
{
var objXMLHttp=null
if (window.XMLHttpRequest)
{
objXMLHttp=new XMLHttpRequest()
}
else if (window.ActiveXObject)
{
objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
}
return objXMLHttp
}
*/
//例子解释:
//stateChanged() 和 GetXmlHttpObject 函数与 PHP 和 AJAX 请求 这一节中的例子相同。
//getVote() 函数
//当用户在 HTML 表单中选择 "yes" 或 "no" 时,该函数就会执行。
//定义发送到服务器的 url (文件名)
//向 url 添加参数 (vote),参数中带有输入字段的内容
//添加一个随机数,以防止服务器使用缓存的文件
//调用 GetXmlHttpObject 函数来创建 XMLHTTP 对象,并告知该对象当触发一个变化时执行 stateChanged 函数
//用给定的 url 来打开 XMLHTTP 对象
//向服务器发送 HTTP 请求
/*
//PHP 页面
//由 JavaScript 代码调用的服务器页面是名为 "poll_vote.php" 的一个简单的 PHP 文件。
<?php
$vote = $_REQUEST['vote'];
//get content of textfile
$filename = "poll_result.txt";
$content = file($filename);
//put content in array
$array = explode("||", $content[0]);
$yes = $array[0];
$no = $array[1];
if ($vote == 0)
{
$yes = $yes + 1;
}
if ($vote == 1)
{
$no = $no + 1;
}
//insert votes to txt file
$insertvote = $yes."||".$no;
$fp = fopen($filename,"w");
fputs($fp,$insertvote);
fclose($fp);
?>
<h2>Result:</h2>
<table>
<tr>
<td>Yes:</td>
<td>
<img src="poll.gif"
width='<?php echo(100*round($yes/($no+$yes),2)); ?>'
height='20'>
<?php echo(100*round($yes/($no+$yes),2)); ?>%
</td>
</tr>
<tr>
<td>No:</td>
<td>
<img src="poll.gif"
width='<?php echo(100*round($no/($no+$yes),2)); ?>'
height='20'>
<?php echo(100*round($no/($no+$yes),2)); ?>%
</td>
</tr>
</table>
//例子解释:
//所选的值从 JavaScript 传来,然后会发生:
//获取 "poll_result.txt" 文件的内容
//把文件内容放入变量,并向被选变量累加 1
//把结果写入 "poll_result.txt" 文件
//输出图形化的投票结果
*/