前者学PHP之PDO基础操作

方法
PDO – 构造器,营造3个新的PDO对象
beginTransaction – 先河工业作
commit – 提交业务
errorCode – 从数据库再次回到八个荒谬代号,要是部分话
errorInfo – 从数据库重回三个饱含错误音讯的数组,即使局地话
exec – 执行一条SQL语句并赶回影响的行数
getAttribute – 再次来到一个数据库连接属性
lastInsertId – 重回最新插入到数据库的行(的ID)
prepare –
为实践准备一条SQL语句,重返语句执行后的协同结果集(PDOStatement)
query – 执行一条SQL语句并再次回到三个结实集
quote – 再次来到添加了引号的字符串,以使其可用来SQL语句中
rollBack – 回滚3个事务
setAttribute – 设置多个数据库连接属性

日前的话

  PDO(php data
object)扩展类库为php访问数据库定义了轻量级的、一致性的接口,它提供了四个数据库访问抽象层,那样,无论使用什么数据库,都可以因此平等的函数执行查询和获取数据,大大简化了数据库的操作,并能够屏蔽不一致数据库之间的出入,使用PDO能够很有利地展开跨数据库程序的支付,以及不一样数据库间的移植,是他日php在数据库处理方面的最首要发展大势,它能够支撑mysql、postgresql、oracle、mssql等三种数据库

show variables like '%slow%';

事务处理

  事务是确定保障数据库一致的机制,是3个或一多如牛毛的询问,作为五个单元的一组有序的数据库操作。假诺组中的全部SQL语句都操作成功,则以为工作成功,事务则被交给,其修改将成效于拥有其余数据库进度。即便在工作的组中唯有三个环节操作战败,事务也不成事,则整个事情将被回滚,该业务中具备操作都被注销。事务效用是商店级数据库的2个根本片段,因为众多业务进程都包涵多个步骤。假使其余二个手续失利,则有起先续都不应产生。事务处理有4个性情:原子性(Atomicity)、一致性(Consistency)、独立性(Isolation)和持久性(Durability),即ACID。对于在一个工作中实施的其余工作,尽管它是分等级展开的,也必将能够保障该工作会安全地利用于数据库,并且在办事被提交时,不晤面临别的连接的熏陶

  MySQL方今只有InnoDB和BDB多少个数据库表类型才支撑工作,七个表类型具有同等的表征,InnoDB表类型具有比BDB还抬高的性状,速度更快,因而提议接纳InnoDB表类型。创制InnoDB类型的表实际上与成立任何其余类型表的进程并未分别,假设数据库没有安装为默许的表类型,只要在成立时显式钦点要将表创立为InnoDB类型

  要兑现事务处理,首先要动用InnoDB引擎

ALTER TABLE contactInfo engine=innodb;

图片 1

  在私下认可的气象下,MySQL是以自行提交(autocommit)格局运转的,那就表示所推行的每三个口舌都将及时写入数据库中。但若是使用工作安全的报表类型,是不希望有自动
提交的行事的,所以要在如今的对话中关闭自动提交

SET AUTOCOMMIT = 0;//在当前的会话中关闭自动提交

  即使提交被打开了,必须开启二个业务;要是自动提交是关门的,则不供给运用那条命令,因为输入3个SQL命令时,二个事情将自行运营

START TRANSACTION;//开启一个事务

  在形成了一组织工作作的语句输入后,需求提交1个事务,该业务才能在任何会话中被其余用户所见

COMMIT;//提交一个事务给数据库

  即便改变注意,能够回滚到从前的处境

ROOLBACK;//事务被回滚,所有操作都被取消

  事务处理完结后,再度开启自动提交

SET AUTOCOMMIT = 1;

图片 2

  下边在PHP中实行事务处理操作,对张三和李四进行部门调换到轮流作育

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");    //设置错误使用异常的模式    $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    //关闭自动提交    $dbh-> setAttribute(PDO::ATTR_AUTOCOMMIT, 0);}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}try {    //开启一个事务    $dbh -> beginTransaction();    $affected_rows = $dbh->exec("UPDATE contactInfo set departmentID = 'D02' where uid=1");    if($affected_rows > 0) {        echo "张三转岗成功!<br>";    } else {        throw new PDOException("张三转岗失败!<br>");    }    $affected_rows = $dbh-> exec("UPDATE contactInfo set departmentID = 'D01' where uid=2");    if($affected_rows) {        echo "李四转岗成功!<br>";    }else {        throw new PDOException("李四转岗失败!<br>");    }    echo "轮岗成功!<br>";    //提交以上的操作    $dbh->commit();    }catch(PDOException $e) {    echo "错误:".$e->getMessage();    echo "转岗失败!<br>";    //撤销所有操作    $dbh -> rollback();}//运行完成以后, 最后开启自动提交$dbh-> setAttribute(PDO::ATTR_AUTOCOMMIT, 1);?>

