方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。
eg:<?php echo $_POST["fname"]; ?>
<?php echo $_POST["age"]; ?>
$_REQUEST
包含了 $_GET、$_POST 和 $_COOKIE 的内容。
可用来收集通过 GET 和 POST 方法发送的表单数据。
eg:<?php echo $_REQUEST["fname"]; ?>
<?php echo $_REQUEST["age"]; ?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
日期
date()将时间戳转化为可读性好的日期
eg:
<?php
echo date("Y/m/d") . "<br>";
echo date("Y.m.d") . "<br>";
echo date("Y-m-d");
?>
http://www.runoob.com/php/php-date.html
include & require
在服务器执行php之前在该文件中插入一个文件的内容
include如果出错,会继续执行下去
require如果出错,会终止后续的执行
eg:
<?php include 'header.php'; ?>
文件
fopen() 用于打开文件
fclose()用于关闭文件
feof() 检测文件是否到达末尾
fgets() 逐行读取文件
fgetc() 逐字符读取文件
http://www.runoob.com/php/php-file.html
文件上传
文件上传表单+处理php代码
表单:
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
enctype表示提交表单时使用的内容类型
type="file"规定将输入作为文件处理
文件上传是一个安全风险,要谨慎开放
使用$_FILES作为文件上传的容器
通过对$_FILES的各个属性做限制来约束上传文件的属性
$_FILES["file"]["name"] - 上传文件的名称
$_FILES["file"]["type"] - 上传文件的类型
$_FILES["file"]["size"] - 上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码
上传之后还需要保存的操作,将其拷贝到upload文件夹下,否则只有一个临时的文件副本。
eg:
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
} else {
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
Cookie
常用于识别用户
是一种服务器留在用户计算机上的小文件,当同一台计算机通过浏览器请求页面时,这台计算机将会发送cookie
setcookie() 设置cookie值 必须位于<html>标签之前
setcookie(name, value, expire, path, domain); //cookie名,值,过期时间(单位是秒),路径,主机名
setrowcookie() 设置原始cookie,不会被URL编码
$_COOKIE['cookie名'] 取回cookie值
eg:
<?php
if (isset($_COOKIE["user"]))
echo "欢迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通访客!<br>";
?>
将expire的时间设置为过去,值设置为空即可删除该cookie
eg:
<?php
// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
Session
用于存储关于用户会话的信息,或者更改用户会话的设置。
Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
Session 的工作机制:
为每个访客创建一个唯一的 id (UID),并于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
启动会话
session_start()
必须位于<html>标签之前
向服务器注册会话以便保存用户信息并分配一个UID
存储和引用Session
$_SESSION['session名']
销毁Session
unset($_SESSION['session名']) 释放指定的session变量
session_destroy() 彻底销毁session 将会重置session会失去所有为未储的session
E-mail
mail(to,subject,message,headers,parameters)
*需要有一个已安装且正在运行的邮件系统,通过php.ini设置
为了防止注入攻击需要对输入做检查和过滤
filter_var()
错误处理
报错时会直接将错误发送给浏览器包含文件名,行号,错误的消息,但这显然是不安全的
解决办法:
A. die(),用if...else...添加判断,如果出错,用die()返回提示消息,但是这种办法会终止脚本的执行
eg:
<?php
if(!file_exists("welcome.txt"))
{
die("文件不存在");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
B. 创建自定义错误处理器
error_function(error_level,error_message,error_file,error_line,error_context)
http://www.runoob.com/php/php-error.html
eg:
function customError($errno, $errstr)// 错误处理函数
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}
set_error_handler("customError");// 设置错误处理函数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
异常
try throw catch结构来实现,总体和Java是类似的
可以抛出多个异常被多个catch捕获并处理
可以重新抛出异常,对用户显示友好的提示,对后台显示真正的错误位置(在catch块中再次throw)
顶层异常处理器,用于处理所有未被捕获的异常,set_exception_handler()
过滤器
过滤的目的是防止非安全来源的数据对系统造成破坏
表单数据,cookies,web服务数据,服务器变量,数据库查询结果都是外部数据都需要过滤
filter_var() - 通过一个指定的过滤器来过滤单一的变量
filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
filter_input - 获取一个输入变量,并对它进行过滤
filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
参数包含待过滤的变量和过滤器(例如,FILTER_VALIDATE_EMAIL用于验证传入的变量是否是一个email地址)
过滤器种类和过滤函数参考链接http://www.runoob.com/php/php-ref-filter.html
过滤器有两类Validating和Sanitizing
V用于验证用户输入,有严格的格式规则(URL,E-mail),如果成功则返回预期的类型否则返回false
S用于允许或禁止字符串中指定的字符,无数据格式规则,始终返回字符串
通过filter callback可以调用自己设置的过滤器,参数有一个关联数组,键为options
<?php
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_runoob_com!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>
http://www.runoob.com/php/php-filter.html
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
PHP与mySQL
A. 连接和关闭数据库
有mysqli和PDO两种办法,mysqli专用,PDO通用
mysqli:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
//关闭连接
$conn->close();
?>
PDO:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {
//需要指定数据库名
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
echo "连接成功";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
//关闭连接
$conn = null;
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
B. 创建数据库
mysqli:
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . $conn->error;
}
PDO:
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE myDBPDO";
// 使用 exec() ,因为没有结果返回,如果出错会抛出异常进入catch块
$conn->exec($sql);
echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
C. 创建表
和标准sql一样的办法,执行过程与B类似,mysqli判断返回值真假,PDO直接exec()
D. 插入、修改、删除数据
和标准sql一样的办法,执行过程与B类似,mysqli判断返回值真假,PDO直接exec()
E. 查询数据
mysqli:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);//返回查询结果集
if ($result->num_rows > 0) {
// 输出每行数据
while($row = $result->fetch_assoc()) {//fetch_assoc用于取出每一个结果
echo "<br> id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"];
}
} else {
echo "0 个结果";
}
$conn->close();
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
PDO:
<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th><th>Email</th><th>Reg date</th></tr>";//设置表头
class TableRows extends RecursiveIteratorIterator { //构造出一个表的结构
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width: 150px; border: 1px solid black;'>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "\n";
}
}
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM MyGuests");
$stmt->execute();
// 设置结果集为关联数组
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
$dsn = null;
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
F. 预处理语句
目的:
在大量重复操作时,提高数据库操作效率,节省带宽
防止SQL注入攻击,
mysqli:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 预处理及绑定
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);//sss表示后续共三个参数,每个参数都是string类型 i(int) d(double) s(string) b(BLOB二进制大对象)
// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "新记录插入成功";
$stmt->close();
$conn->close();
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
PDO:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 预处理 SQL 并绑定参数,这里与mysqli略有不同
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// 插入行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
// 插入其他行
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
// 插入其他行
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "新记录插入成功";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>