PHP提供的另一种,数据库的操作方式,以对象的方式.(类比成MySQLDB)
数据库抽象层的方式,操作数据的。
抽象层:指的是不体现某种数据库具体操作,而是可以针对多种数据库类型都进行操作的功能。
PHP底层实现的,用C写的。效率会高些。
抽象层:抽取的公共操作的集合
数据驱动:具体的数据库操作的实现。
开启PDO,与需要的驱动的扩展支持。PDO的扩展内置的,而不是mysql驱动,不是内置。extension=php_pdo_mysql.dll(php.ini)
与OOP语法为基础操作????对象的方法调用
需要为构造方法传递
dsn:data source name 数据源名称:用于标识一个数据库的来源(在哪)
在127.0.0.1 主机的3306 端口的mysql数据库服务器上的 shop 数据库。
mysql:host = 127.0.0.1:port = 3306;dbname=shop
数据源前缀(数据库服务器的类型):数据源选项
用户:
密码:
驱动选项:支持很多驱动独立的配置选项
典型的,设置连接字符串
PDO::MYSQL_ATTR_INIT_COMMAND,mysql驱动的初始化命令,典型的设置成 set names utf8
利用PDO对象的query方法,可以完成语句的发送:
存在返回数据的SQL,在执行后,返回一个语句对象,对象内封装了对所有记录结果的操作。
PDOstatement类的对象,就是结果对象。
利用该对象,将数据取出
销毁对象即可
对SQL初次操作都是使用PDO对象,后续操作PDOstatement对象。
分成 存在 返回数据 与 不存在返回数据 调用的方法是不一样。
$pdo->query();使用于执行存在返回数据SQL语句。
$pdo->exec();使用于执行 没有返回数据的SQL
增,删,改,没有返回数据。
该方法,返回ini数据,表示,当前影响的记录数(删除了几行,更新了几行)
$PDOstatement->fetchAll();
默认返回的是索引和关联,可以通过第一个参数加以设置:????
PDO::FETCH_ASSOC;关联
PDO::FETCH_NUM;索引
PDO::FETCH_BOTH;全部,默认
$PDOstatement->fetch()获取一条记录
$PDOstatement->fetchColumn();第一条记录的第一个数据
提供了三个封装方法:
$pdo->beginTransaction;开启事务
$pdo->commit();提交
$pdo->rollback;回滚
$pdo->lastInsert();
mysql扩展,发生了sql的执行错误,不报错:称之为静默模式。
PDO在发生sql错误时呢?默认也是静默模式。
PDO还支持其他的错误模式:
三种:静默模式????silent mode
????警告模式:出现错误,触发一个警告级别的标准错误
????异常模式:出现错误,抛出一个异常
默认的,出现错误,没有任何提示,需要判断执行结果,才知道是否存在错误。
通过设置PDO对象的属性,达到修改错误模式的目的:$pdo->setAttribute(属性标识,属性值)
使用错误的处理方法:
????$pdo->errorCode();
????$pdo->errorInfo()完成处理
也是一种错误,发生在PHP的oop代码中,对错误的一种对象形式的封装处理。
set_error_handler()
异常处理分成三个阶段:
抛出,相当于触发。throw来抛出异常
监视与捕获,相当于处理阶段。
try {
????可能抛出异常的代码段
????if () {
????throw 异常
}
} catch () {
????//捕获异常
}
其中,异常,就是一个对象,应该是Exception类(异常类)及其子类(扩展类)的对象。
PDO抛出的是Exception类的子类PDOException类的对象
执行SQL的一种方式,也是MySQL执行的方法。
将单纯的中心一条语句的过程,拆分成:SQL编译(预处理),数据绑定,执行三个阶段。
$sql = "insert into it_goods (goods_id, goods_name, shop_price) values (null, 'itcast', 1234.56)";
当需要,重复的执行若干条SQL语句,但是SQL的语句结构相同,只是数据不同时:除掉数据部分,结构部分相同
可以,先编译结构部分,再将数据绑定上,最后执行。此时可升掉每次编译相同结构的SQL的时间,称之为预处理的执行方式。
使用pdo,可以完成上面的执行方式。
数据的部分,应该使用问号,或者是:标识符 加以代替:
使用PDO对象的prepare()方法可以完成:该方法返回一个PDOstatement对象,用于后续处理
使用PDOstatement对象的bindValue()或者bindParam()来完成。
利用PDOstatement对象的execute()完成:
典型应该是:所有的数据准备好,循环绑定执行:
另外一个预编译的优势,在于可以对数据自动地转义处理:
如果没有转义,典型的:但引号会发生SQL语句冲突,导致错误。
例如mysql_query()不会自动转义:
典型的使用mysql_real_escape_data对需要参与sql执行的SQL数据做处理
该对mysql数据转义的工作非常重要:影响到网站的安全!
如何避免:理论上,将所有参与SQL执行的数据,都先做处理才可以:
甚至:会将所有$_GET,$_POS内的数据转义之后才使用。
建议:只针对参与SQL执行的数据
以上危害:称之为:SQL-inject SQL注入。利用用户数据,影响SQL的执行结果。