图片 3

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    foreach ($dbh->query('SELECT * from FOO') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

使用PDO对象

调整PDO的一言一行性质

  在PDO对象中有许多属性用来调动PDO的表现或取得底层驱动程序状态。如若在创设PDO对象时,没有在构造方法中最终1个参数过属性选项,也足以在指标创制达成今后,通过PDO对象中的setAttribute()和getAttribute()方法设置和得到那几个属性的值

PDO::getAttribute()

  PDO::getAttribute()用于取回3个数据库连接的性质

mixed PDO::getAttribute ( int $attribute )

PDO::setAttribute()

  PDO::setAttribute()用于安装属性

bool PDO::setAttribute ( int $attribute , mixed $value )

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//$dbh->setAttribute; $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT,0);//$dbh->setAttribute; $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);//$dbh->setAttribute; echo "\nPDO是否关闭自动提交功能:". $dbh->getAttribute(PDO::ATTR_AUTOCOMMIT);echo "\n当前PDO的错误处理的模式:". $dbh->getAttribute(PDO::ATTR_ERRMODE); echo "\n表字段字符的大小写转换: ". $dbh->getAttribute(PDO::ATTR_CASE); echo "\n与连接状态相关特有信息: ". $dbh->getAttribute(PDO::ATTR_CONNECTION_STATUS); echo "\n空字符串转换为SQL的null:". $dbh->getAttribute(PDO::ATTR_ORACLE_NULLS); echo "\n应用程序提前获取数据大小:".$dbh->getAttribute(PDO::ATTR_PERSISTENT); echo "\n与数据库特有的服务器信息:".$dbh->getAttribute(PDO::ATTR_SERVER_INFO); echo "\n数据库服务器版本号信息:". $dbh->getAttribute(PDO::ATTR_SERVER_VERSION);echo "\n数据库客户端版本号信息:". $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION); 

错误处理

  PDO一共提供了两种不一样的错误处理方式,不仅能够满意分化风格的编制程序,也得以调整扩张处理错误的主意

PDO:ERRORMODE_SILENT

  那是暗中同意形式,在错误产生时不进行任何操作,PDO将只设置错误代码。开发人士能够由此PDO对象中的errorCode()和errorInfo()方法对讲话和数据库对象开始展览检查。若是不当是出于对话语对象的调用而发生的,那么能够在丰盛语句对象上调用errorCode()或errorInfo()方法。如若不当是由于调用数据库对象而发出的,那么能够在相当数据库对象上调用上述七个法子

PDO:ERRMODE_WARNING

  除了设置错误代码以外,PDO还将发出一条PHP守旧的E_WA索罗德NING信息,能够动用正规的PHP错误处理程序捕获该警告。假使只是想看看产生了怎么样难点,而无意识中断应用程序的流程,那么在调节和测试或测试中那种设置很有用

$dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//设置警告模式处理错误

PDO:ERRMODE_EXCEPTION

  除了安装错误代码以外,PDO还将抛出3个PDOException,并设置其属性,以显示错误代码和错误新闻。那种装置在调节和测试中也很有用,因为它会推广脚本中发生错误的地点,从而能够丰富便捷地提出代码中不不荒谬的心腹区域。至极方式另二个卓有成效的地点是,与历史观的PHP风格的警示比较,能够更清晰地结构自个儿的错误处理,而且,比起以冷静情势及显式检查每一种数据库调用的再次来到值,格外方式代码及嵌套代码也更少

$dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置异常模式处理错误

执行SQL语句

  在使用PDO执行查询数据从前,先提供一组有关的数目。成立PDO对象并经过mysql驱动连接mysql数据库服务器,创制二个以’testdb’命名的数据库,并在该数据库中创立一个关系人音信表contactInfo

CREATE TABLE contactInfo(    uid MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,    name VARCHAR(50) NOT NULL,    departmentID CHAR NOT NULL,    address VARCHAR(80) NOT NULL,    phone VARCHAR(20),    email VARCHAR(20),    PRIMARY KEY;

  数据表contactInfo建立之后,向表中插入多行记录

INSERT INTO contactInfo(name,departmentID,address,phone,email) VALUES ('张三','D01','朝阳','15011111234','zs@aaa.com'),('李四','D02','朝阳','15011112345','ls@aaa.com'),('王五','D02','海淀','15011113456','ww@aaa.com'),('赵四','D01','海淀','15011114567','zx@aaa.com');

图片 4

PDO::exec()

  PDO::exec()函数执行一条SQL语句,并赶回受影响的行数

int PDO::exec ( string $statement )

  当执行INSEGL450T、UPDATE、DELETET等尚未结果集的询问时,使用PDO对象中的exec()方法去履行。该办法成功推行后,将回来受影响的行数

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "UPDATE contactInfo SET phone='12345678900' WHERE name='张三'";$affected = $dbh->exec($query);if($affected){    //数据表contactInfo中受影响的行数为:1    echo '数据表contactInfo中受影响的行数为:' .$affected;}else{    print_r($dbh->errorInfo;}$query = "UPDATE contactInfo SET phone='123456789' WHERE (uid%2 = 0)";$affected = $dbh->exec($query);if($affected){    //数据表contactInfo中受影响的行数为:2    echo '数据表contactInfo中受影响的行数为:' .$affected;}else{    print_r($dbh->errorInfo;}?>

图片 5

PDO::lastInsertId()

  PDO::lastInsertId()函数用于重返最终插入行的ID或种类值

string PDO::lastInsertId ([ string $name = NULL ] )

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}try{    $query = "INSERT INTO contactInfo(name,departmentID,phone,email) VALUES ('诸葛','D03','120120120','zg@aaa.com')";    $affected = $dbh->exec($query);        echo $affected."<br>";//1    echo $dbh->lastInsertId();//5}catch(PDOException $e){    echo "错误:" .$e->getMessage();}?>

图片 6

PDO::query()

  当执行回来结果集的SELECT查询时,可能所影响的行数非亲非故主要时,应当选择PDO对象中的query()方法。假如该方法成功推行钦命的询问,则赶回贰个PDOStatement对象。假如利用了query()方法,并想掌握获取的数额行总数,能够选取PDOStatement对象中的rowCount()方法取得

PDOStatement::rowCount()

  PDOStatement::rowCount()函数重临受上多少个 SQL 语句影响的行数

int PDOStatement::rowCount 

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "SELECT name,phone,email FROM contactInfo WHERE departmentId='D01'";try{    $pdostatement = $dbh->query($query);        echo "一共从表中获取到".$pdostatement->rowCount()."条记录:<br>";    foreach($pdostatement as $row){        echo $row['name'] ."\t";        echo $row['phone'] ."\t";        echo $row['email'] ."<br>";    }}catch (PDOException $e){    echo $e->getMessage();}?>

图片 7

1)尽量制止在列上举行演算,那样会造成索引失效。
2)使用join时,应该用小结果集驱动大结果集。同时把复杂的join查询拆分成五个query。因为join多少个表时,或然造成越多的锁定和杜绝。
3)注意Like模糊查询的应用,防止%%。
4)避免select ,仅列出须求查询的字段,节省外部存款和储蓄器。
5)使用批量插入语句节省交互。
6)limit的基数相比较大时行使between。
7)不要使用rand函数获取多条随机记录。
8)防止使用NULL。
9)不要采纳count(id),而相应是count(
)。
10)不要做无谓的排序操作,而应尽大概在目录中成就排序。

