PDO 笔记

命名空间概念

  • 什么是命名空间
    • 命名空间是一种封装事物的方法:列如:函数,类,方法等
    • 命名空间作用:用来解决命名类或应用程序名冲突问题
    • 项目中会用到第三方类,第三方类加载进来后,可能与项目中的类名冲突

定义命名空间的要求

  • namespace关键字来申明一个命名空间
  • 所有的代码都可以存在于命名空间中
  • 只有三种代码会受到空间影响:类、常量(const)、函数
  • 除了类、常量(const)、函数,其它代码也可以写到空间中,但不受到空间影响,其它代码相当于全局代码,可以在任何地方正常使用
  • 申明语法命名空间的语法:必须是PHP脚本的第一行代码

​ namespace.php

<?php 
//定义命名空间
//(相当于新建了个文件夹 下面的代码都在这个文件夹中 类、函数、常量(const) 必须通过App\来访问)
namespace App;
class Student {
	private $name = "小明";
	private $age = 18;
	public function __construct(){
		echo $this->name."今年".$this->age."岁了";
	}
}

function showInfo(){
	echo "<h1>18计算机</h1>";
}

const DB_HOST = "127.0.0.1";

​ app.php

<meta charset="utf-8">
<?php 
//引用namespace.php
 require_once("./namespace.php");
//通过 空间名\来创建Student对象
$obj = new App\Student();
//通过 空间名\来调用方法
App\showInfo();
//通过 空间名\获取 const 常量
echo App\DB_HOST;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r1xdRBY5-1573642488840)(img/image-20191109192114071.png)]

定义子空间命名

  • 文件夹可以有子目录的情况,命名空间也有子空间情况

  • 目录的分隔号是/ ,空间的分隔号是\ namespace.php

    <?php 
    //定义子命名空间
    namespace App\Home;
    class Student {
    	private $name = "小明";
    	private $age = 18;
    	public function __construct(){
    		echo $this->name."今年".$this->age."岁了";
    	}
    }
    
    function showInfo(){
    	echo "<h1>18计算机</h1>";
    }
    
    const DB_HOST = "127.0.0.1";
    
    

    ​ app.php

    <meta charset="utf-8">
    <?php 
    //引用namespace.php
     require_once("./namespace.php");
    //通过 空间名\来创建Student对象
    $obj = new App\Home\Student();
    //通过 空间名\来调用方法
    App\Home\showInfo();
    //通过 空间名\获取 const 常量
    echo App\Home\DB_HOST;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YobAQaEj-1573642488842)(img/image-20191109192114071.png)]

同一文件同时定义多个命名空间

不建议在同一文件定义多个命名空间

  • 简单组合语法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JkovoQTS-1573642488846)(img/image-20191109195239285.png)]

  • 大括号语法
    • 写了大括号语法文件中所有的命名空间都应该使用大括号
    • 除了类名、函数、常量(const)的其它代码也要写到括号中去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8FH926Yi-1573642488848)(img/image-20191109195331057.png)]

  • 不包含在命名空间中的代码
    • 如果一个文件用大括号语法定义了多个命名空间,全局代码不想放到命名空间中那怎么写?
    • 直接namespace{} 申明匿名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekY0PGr0-1573642488850)(img/image-20191109195102132.png)]

使用命名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wikk9fGn-1573642488853)(img/image-20191109202305133.png)]

  • 相对访问

​ namespace.php

<?php 
namespace App{
	class Student {
		private $name = "小明";
		private $age = 18;
		public function __construct(){
			echo $this->name."今年".$this->age."岁了<br/>";
		}
	}
	//相对定位
	//创建学生对象
	$obj = new Student();        //当前命名空间下的Student
	$obj2 = new Home\Student2(); //当前命名空间下的Home命名空间下的Student2
	
}

//定义全局空间
namespace App\Home{
	class Student2 {
		private $name = "小红";
		private $age = 18;
		public function __construct(){
			echo $this->name."今年".$this->age."岁了";
		}
	}
}

​ app.php

