PHP is a popular general-purpose scripting language that is especially suited to web development.
PHP基础
PHP简介
PHP(全称:PHP:Hypertext Preprocessor,即”PHP:超文本预处理器”)是一种通用开源脚本语言。
PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器。
PHP能做什么?
- PHP 可以生成动态页面内容
- PHP 可以收集表单数据
- PHP 可以添加、删除、修改您的数据库中的数据
PHP语法
PHP 脚本以 结束。
PHP 中的每个代码行都必须以分号结束。
1 2 3
| <?php echo "Hello World!"; ?>
|
PHP语法
- 定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。
- 函数内定义的变量就是局部变量,它的作用域为函数定义范围内。
- 函数之间存在作用域互不影响。
- 函数内访问全局变量需要
global
关键字或者使用 $GLOBALS[index]
数组
static
关键字使某个局部变量不被删除。
1 2 3 4 5 6 7 8 9 10 11 12
| <?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); echo $y; ?>
|
echo 和 print 语句
EOF(heredoc) 使用说明
PHP 定界符EOF
中是会解析 html 格式内容的,并且在双引号内的内容也有转义效果。
1 2 3 4 5 6 7 8 9 10
| <?php $name="runoob"; $a= <<<EOF <h1>EOF</h1> "abc"$name "123" EOF;
echo $a; ?>
|
数据类型
var_dump()
函数返回变量的数据类型和值
对象
1 2 3 4 5 6 7 8 9 10 11 12
| <?php $cars=array("Volvo","BMW","Toyota"); class Car { var $color; function __construct($color="green") { $this->color = $color; } function what_color() { return $this->color; } } ?>
|
类型比较
- 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
- 严格比较:用三个等号 === 比较,除了比较值,也比较类型。
常量
常量值被定义后,在脚本的其他任何地方都不能被改变。
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
1 2 3 4 5
| <?php
define("GREETING", "欢迎", true); echo greeting; ?>
|
字符串变量
*并置运算符 *(.) 用于把两个字符串值连接起来。
1 2 3 4 5
| <?php $txt1="Hello world!"; $txt2="What a nice day!"; echo $txt1 . " " . $txt2; ?>
|
strlen() 函数返回字符串的长度(字节数)。
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
echo strpos("Hello world!","world");
运算符
运算符优先级中,or 和 ||,&& 和 and 都是逻辑运算符,效果一样,但是其优先级却不一样。
1 2 3 4 5 6 7 8 9 10 11
| <?php
$a = 3; $b = false; $c = $a or $b; var_dump($c); $d = $a || $b; var_dump($d); ?>
|
If…Else
Switch
数组
1 2 3 4 5 6 7 8 9
| <?php $cars=array("Volvo","BMW","Toyota"); echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".<br>"; echo count($cars);
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); echo "<br>Peter is " . $age['Peter'] . " years old."; ?>
|
数组排序
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
超级全局变量
超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。
$GLOBALS
是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
$_REQUEST
$_REQUEST
用于收集HTML表单提交的数据。
当用户通过点击 “Submit” 按钮提交表单数据时, 表单数据将发送至
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <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
、$_GET
同样被广泛应用于收集表单数据。
While 循环
For 循环
foreach 循环
冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12
| <?php $arr = array(9,8,7,6,5,4,3,2,1); for ($i=count($arr)-1; $i>=0; $i--) { for ($j= 0; $j<$i; $j++) { if($arr[$j] > $arr[$j+1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp; } } } print_r($arr[4]);
|
函数
1 2 3 4 5
| <?php function add($x, $y) { return $x + $y; } echo '14 + 12 = ' . add(14, 12);
|
魔法常量
1 2 3 4 5 6 7 8 9 10 11
| <?php echo '该文件位于 " ' . __FILE__ . ' " <br>'; class test { function _print() { echo '类名为:' . __CLASS__ . "<br>"; echo '函数名为:' . __FUNCTION__ ; } } $t = new test(); $t->_print(); ?>
|
命名空间(namespace)
PHP 命名空间可以解决以下两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
面向对象
PHP表单
表单验证
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
$_SERVER["PHP_SELF"]
是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。所以,$_SERVER["PHP_SELF"]
会发送表单数据到当前页面,而不是跳转到不同的页面。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号) 成为 &
- “ (双引号) 成为 "
- ‘ (单引号) 成为 '
- < (小于) 成为 <
- > (大于) 成为 >
$_SERVER["PHP_SELF"]
变量有可能会被黑客使用!可以通过 htmlspecialchars() 函数来避免被利用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = test_input($_POST["name"]); $gender = test_input($_POST["gender"]); }
function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>
|
必须字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
$nameErr = $name = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必需的。"; } else { $name = test_input($_POST["name"]); } } ?> <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"> 名字: <input type="text" name="name"> <span class="error">* <?php echo $nameErr;?></span> <input type="submit" name="submit" value="Submit"> </form>
|
验证邮件和URL
1 2 3 4 5 6 7 8 9
| if (empty($_POST["name"])) { $nameErr = "Name is required"; } else { $name = test_input($_POST["name"]); // 检测名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; } }
|
$_GET 变量
预定义的$_GET
变量用于收集来自 method="get"
的表单中的值。
从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
$_POST 变量
预定义的 $_POST
变量用于收集来自 method="post"
的表单中的值。
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
PHP高级教程
多维数组
1 2 3 4 5 6 7 8 9
| $sites = array ( array("Volvo",100,96), "taobao"=>array ( "淘宝", "http://www.taobao.com" ) );
|
date() 函数
1 2 3 4 5 6
| <?php date_default_timezone_set('PRC'); echo date("Y/m/d") . "<br>"; echo date("Y.m.d") . "<br>"; echo date("Y-m-d H:i:s"); ?>
|
包含文件
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
处理错误方式不同:
- require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
- include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
<?php include 'header.php'; ?>
文件处理
fopen()、fclose()、feof()
文件上传
允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
https://www.cnblogs.com/54chensongxia/p/11662252.html#2409458956
上传限制
用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB
保存被上传的文件
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
| <?php
$allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $_FILES["file"]["name"]); echo $_FILES["file"]["size"]; $extension = end($temp); if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 204800) && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "错误:: " . $_FILES["file"]["error"] . "<br>"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件类型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " 文件已经存在。 "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "文件存储在: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "非法的文件格式"; } ?>
|
Cookie
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
Session
session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
Email
PHP 允许您从脚本直接发送电子邮件。
错误处理
在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。
1 2 3 4 5 6 7
| <?php if(!file_exists("welcome.txt")) { die("文件不存在"); } else { $file=fopen("welcome.txt","r"); } ?>
|
异常处理
异常用于在指定的错误发生时改变脚本的正常流程。
过滤器
PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。
JSON
json_encode: 对变量进行 JSON 编码
json_decode: 对 JSON 格式的字符串进行解码,转换为 PHP 变量
PHP数据库
MySQL简介
MySQL 是一种在 Web、服务器 上使用的数据库系统。
连接MySQL
实例 (MySQLi - 面向对象)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php $servername = "localhost"; $username = "username"; $password = "password";
$conn = new mysqli($servername, $username, $password);
if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "连接成功"; ?>
|
创建数据库
1 2 3 4 5 6 7 8 9
| $sql = "CREATE DATABASE myDB"; if ($conn->query($sql) === TRUE) { echo "数据库创建成功"; } else { echo "Error creating database: " . $conn->error; } $conn->close();
|
创建数据表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $sql = "CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; if ($conn->query($sql) === TRUE) { echo "Table MyGuests created successfully"; } else { echo "创建数据表错误: " . $conn->error; } $conn->close();
|
数据预处理
预处理语句对于防止 MySQL 注入是非常有用的。
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。
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
| <?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);
$firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "新记录插入成功"; $stmt->close(); $conn->close(); ?>
|
$stmt->bind_param("sss", $firstname, $lastname, $email);
bind_param函数绑定了 SQL 的参数,且告诉数据库参数的值。 “sss” 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。
参数有以下四种类型:
i - integer(整型)
d - double(双精度浮点型)
s - string(字符串)
b - BLOB(binary large object:二进制大对象)
每个参数都需要指定类型。通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。
读取数据
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
| <?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()) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; } } else { echo "0 结果"; } $conn->close(); ?>
|