创建PDO对象

  使用PDO在与不一样数据库管理体系里面相互时,PDO对象中的成员方法是联合种种数据库的访问接口,所以在利用PDO与数据库进行交互以前,首先要制造1个PDO对象。在经过构造方法创设对象的同时,须要建立一个与数据库服务器的接连,并选拔多个数据库

  PDO的构造方法原型如下

__construct ( string $dsn [,string $username [,string $password [,array $driver_options ]]] )

  在构造方法中,第二个必选的参数是数码源名,用来定义三个鲜明的数据库和必须采取的驱动程序。DSN的PDO命名惯例为PDO驱动程序的称呼,前边为1个冒号,再后边是可选的驱动程序的数据库连接变量新闻,如主机名、端口和数量库名

  构造方法中的第2个参数username和第多个参数password分别钦点用于连接数据库的用户名和密码。最终多个参数driver_options要求三个数组,用来内定连接所需的有着额外选项,传递附加的调优参数到PDO或尾部驱动程序

/*连接如果失败,使用异常处理模式进行捕获 */$dsn = 'mysql:dbname=pdotest;host=127.0.0.1'; //连接MySQL数据库的DSN $user = 'root'; //MySQL数据库的用户名$password = '*****'; //MySQL数据库的密码try {      $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) {       echo '数据库连接失败: ' . $e->getMessage(); }

  在开立PDO对象时,有一些与数据库连接相关的选项,能够将须要的多少个挑选组成数据传递给构造方法的第11个参数driver_opts中,用来传递附加的调优参数到PDO或底层驱动程序

 PDO::ATTR_AUTOCOMMIT): PDO是否关闭自动提交功能 PDO::ATTR_ERRMODE): 当前PDO的错误处理的模式  PDO::ATTR_CASE): 表字段字符的大小写转:  PDO::ATTR_CONNECTION_STATUS): 与连接状态相关特有信息:  PDO::ATTR_ORACLE_NULLS): 空字符串转换为SQL的null  PDO::ATTR_PERSISTENT): 应用程序提前获取数据大  PDO::ATTR_SERVER_INFO): 与数据库特有的服务器信  PDO::ATTR_SERVER_VERSION): 数据库服务器版本号信息 PDO::ATTR_CLIENT_VERSION): 数据库客户端版本号信息 