<meta charset="utf-8">
<?php 
//引用namespace.php
 require_once("./namespace.php");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arXqsSUL-1573642488855)(img/image-20191109202721071.png)]

  • 绝对访问

​ namespace.php 代码不变同上

​ app.php

<meta charset="utf-8">
<?php 
//引用namespace.php
 require_once("./namespace.php");
 echo "<hr/>";
 //绝对定位
$obj3 =new \App\Student();      // 根空间下的App下的Student
$obj4 =new \App\Home\Student2();// 根空间下的App下的Home下的Student2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bSBgUS2o-1573642488857)(img/image-20191109203308838.png)]

namespace关键字和魔术方法__NAMESPACE__

  • namespace 含义之一,申明空间关键字
  • namespace含义二,可以用来自接代表当前空间名,相当于self关键字
<?php 
namespace App{
	header("content-type:text/html;charset=utf-8");
	class Student{
		public function __construct(){
			echo "小明今年18了";
		}
	}
	//namespace 相当于self
	$obj = new namespace\Student();
}
  • 魔术常量__NAMESPACE__

    • 获取当前命名空间的字符串名称
<?php 
namespace App{
	header("content-type:text/html;charset=utf-8");
	class Student{
		public function __construct(){
			echo "小明今年18了";
		}
	}
	//__NAMESPACE__ 获取到的是字符串的空间名
	$strObj = __NAMESPACE__."\Student";
    //创建对象
	$obj = new $strObj();
}

命名空间别名/导入

  • 首先导入空间中的类,常量和函数不能导入
  • 使用 use 关键字来导入空间中的类、例如:use APP]Home\Student
  • 使用 use 关键字来导入空间名 、例如: use App\Home
  • 使用 as 关键字,可以给空间或类起个别名
    • 给空间起别名 use App\Home as Controller
    • 给空间中的类起别名 use App\Home\Student as Student2
<?php 
header("content-type:text/html;charset=utf-8");
require_once('./02.php');
//use 导入空间名 默认空间名为最后一个单词
use App\Home;
$obj = new Home\Student("导入空间名");
// 导入起别名 默认空间名就是起的别名
use App\Home as ap;
$obj2 = new ap\Student("导入起空间别名");
//导入空间中的类 默认类名为最后一个单词
use App\Home\Student;
$obj3 = new Student("导入空间中的类");
//导入空间中的类 并起别名 默认类名就是起的别名
use App\Home\Student as stu;
$obj4 = new stu("导入类 起别名");	

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UlCKHyAD-1573642488858)(img/image-20191110144550536.png)]

命名空间在项目中使用

  • 空间目录与文件真实物理路基要相同
<?php 
header("content-type:text/html;charset=utf-8");
spl_autoload_register(function ($className){
	//将空间路径 转成 真实的物理路径
	//此时空间路径为 libs\Db 要转换成 ./libs/Db.class.php
	$href = "./".str_replace('\\','/',$className).".class.php";
	echo "转换后真实路径--->".$href."|-|-|->|";
	//转换后 引用进来
	if (file_exists($href)) require_once($href);
});

$arr = array(
	"db_host" => "127.0.0.1",
	"db_user" => "root",
	"bd_pass" => "root",
	"bd_name" => "test",
	"charset" => "utf8",
);
$db = libs\Db::getInstance($arr);
var_dump($db);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJRMREyF-1573642488859)(img/image-20191110152516525.png)]

PDO

  • PDO 就是 PHP Data Object 的简称

  • PDO 主要用来代替数据库操作类

  • PDO 就是一个系统类

  • PHP 同时可以操作多个数据库,例如: MySQL、SQL Server 、Oracle 、Db2等

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXfY006W-1573642488859)(img/image-20191110154110160.png)]

  • PDO访问流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izlac5W1-1573642488861)(img/image-20191110154606128.png)]

PDO 开启扩展

  • 打开php.ini 配置文件
  • 搜索 php_pdo_mysql 找到 extension=php_pdo_mysql.dll
  • 取消前面的 ; 注释 保存 重启服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JU2wDCL6-1573642488863)(img/image-20191110155239638.png)]

  • 查看是否开启
