有经验的开发人员避开了,因为它被遗弃的状态在PHP的MySQL扩展。新生的Web开发人员,不过,可能完全无视其休眠的过去和垂死的未来。
连接到MySQL从PHP是肯定的入门教程丰富,是显而易见的,从一个简单的“PHP和MySQL教程”谷歌搜索。这只是不幸的是,他们中的许多教导如何使用原来的MySQL扩展。引导那些想学习如何与他们的数据库只有一个三个潜在的扩展,让他们在即将到来的重大版本的PHP将很快成为无用的技能,新的开发。
反过来,这又增加了人依靠的扩展,在某些情况下,把它作为一个和唯一的数据库访问方法,。这意味着“软折旧”需要慢慢的延长逐步淘汰使用尽可能少的影响尽可能为用户尚未切换到一个新的扩展。
因此,这个由两部分组成的文章的意图,提高认识,开发人员仍然使用的MySQL扩展,告知他们的问题,并帮助他们切换到一个替代的扩展。毕竟,谁真的想知道,它不会在不久的将来版本的PHP编写一个脚本吗?在这一部分中,我们将重点放在MySQLi的,在第二部分中,我们将着眼于PDO。
与MySQL扩展出了什么问题呢?
除了一个事实,即它是目前在这个过程中被废弃的,似乎有可能是没有错与原来的MySQL扩展。挖得更深一些,但到PHP的历史,可以很容易地看到为什么许多开发人员避免使用它。一直保持只因为PHP 4.3.1的扩展。这意味着任何新的功能被添加到MySQL扩展是最后一次,早在2002年年底。这是10年来积累的功能,你就错过了!
如果这听起来不坏的话,最后一个版本的MySQL API集成到PHP从MySQL 4.0.0。这意味着扩展不处理任何多年来由MySQL的API添加的新功能。
替代#1:库MySQLi – MySQL的改进
有两个主要的与MySQL数据库交互的替代品。首先是MySQLi的,或MySQL改进的,面向对象和程序的API扩展,公开。
的程序相比,MySQL扩展的API之间的差异是最小的,但收益是显着的。拥有超过100所提供的MySQLi的功能,它相形见绌的扩展,其中有一个只有48功能。这些新功能带来了新的功能,我们会通过后,我们已经熟悉了自己的基础知识。
MySQLi的基础
首先,让我们创建一个连接到MySQL数据库,然后执行一些基本的查询与它进行交互。
03 | $ DB = mysqli_connect( '主人' , '用户名' , '密码' ); |
04 | mysqli_select_db( $分贝 , “数据库” ); |
07 | $ DB = mysqli_connect( '主人' , '用户名' , '密码' , '数据库' ); |
09 | 如果 (mysqli_connect_errno的()){ |
10 | 死亡 (mysqli_connect_error()); |
14 | $分贝 = 新 的MySQLi( '主人' , '用户名' , '密码' , '数据库' ); |
16 | 如果 ( $ - > connect_errno的){ |
17 | 死 ( $ DB - > connect_error); |
当使用的程序执行中,我们提出用两种方式连接到数据库。第一是更类似于原来的MySQL扩展主机连接的数据库连接,需要更多一点的代码分隔开来。第二种方法是一样的MySQLi的API,数据库名称作为参数传递的面向对象的接口。然后,我们可以检查是否有错误,当试图连接到数据库质疑的mysqli_connect_errno()
返回。检索使用mysqli_connect_error()
的错误消息。
随着面向对象的实现,我们实例化的MySQLi
类,并通过构造函数的参数中的所有连接的详细信息。然后检查可以进行的connect_errno的
属性,看看是否有错误的,可以检索从connect_error
属性和相应的错误信息。
现在让我们来对数据库进行一些基本的相互作用。
03 | $email = "In'valid@email.com" ; |
07 | $clean [ 'name' ] = mysqli_real_escape_string( $db , $name ); |
08 | $clean [ 'email' ] = mysqli_real_escape_string( $db , $email ); |
10 | mysqli_query( $db , "INSERT INTO table_name |
11 | VALUES (NULL, '{$clean[' name ']}' , '{$clean[' email ']}' )"); |
13 | mysqli_query( $db , "UPDATE table_name |
14 | SET name = 'Thomas' WHERE email = '{$clean[' email ']}' "); |
16 | $result = mysqli_query( $db , "SELECT name FROM table_name |
17 | WHERE email = '{$clean[' email ']}' "); |
19 | if ( $row = mysqli_fetch_assoc( $result )) { |
22 | echo 'No results found.' ; |
26 | $clean [ 'name' ] = $db ->real_escape_string( $name ); |
27 | $clean [ 'email' ] = $db ->real_escape_string( $email ); |
29 | $db ->query("INSERT INTO table_name |
30 | VALUES (NULL, '{$clean[' name ']}' , '{$clean[' email ']}' )"); |
32 | $db ->query("UPDATE table_name |
33 | SET name = 'Thomas' WHERE email = '{$clean[' email ']}' "); |
35 | $result = $db ->query("SELECT name FROM table_name |
36 | WHERE email = '{$clean[' email ']}' "); |
38 | if ( $row = $result ->fetch_assoc()) { |
41 | echo 'No results found.' ; |
从原来的MySQL扩展库MySQLi的程序API的主要区别是强制性的连接链路在mysqli_
功能(可以在PHP手册中的所有函数和方法/属性的完整列表)作为第一个参数传递。这当然是不同的MySQL扩展,它通过连接链路作为最后一个参数是可选的。
我们不必通过连接链路作为一个参数传递给该对象的方法在面向对象的方法,因为它的一部分MySQLi的
实例的状态保持。此外,所有由库MySQLi
类的方法和属性也省略了的mysqli_,
前缀,和的mysqli_stmt_
省略的MySQLi_stmt
类的属性和方法。
有什么新的MySQLi?
现在,我们已经熟悉了自己与这两个API的基础知识,让我们一起来看看,它引入了一些新功能:预处理语句,多查询和交易。
准备的语句
准备好的语句,也被称为参数化查询,通过这个API的主要功能之一。准备的语句被认为是安全的MySQL的mysql_real_escape_string()
函数,因为他们不容易出现人为错误。如果MySQL的原生转义功能是不正确的,那么它仍然可以离开敞开的安全漏洞,在Web应用程序。
可以应用参数化查询,像这样:
03 | $email = "In'valid@email.com" ; |
06 | $insQuery = mysqli_prepare( $db , 'INSERT INTO table VALUES (NULL, ?, ?)' ); |
07 | mysqli_stmt_bind_param( $insQuery , 'ss' , $name , $email ); |
08 | mysqli_stmt_execute( $insQuery ); |
11 | $insQuery = $db ->prepare( 'INSERT INTO table VALUES (NULL, ?, ?)' ); |
12 | $insQuery ->bind_param( 'ss' , $name , $email ); |
当创建一份事先准备好的声明中,我们插入问号(没有用引号括起来,否则他们将被视为字符串值),以确定该值的查询中的约束。这些被称为占位符,在这种情况下是没有名字的,因为MySQLi的不支持命名的占位符(与PDO)。我们已经准备好了查询后,我们可以绑定的参数。
着眼于面向对象的API,第一个参数的bind_param得到()
方法,我们想投的值绑定时他们指定的参数类型。有四种类型:(字符串),我(整数),D(双),B(BLOB)。所有必须在较低的情况下只使用,和字母,其表示的参数类型的数目必须匹配的数目的值,需要结合(即使所有的值将要投相同)。
bind_param得到()
方法中的一个新的参数,然后通过为每个需要结合到准备好的查询的值,该值。有约束力的值将被分别转换中的第一个参数的类型顺序。然后,我们可以执行我们准备好的语句,安全地插入到查询中的所有的值。
多查询
介绍MySQLi的下一个主要特性是支持多条语句。这是我们能够由分号分隔堆放在一个查询的SQL语句,然后执行一次。这是一种非常有效的功能,但也可以是破坏性的,如果外源值在查询中还没有被正确地转义后方可使用。
多查询,我们是无法使用参数化查询,因为他们无法准备多个报表,一气呵成。语句都单独准备,这将需要更多的代码,但代价是更大的易读性和潜在的人为错误。
交易
我们来看看最后一个功能是对事务的支持,提供您使用的是InnoDB存储引擎。交易经常被描述为具有ACID属性:
- 原子状态的行动完全发生,或没有在所有。
- 一致性是符合现行规则在地方设置新的数据到数据库中。如果不验证输入的数据,然后将被退回。
- 隔离是指正在进行交易的状态,它必须保持单独从其他交易,直至全部完成。
- 耐久度说话的数据库发生故障后,能够承受更新的数据丢失,例如功率损耗。它说,一旦一个事务,一直致力于将继续这样做。
交易时,我们常用的SQL语句块是相互依存的一个另一个。这使得它更重要的是要确保他们要么发生成功,并承诺等,要么全部失败。
我们可以检验这个理论的交易的执行重复插入一个表,其中一个字段有一个唯一键约束时设置:
02 | mysqli_autoCommit( $db , false); |
04 | $resultA = mysqli_query( $db , "INSERT INTO table_name |
05 | VALUES (NULL, 'Tom' , 'email@address.com' )"); |
06 | if ( $resultA === false) { |
10 | $resultB = mysqli_query( $db , "INSERT INTO table_name |
11 | VALUES (NULL, 'Tom' , 'email@address.com' )"); |
12 | if ( $resultB === false) { |
在创建事务时,我们首先呼吁的mysqli_autoCommit()
函数。如果您使用的是面向对象的API,它的第二个参数(或者第一个参数),应设置为false,不允许数据库来保存你的变化,你发出的每个查询。这是必要的,以防止任何的改变被保存之前,你确定交易已经完全成功。一旦修改已经保存,不能回滚。
然后我们执行我们的查询,检查,如果他们失败,如果任何失败,那么变化会不会影响到数据库的。但是,如果是不回滚在交易过程中,那么我们就可以成功提交所有的变化与mysqli_commit()
。在上面的例子中,我们的第二个INSERT语句会失败,因为重复的条目被提交,这意味着什么都将被插入到数据库中。
总结
本文展示了轻松的切换到新的和更熟悉的库MySQLi API,以及给你两个很好的理由,你应该放弃使用MySQL扩展:它是目前被弃用(和将正式不赞成使用的PHP 5.5.0),扩展已经成为非常落伍。我希望这是迁移到新的MySQLi的API更容易一些,所以,我们终于可以完全看到后面的MySQL扩展。
不要忘记检查出的PHP手册有关的MySQLi和图书馆的功能和内置类的更多信息,敬请关注,并为第二部分,当我们看PDO。
本文固定链接: http://www.wangxionghui.com/201302962.html | 武汉SEO|湖北网站建设