//设置持久连接的选项数组作为最后一个参数,可以一起设置多个元素 $opt = array(PDO::ATTR_PERSISTENT => true);   try {        $db = new PDO('mysql:dbname=pdotest;host=127.0.0.1','root','*****',$opt); } catch (PDOException $e) {        echo "数据库连接失败: " .$e->getMessage(); }

PDOStatement类:代表一条预处理语句以及讲话执行后的同步结果集(associated
result set)。

银行转账业务、电子商务开发工作等等。

MySQL:进度式风格,最常用。
MySQLi:MySQL的滋长扩展,提供了过程化面向对象三种风格的API,扩张了预编译和参数绑定等新特性,
但只帮忙MySQL。
PDO:在语法上更近乎MySQLi,但PDO扩大只是二个架空的接口层,利用PDO扩充自我并无法兑现任何数据库操作,必须采取三个特定的数据库PDO驱动访问数据库。PDO援助多样数据库,不管访问MySQL依然Oracle,都足以用相同的API对数码实行操作。

优化内需从多地点讲
1 sql级别的优化
2 建表的优化
3 mysql配置的优化
4 操作系统级别优化
5 硬件相关优化

6.1 sql级别的优化
SQL优化的一般步骤:
1.经过show status命令理解种种SQL的执行功能。
2.定位执行效能较低的SQL语句-(重点select)。
3.通过explain分析低作用的SQL。
4.分明难点并行使对应的优化措施。

6.5 硬件相关优化
接纳好的cpu,好的内部存储器条,ssd硬盘,互联网带宽加大。

[参考资料] php事务处理实例详解
http://www.poluoluo.com/jzxy/201410/315255.html

2. 贰个pdo类里面,基本上有怎么着东西?

方法
bindColumn – 绑定二个PHP变量到结果集中的输出列
bindParam – 绑定2个PHP变量到一个预处理语句中的参数
bindValue – 绑定三个值到与处理语句中的参数
closeCursor – 关闭游标,使说话能够重复实施
columnCount – 再次回到结果集中的列的多寡
errorCode – 从言语中回到3个破绽百出代号,假诺局地话
errorInfo – 从言语中回到3个分包错误新闻的数组,假设局地话
execute – 执行一条预处理语句
fetch – 从结果集中取出一行
fetchAll – 从构造集中取出二个包涵了全数行的数组
fetchColumn – 重返结果集中某一列中的数据
getAttribute – 重回三个 PDOStatement 属性
getColumnMeta – 重回结果集中某一列的结构(metadata?)
nextRowset – 重返下一结实集
rowCount – 再次来到SQL语句执行后影响的行数
setAttribute – 设置3个PDOStatement属性
setFetchMode – 为 PDOStatement 设定获取数据的不二法门