<?php 
//查看php以开启的配置
phpinfo();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvRuaT7S-1573642488865)(img/image-20191110155537124.png)]

PDO 连接 MySQL

  • 创建一个表示数据库连接的 PDO 对象
PDO::__construct( string $dsn[, string $username[, string $password[, array $driver_options]]] )
  • 参数
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QT8ONAED-1573642488866)(img/image-20191110161351106.png)]
<?php
//      数据库类型:主机;端口号;数据库名;字符集;
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$username = "root";
$password = "root";
$pdo = new PDO($dsn,$username,$password);
var_dump ($pdo);

PDO exec (增删改)

  • 执行SQL语句 除了select 和 show
//执行插入语句
$insertSql = "INSERT INTO `student` VALUES (null,'小明','男',18,'高中')";
$row = $pdo->exec($insertSql);
//简单判断
if ($row <= 0 ){
	die("新增失败");
}
echo $row."条记录成功";

PDO query(查)

  • 只执行select 和 show语句,并返回一个结果集对象(PDOstatement)
//查询所有数据并排序(倒叙)
$selectSql = "SELECT * FROM `student` ORDER BY Id DESC";
//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
//循环结果集 输出
foreach ($PDOstatement as $arr ) {
	var_dump($arr);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDpGMOcc-1573642488869)(img/image-20191110164559332.png)]

PDO lastInsertId (获取id值)

  • 返回最后插入行的ID或序列值
//执行插入语句
$insertSql = "INSERT INTO `student` VALUES (null,'小明','男',18,'高中')";
$row = $pdo->exec($insertSql);
echo "Id为:".$pdo->lastInsertId()."的数据记录成功";

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jTtbyZu-1573642488871)(img/image-20191110165300456.png)]

PDO setAttribute()

  • 设置属性
  • PDO::ATTR_CASE:强制列名为指定的大小写。
    • PDO::CASE_LOWER:强制列名小写。
    • PDO::CASE_NATURAL:保留数据库驱动返回的列名。
    • PDO::CASE_UPPER:强制列名大写。
  • PDO::ATTR_ERRMODE:错误报告。
    • PDO::ERRMODE_SILENT:仅设置错误代码。
    • PDO::ERRMODE_WARNING: 引发 E_WARNING 错误
    • PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。
  • PDO::ATTR_DEFAULT_FETCH_MODE:设置默认的提取模式。关于模式的说明可以在 PDOStatement::fetch() 文档找到。
    • PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组 {[“name” ]=> “小明”}
    • PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组 {[“name” ]=> "小明[0] => “小明”}
    • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组 {[0] => “小明”}
//查询所有数据并排序(倒叙)
$selectSql = "SELECT * FROM `student` ORDER BY Id DESC";
//在执行之前 设置提取数据模式
$pdo->setAttriBute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
//循环输出
foreach ($PDOstatement as $arr ) {
	var_dump($arr);
	
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rNysEUu-1573642488872)(img/image-20191110171428114.png)]

fetcAll()

  • 返回一个包含结果集中所有行的数组(二维数组)
//查询所有数据并排序(倒叙)
$selectSql = "SELECT * FROM `student` ORDER BY Id DESC";

//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
//查询结果集对象中的所有数据 
$arrs = $PDOstatement->fetchAll(PDO::FETCH_ASSOC);
var_dump($arrs);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arMUaoXw-1573642488882)(img/image-20191110172226191.png)]

fetchColumn()

  • 从结果集中返回单独的一列
  • 默认返回0列的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NbU3FiXr-1573642488883)(img/image-20191110173215915.png)]

<?php
header("content-type:text/html;charset=utf-8");
//      数据库类型:主机;端口号;数据库名;字符集;
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$username = "root";
$password = "root";
$pdo = new PDO($dsn,$username,$password);
//根据id查总数据数 根据age求和
$selectSql = "SELECT COUNT(Id),SUM(age) FROM `student`";
//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
// 从结果集对象中获取第0列数据
$row = $PDOstatement->fetchColumn(0);
echo " 总数据为:".$row."条";

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgcH0BJC-1573642488884)(img/image-20191110173410488.png)]

