简介
1.PHP文件能够包含文本、HTML、CSS 以及 PHP 代码
2.PHP 脚本可放置于文档中的任何位置。以 <?php开头,以 ?>结尾
3.只有变量对大小写敏感,变量以 $ 符号开头,变量会在首次为其赋值时被创建,
变量
PHP 有三种不同的变量作用域:
- local(局部)
- global(全局)
- static(静态)
函数之外声明的变量拥有global作用域,只能在函数以外进行访问
函数内部声明的变量拥有local作用域,只能在函数内部进行访问
global 关键词用于访问函数内的全局变量
<?php
$x=5;
$y=10;
function myTest() {
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
也可以这样写
<?php
$x=5;
$y=10;
function myTest() {
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y; // 输出 15
?>
static 关键词用于定义静态变量
<?php
function myTest() {
static $x=0;
echo $x;
$x++;
}
myTest();
myTest();
myTest();
?>
两种输出方法
echo 和 print 之间的差异:
- echo - 能够输出一个以上的字符串,无返回值
- print - 只能输出一个字符串,并始终返回 1
echo
能输出多个字符串
echo "This", " string", " was", " made", " with multiple parameters.";
能输出html标记
echo "<h2>PHP is fun!</h2>";
echo "Hello world!<br>";
echo "I'm about to learn PHP!<br>";
能输出变量
<?php
$txt1="Learn PHP";
$txt2="W3School.com.cn";
$cars=array("Volvo","BMW","SAAB");
echo $txt1;
echo "Study PHP at $txt2";
echo "My car is a {$cars[0]}";
?>
print与echo比较仅在于只能输出一个字符串
数据类型
字符串、整数、浮点数、逻辑、数组、对象、NULL
数组
定义
$cars=array("Volvo","BMW","SAAB")
调用
echo "My car is a {$cars[0]}";
对象
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
常量
define("GREETING", "Welcome to W3School.com.cn!");可选的第三个参数规定常量名是否对大小写不敏感。默认是 false
函数
function functionName(参数1,参数2...) {
被执行的代码;
}
超全局变量
:在一个脚本的全部作用域中都可用
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
<?php
$x = 75;
$y = 25;
function addition() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
$_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息 <?php 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']; ?>
元素/代码 | 描述 |
---|---|
$_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。 |
$_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>
表单常用:$_POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。$_POST 也常用于传递变量
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_POST['fname'];
echo $name;
?>
</body>
</html>
表单常用:$_GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据
<html>
<body>
<a href="test_get.php?subject=PHP&web=W3school.com.cn">测试 $GET</a>
</body>
</html>
当用户点击链接 "Test $GET",参数 "subject" 和 "web" 被发送到 "test_get.php",然后您就能够通过 $_GET 在 "test_get.php" 中访问这些值了。
下面的例子是 "test_get.php" 中的代码:
<html>
<body>
<?php
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>
</body>
</html>
表单
【表单处理】
1.用http post方法发送
2.用http get方法发送
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 来发送表单数据。
【表单验证】
需掌握:$_SERVER["PHP_SELF"]|$_SERVER["REQUEST_METHOD"]|trim()函数/stripslashes()函数/htmlspecialchars()函数
|
【表单必填】
先定义错误变量并初始为空$nameErr = $emailErr...="";
ifelse当empty()函数为真时为错误变量赋值
<span>块
【表单验证 - 验证名字、email和url】
需掌握preg_match()函数
preg_match() 函数检索字符串的模式,如果模式存在则返回 true,否则返回 false。
高级篇
多维数组
定义 $cars = array ( array("Volvo",22,18), array("BMW",15,13), array("Saab",5,2), array("Land Rover",17,15) );
输出
<?php
for ($row = 0; $row < 4; $row++) {
echo "<p><b>Row number $row</b></p>";
echo "<ul>";
for ($col = 0; $col < 3; $col++) {
echo "<li>".$cars[$row][$col]."</li>";
}
echo "</ul>";
}
?>
include和require的区别
如果用 include 语句引用某个文件并且 PHP 无法找到它,脚本会继续执行;如果使用 require 语句完成相同的案例,echo 语句不会继续执行,因为在 require 语句返回严重错误之后脚本就会终止执行。
include 'noFileExists.php'; echo "我有一辆 $color $car。";
require 'noFileExists.php'; echo “我有一辆 $color $car。”;
Filesystem文件函数
Filter过滤器函数
文件操作
打开/读取
readfile()函数读取文件,并把它写入输出缓冲
$myfile=fopen(filename,mode)or die(Unable to open file!);打开失败会生成一条消息
fclose($myfile);关闭文件
fread($myfile,filesize(filename));按最大字节数读取文件
fgets($myfile)函数读取文件单行内容,调用完成后,指针会移动到下一行
feof()检查是否已达到"end-of-file"(EOF)
fgetc()读取单个字符,调用完成后,指针会移动到下一字符
创建/写入
fopen()函数也用于创建文件
fwrite(aimfile,tmpfile)用于把tmpfile中的内容写入aimfile中
上传
test.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>
<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型
<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理
保存被上传的文件。upload.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"; } ?>
这个例子把文件保存到了名为 "upload" 的新文件夹
COOKIES
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。
one.设置cookie。语法:setcookie(name, value, expire, path, domain);其中前三项为必填
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之)
two.$_COOKIE 变量用于取回 cookie 的值:echo $_COOKIE["name"]
<?php
// Print a cookie
echo $_COOKIE["user"];
// A way to view all cookies
print_r($_COOKIE);
?>
three.setcookie("user", "", time()-3600);注释:删除 cookie 时,您应当使过期日期变更为过去的时间点
Session
Quetion:由于 HTTP 地址不能维持状态,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库中。
Answer:Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
1.session_start() 函数启动/注册会话(同时为用户分配一个UID)
注释:session_start() 函数必须位于 <html> 标签之前
2.存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量。即简单的变量赋值和输出
3.unset() 或 session_destroy() 函数删除某些 session 数据
unset($_SESSION['views']);//删除指定的session变量
session_destroy();//彻底终结session
mail(reciever,subject,message,headers,parameters)//前三项为必选
error
1.简单的"die()"语句
<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
2.自定义错误和错误触发器
3.错误报告
exception
在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常,也称异常处理。
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。
如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。
1.try throw catch的关系
<?php
//创建可抛出一个异常的函数
function f($exa)
{
if错误→throw new exception("提示性语句");
else xxx;
}
try//try中触发异常
{
function($myexa);
}
//捕获异常
catch(Exception $any)
{
echo 'Message: ' .$any->getMessage();
}
?>
2.自定义exception类
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = xxx;
return $errorMsg;
}
}
$email = "someone@example...com";
try
{
//check if
if错误
throw new customException(语句/此处为$email);
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
?>
注:可继承函数父类的this->getLine()/this->getFile()/this->getMessage()等函数
3.多个异常
class SONclass extends Exception {...} try() { if...throw new Exception(xxx); else...throw new SONclass(xxx); } catch(Exception $any)... catch(SONclass $any)...
4.重新抛出异常
class SONclass extends Exception {...} try() { try() {throw new Exception(xxx);} catch(Exception $any) {throw new SONclass(xxx);} } catch(SONclass $any) {...}
5.顶层异常处理器
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
异常的规则
- 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
- 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
- 使用多个 catch 代码块可以捕获不同种类的异常。
- 可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
简而言之:如果抛出了异常,就必须捕获它。
MySQL
1.连接数据库。
语法
mysql_connect(servername,username,password);
$con = mysql_connect("localhost","root","123");
脚本结束断绝连接,也可自动断绝连接
mysql_close($con);
2.创建数据库/数据库表。
CREATE DATABASE database_name用于创建数据库
mysql_query("CREATE TABLE my_db",$con)向数据库发送查询命令
if (mysql_query("CREATE DATABASE my_db",$con)) { echo "Database created"; }
CREATE TABLE table_name用于创建数据库表
CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name3 data_type, .......
)
mysql_select_db("my_db", $con); $sql = "CREATE TABLE Persons ( FirstName varchar(15), LastName varchar(15), Age int )"; mysql_query($sql,$con);
重要事项:在创建表之前,必须首先选择数据库。通过 mysql_select_db() 函数选取数据库。
注释:当您创建 varchar 类型的数据库字段时,必须规定该字段的最大长度,例如:varchar(15)。
3.插入数据
INSERT INTO 语句用于向数据库表添加新记录。
语法
INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,....)
mysql_query("INSERT INTO Persons (FirstName, LastName, Age) VALUES ('Peter', 'Griffin', '35')");
add:将html表单元素插入数据库
4.数据从数据库中选择数据
SELECT 语句用于从数据库中选取数据。
语法
SELECT column_name(s) FROM table_name
column_name(s) * 字符代表选取表中所有数据
选择
mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM Persons");
输出
while($row = mysql_fetch_array($result)) { echo $row['FirstName'] . " " . $row['LastName']; echo "<br />"; }
5.WHERE条件查询
语法
SELECT column FROM table WHERE column operator value检索条件 = != > < >= <= BETWEEN LIKE AND
$result = mysql_query("SELECT * FROM Persons WHERE FirstName='Peter'");
6.ORDER BY对数据进行排序
语法
mysql_select_db("my_db", $con);
$result = mysql_query("SELECT * FROM Persons ORDER BY age");
SELECT column_name(s) FROM table_name ORDER BY column_name DESC注:DESC关键词设定为降序排序
7.UPDATE更新数据库表中的数据
语法
UPDATE table_name SET column_name = new_value WHERE column_name = some_value
mysql_select_db("my_db", $con); mysql_query("UPDATE Persons SET Age = '36' WHERE FirstName = 'Peter' AND LastName = 'Griffin'");
8.DELETE FROM 语句用于从数据库表中删除记录。
语法
DELETE FROM table_name WHERE column_name = some_value
mysql_select_db("my_db", $con); mysql_query("DELETE FROM Persons WHERE LastName='Griffin'");