2)适度使用Query Cache。
3)扩张MySQL允许的最明斯克接数。
4)对于MyISAM表适当扩张key_buffer_size,注意table_cache的设置。
5)对于InnoDB表,注意innodb_buffer_pool_size参数。
6)从表中删除大量行后,可运营OPTIMIZE TABLE TableName举办零散整理。

3. 工效用来干什么?

$dsn = 'mysql:dbname = testdb; host = 127.0.0.1';   // 配置PDO的数据源
$user = 'dbuser';
$password = 'dbpass';
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
/* 事务处理开始,关闭自动提交事务(autocommit) */
$dbh->beginTransaction();
/* 更改数据库结构 */
$sth = $dbh->exec("DROP TABLE fruit");
/* 提交事务 */
$dbh->commit();

6. mysql属性优化有如何?

6.3 mysql配置的优化

6.2 建表的优化

选取仓库储存引擎的主干条件如下:

1)2个表不要有太多的字段;
2)注意字段的命名和数据类型;
3)数据量过大时考虑分表;
4)选用适用的数据库引擎。

PDO中涵盖四个约定义类:PDO、PDOStatement和PDOException:
PDO类:代表二个PHP和数据库之间的连日。

工作四大特征(简称ACID) :
原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部成功,要么均不履行。
一致性(Consistency):多少个并行执行的政工,其履行结果必须与按某一依次串行执行的结果相平等。
隔离性(Isolation):事务的施行不受别的工作的纷扰,事务执行的中档结果对任何作业必须是晶莹剔透的。
持久性(Durability):对于自由已交付业务,系统必须确定保障该事务对数据库的改观不被遗失,就算数据库出现故障。

4. 事务的性状都有何?

MySQL的业务天性就是要求那组操作要不全都成功,要不全都退步。那样就防止了有些操作成功有些操作退步,有利于数据的安全。
根本有四个操作:
begin 起初三个作业
rollback 事务回滚
commit 事务确认

1)
关闭不需求的二进制日志和慢查询日志,仅在内部存款和储蓄器充裕或支付调节和测试时打开它们。
行使下边包车型地铁语句查看查询是还是不是打开:

注:MySQL的事务处理效用在MYSIAM存款和储蓄引擎中是不扶助的,在InnoDB存款和储蓄引擎中是支撑的。

[参考资料] 详解PHP中的PDO类 http://www.jb51.net/article/68963.htm

[参考链接]
Mysql数据库品质优化一 http://www.jb51.net/article/82254.htm
Mysql数据库品质优化二 http://www.jb51.net/article/82257.htm

比如:
用户下订单同时一度付出,若是有两张表,订单表和用户账户表。
当用户点击确认支付的时候须求对那两张表展开操作,如若对订单表的操作成功了、对用户账户表的操作失败了,此时订单状态是已支付,但用户的钱却没扣掉,商行就就亏了。
那时候假诺应用事务,就足以回滚,提醒用户支付战败,数据表没有发生任何变更。

PDOException类:对Exception非常基类的重写,重返PDO触发的失实。

也就是:
再者更新七个记录,但中间3个更新退步,则整个后退到立异操作起来此前。
唯有任何翻新成功,才确认写入DB。

5. 已给数据库的操作中,怎么能确定保障那个特点都做到呢?

1. mysql形似的接连方式都有何,各自优缺点。

还是能够运用下边包车型大巴话语查看慢查询的条数,定期打开方便优化:

在改变数据库从前,大家要翻开事务,begin(或start transaction);
好端端实施大家的sql语句;
当sql语句执行实现,存在三种情景:
1)全都成功,我们要将sql语句对数据库造成的震慑提交到数据库中,commit;
2)有个别sql语句失利或程序报那么些,就捕捉极度,并rollback(回滚),将对数据库操作赶紧撤消,那样数据Curry面包车型客车数目就不会有职分的号码变化。

6.4 操作系统级别优化
运用六九个人的系统,因为陆拾陆个人的内存远比三1二个人的内部存储器大。

  • 采用MyISAM引擎
    卡宴/W>100:1,且update相对较少;
    出现不高,不需求事物;
    表数据量小;
    硬件财富有限。
  • 采用InnoDB引擎
    福睿斯/W相比小,频仍更新大字段;
    表数据量抢先一千万,并发高;
    安全性和可用性要求高。
  • 采用Memory引擎
    有丰盛的内部存款和储蓄器;
    对数据一致性供给不高,如在线人数和session等选拔;
    需求定期归档的数目。
show global status like '%slow%';