rowCount()

  • 返回受上一个 SQL 语句影响的行数 (总记录数)
$selectSql = "SELECT * FROM `student`";
//执行语句 拿到结果集对象
$PDOstateement = $pdo->query($selectSql);
//获取到总记录数
$row = $PDOstateement->rowCount();
echo " 总数据为:".$row."条";

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaYX92a1-1573642488885)(img/image-20191110173410488.png)]

PDO 错误报告模式

  • PDO 错误报告模式有三种:静默模式、警告模式、异常模式
  • 静默模式(silent),当PDO执行SQL语句有错时,不显示任何错误(默模式认
  • 警告模式 (warning), 当PDO 执行SQL语句有错时。用PHP的错误等级来报告信息
  • 异常模式 (exception),当PDO执行SQL语句有错时,先抛出异常后捕获异常

获取错误信息函数

  • PDO::errorCode() : 获取错误状态码。如果状态码为“00000”,表示无错误
  • PDO::errorinfo(): 获取描述性的信息

警告模式 (推荐使用)

  • 要想报告“错误模式错误”,必须先设置错误报告模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDMaYn4n-1573434746042)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573434550641.png)]

<?php
	header("content-type:text/html;charset=utf-8");
	$sdn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
	$username= "root";
	$password = "root";
	//创建pdo对象
	$pdo = new PDO($sdn,$username,$password);
	//设置PDO报错模式
	$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
	//查询数据
	try{
		$sql = "SELECT1 * FROM `student`";
		$PDOStatement =  $pdo->query($sql);
		foreach ($PDOStatement as $key ) {
			var_dump($key);
		}
	}catch(PDOException $e){
		echo "错误行号:".$e->getLine();
		echo "<br/>错误文件:".$e->getFile();
		echo "<br/>错误状态码:".$e->getCode();
		echo "<br/>错误描述信息:".$e->getMessage();
	}

在这里插入图片描述

PDO预处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-srePjBgN-1573438603620)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573438506125.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7Mdnhnp-1573438603622)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573438536703.png)]

PDO预处理的步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-437G78si-1573438603623)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573436626231.png)]

1 制作相同结构的SQL语句

//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(:name,:age)";
//(2)使用占位符“?”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(?,?)";

2 预备役相同结构的SQL语句 ($pdo->prepare())

//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(:name,:age)";
//(2)预备役相同结构的SQL语句,返回结果集对象
$PDOStatement = $pdo->prepare($sql);

3 给占位符绑定真正的数据 $PDOSatement->bindValue()

//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(:name,:age)";
//(2)预备役相同结构的SQL语句,返回结果集对象
$PDOStatement = $pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue(":name","小明");
$PDOStatement->bindValue(":age","18");
//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(?,?)";
//(2)预备役相同结构的SQL语句,返回结果集对象
$PDOStatement = $pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue("1","小明");
$PDOStatement->bindValue("2","18");

4 PDOStatement::excute()

  • 执行绑定的sql语句
<?php
	header("constent:text/html;charset=utf-8");
	$sdn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
	$username = "root";
	$password = "root";
	//创建pdo对象
	$pdo = new PDO($sdn,$username,$password);
	//使用占位符“:value”来代替真正的数据 新增语句
	$sql = "INSERT INTO `student` VALUES(null,:name,:sex,:age,:education)";
	//预备役相同结构的SQL语句,返回结果集对象
	$PDOSatement = $pdo->prepare($sql);
	//给占位符绑定真正的数据
	$PDOSatement->bindValue(":name","小明明");
	$PDOSatement->bindValue(":sex","男");
	$PDOSatement->bindValue(":age","18");
	$PDOSatement->bindValue(":education","大专");
	//执行预编译的sql语句
	$PDOSatement->execute();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值