PHP自写类库,究竟该采用mysqli pdo还是PDO呢?

PHP5.2至5.6的新增功能详解 - ThinkPHP框架
看完本篇,你会明白国内的PHP环境和ThinkPHP为啥要采用PHP5.3甚至更高的版本。
截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].
因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣。
本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征。PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束PHP5.2:JSON 支持PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,PharPHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改PHP5.5:yield, list() 用于 foreach, 细节修改PHP5.6: 常量增强,可变函数参数,命名空间增强注:已于2011年1月停止支持:
注:PHP5.2以前(2006前)
顺便介绍一下 PHP5.2 已经出现但值得介绍的特征。autoload大家可能都知道 __autoload() 函数,如果定义了该函数,那么当在代码中使用一个未定义的类的时候,该函数就会被调用,你可以在该函数中加载相应的类实现文件,如:function&__autoload($classname)&{
&&&&require_once(&{$classname}.php&)
}但该函数已经不被建议使用,原因是一个项目中仅能有一个这样的 __autoload() 函数,因为 PHP 不允许函数重名。但当你使用一些类库的时候,难免会出现多个 autoload 函数的需要,于是 spl_autoload_register() 取而代之:spl_autoload_register(function($classname)
&&&&require_once(&{$classname}.php&)
});spl_autoload_register() 会将一个函数注册到 autoload 函数列表中,当出现未定义的类的时候,SPL [注] 会按照注册的倒序逐个调用被注册的 autoload 函数,这意味着你可以使用 spl_autoload_register() 注册多个 autoload 函数.
注:SPL: Standard PHP Library, 标准 PHP 库, 被设计用来解决一些经典问题(如数据结构).PDO 和 MySQLi即 PHP Data Object, PHP 数据对象,这是 PHP 的新式数据库访问接口。
按照传统的风格,访问 MySQL 数据库应该是这样子://&连接到服务器,选择数据库
$conn&=&mysql_connect(&localhost&,&&user&,&&password&);
mysql_select_db(&database&);
//&执行&SQL&查询
$type&=&$_POST['type'];
$sql&=&&SELECT&*&FROM&`table`&WHERE&`type`&=&{$type}&;
$result&=&mysql_query($sql);
//&打印结果
while($row&=&mysql_fetch_array($result,&MYSQL_ASSOC))
&&&&foreach($row&as&$k&=&&$v)
&&&&&&&&print&&{$k}:&{$v}\n&;
//&释放结果集,关闭连接
mysql_free_result($result);
mysql_close($conn);为了能够让代码实现数据库无关,即一段代码同时适用于多种数据库(例如以上代码仅仅适用于MySQL),PHP 官方设计了 PDO.
除此之外,PDO 还提供了更多功能,比如:
o面向对象风格的接口
oSQL预编译(prepare), 占位符语法
o更高的执行效率,作为官方推荐,有特别的性能优化
o支持大部分SQL数据库,更换数据库无需改动代码
上面的代码用 PDO 实现将会是这样://&连接到数据库
$conn&=&new&PDO(&mysql:host=dbname=database&,&&user&,&&password&);
//&预编译SQL,&绑定参数
$query&=&$conn-&prepare(&SELECT&*&FROM&`table`&WHERE&`type`&=&:type&);
$query-&bindParam(&type&,&$_POST['type']);
//&执行查询并打印结果
foreach($query-&execute()&as&$row)
&&&&foreach($row&as&$k&=&&$v)
&&&&&&&&print&&{$k}:&{$v}\n&;
}PDO 是官方推荐的,更为通用的数据库访问方式,如果你没有特殊需求,那么你最好学习和使用 PDO.
但如果你需要使用 MySQL 所特有的高级功能,那么你可能需要尝试一下 MySQLi, 因为 PDO 为了能够同时在多种数据库上使用,不会包含那些 MySQL 独有的功能。
MySQLi 是 MySQL 的增强接口,同时提供面向过程和面向对象接口,也是目前推荐的 MySQL 驱动,旧的C风格 MySQL 接口将会在今后被默认关闭。
MySQLi 的用法和以上两段代码相比,没有太多新概念,在此不再给出示例,可以参见 PHP 官网文档 [注]。
注:类型约束通过类型约束可以限制参数的类型,不过这一机制并不完善,目前仅适用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.//&限制第一个参数为&MyClass,&第二个参数为可执行类型,第三个参数为数组
function&MyFunction(MyClass&$a,&callable&$b,&array&$c)
&&&&//&...
}PHP5.2()JSON 支持包括 json_encode(), json_decode() 等函数,JSON 算是在 Web 领域非常常用的数据交换格式,可以被 JS 直接支持,JSON 实际上是 JS 语法的一部分。
JSON 系列函数,可以将 PHP 中的数组结构与 JSON 字符串进行转换:$array&=&array(&key&&=&&&value&,&&array&&=&&array(1,&2,&3,&4));
$json&=&json_encode($array);
echo&&{$json}\n&;
$object&=&json_decode($json);
print_r($object);输出:{&key&:&value&,&array&:[1,2,3,4]}
stdClass&Object
&&&&[key]&=&&value
&&&&[array]&=&&Array
&&&&&&&&&&&&[0]&=&&1
&&&&&&&&&&&&[1]&=&&2
&&&&&&&&&&&&[2]&=&&3
&&&&&&&&&&&&[3]&=&&4
)值得注意的是 json_decode() 默认会返回一个对象而非数组,如果需要返回数组需要将第二个参数设置为 true.PHP5.3()
PHP5.3 算是一个非常大的更新,新增了大量新特征,同时也做了一些不向下兼容的修改。
弃用的功能
以下几个功能被弃用,若在配置文件中启用,则 PHP 会在运行时发出警告。Register Globals这是 php.ini 中的一个选项(register_globals), 开启后会将所有表单变量($_GET和$_POST)注册为全局变量.
看下面的例子:if(isAuth())
&&&&$authorized&=&
if($authorized)
&&&&include(&page.php&);这段代码在通过验证时,将 $authorized 设置为 true. 然后根据 $authorized 的值来决定是否显示页面.
但由于并没有事先把 $authorized 初始化为 false, 当 register_globals 打开时,可能访问 /auth.php?authorized=1 来定义该变量值,绕过身份验证。
该特征属于历史遗留问题,在 PHP4.2 中被默认关闭,在 PHP5.4 中被移除。Magic Quotes对应 php.ini 中的选项 magic_quotes_gpc, 这个特征同样属于历史遗留问题,已经在 PHP5.4 中移除。
该特征会将所有用户输入进行转义,这看上去不错,在第一章我们提到过要对用户输入进行转义。
但是 PHP 并不知道哪些输入会进入 SQL , 哪些输入会进入 Shell, 哪些输入会被显示为 HTML, 所以很多时候这种转义会引起混乱。Safe Mode很多虚拟主机提供商使用 Safe Mode 来隔离多个用户,但 Safe Mode 存在诸多问题,例如某些扩展并不按照 Safe Mode 来进行权限控制。
PHP官方推荐使用操作系统的机制来进行权限隔离,让Web服务器以不同的用户权限来运行PHP解释器,请参见第一章中的最小权限原则.匿名函数也叫闭包(Closures), 经常被用来临时性地创建一个无名函数,用于回调函数等用途。$func&=&function($arg)
&&&&print&$
$func(&Hello&World&);以上代码定义了一个匿名函数,并赋值给了 $func.
可以看到定义匿名函数依旧使用 function 关键字,只不过省略了函数名,直接是参数列表。
然后我们又调用了 $func 所储存的匿名函数。
匿名函数还可以用 use 关键字来捕捉外部变量:function&arrayPlus($array,&$num)
&&&&array_walk($array,&function(&$v)&use($num){
&&&&&&&&$v&+=&$
}上面的代码定义了一个 arrayPlus() 函数(这不是匿名函数), 它会将一个数组($array)中的每一项,加上一个指定的数字($num).
在 arrayPlus() 的实现中,我们使用了 array_walk() 函数,它会为一个数组的每一项执行一个回调函数,即我们定义的匿名函数。
在匿名函数的参数列表后,我们用 use 关键字将匿名函数外的 $num 捕捉到了函数内,以便知道到底应该加上多少。魔术方法:__invoke(), __callStatic()PHP 的面向对象体系中,提供了若干“魔术方法”,用于实现类似其他语言中的“重载”,如在访问不存在的属性、方法时触发某个魔术方法。
随着匿名函数的加入,PHP 引入了一个新的魔术方法 __invoke().
该魔术方法会在将一个对象作为函数调用时被调用:class&A
&&&&public&function&__invoke($str)
&&&&&&&&print&&A::__invoke():&{$str}&;
$a&=&new&A;
$a(&Hello&World&);输出毫无疑问是:A::__invoke():&Hello&World__callStatic() 则会在调用一个不存在的静态方法时被调用。命名空间PHP的命名空间有着前无古人后无来者的无比蛋疼的语法:&?php
//&命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。
//&命名空间中可以包含任意代码,但只有&**类,&函数,&常量**&受命名空间影响。
namespace&XXOO\T
//&该类的完整限定名是&\XXOO\Test\A&,&其中第一个反斜杠表示全局命名空间。
//&你还可以在已经文件中定义第二个命名空间,接下来的代码将都位于&\Other\Test2&.
namespace&Other\Test2;
//&实例化来自其他命名空间的对象:
$a&=&new&\XXOO\Test\A;
//&你还可以用花括号定义第三个命名空间
namespace&Other&{
&&&&//&实例化来自子命名空间的对象:
&&&&$b&=&new&Test2\B;
&&&&//&导入来自其他命名空间的名称,并重命名,
&&&&//&注意只能导入类,不能用于函数和常量。
&&&&use&\XXOO\Test\A&as&ClassA
}更多有关命名空间的语法介绍请参见官网 [注].
命名空间时常和 autoload 一同使用,用于自动加载类实现文件:spl_autoload_register(
&&&&function&($class)&{
&&&&&&&&spl_autoload(str_replace(&\\&,&&/&,&$class));
);当你实例化一个类 \XXOO\Test\A 的时候,这个类的完整限定名会被传递给 autoload 函数,autoload 函数将类名中的命名空间分隔符(反斜杠)替换为斜杠,并包含对应文件。
这样可以实现类定义文件分级储存,按需自动加载。
注:后期静态绑定PHP 的 OPP 机制,具有继承和类似虚函数的功能,例如如下的代码:class&A
&&&&public&function&callFuncXXOO()
&&&&&&&&print&$this-&funcXXOO();
&&&&public&function&funcXXOO()
&&&&&&&&return&&A::funcXXOO()&;
class&B&extends&A
&&&&public&function&funcXXOO()
&&&&&&&&return&&B::funcXXOO&;
$b&=&new&B;
$b-&callFuncXXOO();输出是:B::funcXXOO可以看到,当在 A 中使用 $this-&funcXXOO() 时,体现了“虚函数”的机制,实际调用的是 B::funcXXOO().
然而如果将所有函数都改为静态函数:class&A
&&&&static&public&function&callFuncXXOO()
&&&&&&&&print&self::funcXXOO();
&&&&static&public&function&funcXXOO()
&&&&&&&&return&&A::funcXXOO()&;
class&B&extends&A
&&&&static&public&function&funcXXOO()
&&&&&&&&return&&B::funcXXOO&;
$b&=&new&B;
$b-&callFuncXXOO();情况就没这么乐观了,输出是:A::funcXXOO()这是因为 self 的语义本来就是“当前类”,所以 PHP5.3 给 static 关键字赋予了一个新功能:后期静态绑定:class&A
&&&&static&public&function&callFuncXXOO()
&&&&&&&&print&static::funcXXOO();
&&&&//&...
//&...这样就会像预期一样输出了:B::funcXXOOHeredoc 和 NowdocPHP5.3 对 Heredoc 以及 Nowdoc 进行了一些改进,它们都用于在 PHP 代码中嵌入大段字符串。
Heredoc 的行为类似于一个双引号字符串:$name&=&&MyName&;
echo&&&&&TEXT
My&name&is&&{$name}&.
TEXT;Heredoc 以三个左尖括号开始,后面跟一个标识符(TEXT), 直到一个同样的顶格的标识符(不能缩进)结束。
就像双引号字符串一样,其中可以嵌入变量。
Heredoc 还可以用于函数参数,以及类成员初始化:var_dump(&&&EOD
Hello&World
&&&&const&xx&=&&&&&EOD
Hello&World
&&&&public&$oo&=&&&&&EOD
Hello&World
}Nowdoc 的行为像一个单引号字符串,不能在其中嵌入变量,和 Heredoc 唯一的区别就是,三个左尖括号后的标识符要以单引号括起来:$name&=&&MyName&;
echo&&&&&'TEXT'
My&name&is&&{$name}&.
TEXT;输出:My&name&is&&{$name}&.用 const 定义常量PHP5.3 起同时支持在全局命名空间和类中使用 const 定义常量。
旧式风格:define(&XOOO&,&&Value&);新式风格:const&XXOO&=&&Value&;const 形式仅适用于常量,不适用于运行时才能求值的表达式://&正确
const&XXOO&=&1234;
const&XXOO&=&2&*&617;三元运算符简写形式旧式风格:echo&$a&?&$a&:&&No&Value&;可简写成:echo&$a&?:&&No&Value&;即如果省略三元运算符的第二个部分,会默认用第一个部分代替。PharPhar即PHP Archive, 起初只是Pear中的一个库而已,后来在PHP5.3被重新编写成C扩展并内置到 PHP 中。
Phar用来将多个 .php 脚本打包(也可以打包其他文件)成一个 .phar 的压缩文件(通常是ZIP格式)。
目的在于模仿 Java 的 .jar, 不对,目的是为了让发布PHP应用程序更加方便。同时还提供了数字签名验证等功能。
.phar 文件可以像 .php 文件一样,被PHP引擎解释执行,同时你还可以写出这样的代码来包含(require) .phar 中的代码:require(&xxoo.phar&);
require(&phar://xxoo.phar/xo/ox.php&);更多信息请参见官网 [注].
注:PHP5.4()Short Open TagShort Open Tag 自 PHP5.4 起总是可用。
在这里集中讲一下有关 PHP 起止标签的问题。即:&?php
//&Code...
?&通常就是上面的形式,除此之外还有一种简写形式:&?&/*&Code...&*/&?&还可以把&?php&echo&$?&简写成:&?=&$?&这种简写形式被称为 Short Open Tag, 在 PHP5.3 起被默认开启,在 PHP5.4 起总是可用。
使用这种简写形式在 HTML 中嵌入 PHP 变量将会非常方便。
对于纯 PHP 文件(如类实现文件), PHP 官方建议顶格写起始标记,同时 省略 结束标记。
这样可以确保整个 PHP 文件都是 PHP 代码,没有任何输出,否则当你包含该文件后,设置 Header 和 Cookie 时会遇到一些麻烦 [注].
注:Header 和 Cookie 必须在输出任何内容之前被发送。数组简写形式这是非常方便的一项特征!//&原来的数组写法
$arr&=&array(&key&&=&&&value&,&&key2&&=&&&value2&);
//&简写形式
$arr&=&[&key&&=&&&value&,&&key2&&=&&&value2&];Traits所谓Traits就是“构件”,是用来替代继承的一种机制。PHP中无法进行多重继承,但一个类可以包含多个Traits.//&Traits不能被单独实例化,只能被类所包含
trait&SayWorld
&&&&public&function&sayHello()
&&&&&&&&echo&'World!';
class&MyHelloWorld
&&&&//&将SayWorld中的成员包含进来
&&&&use&SayW
$xxoo&=&new&MyHelloWorld();
//&sayHello()&函数是来自&SayWorld&构件的
$xxoo-&sayHello();Traits还有很多神奇的功能,比如包含多个Traits, 解决冲突,修改访问权限,为函数设置别名等等。
Traits中也同样可以包含Traits. 篇幅有限不能逐个举例,详情参见官网 [注].
注:内置 Web 服务器PHP从5.4开始内置一个轻量级的Web服务器,不支持并发,定位是用于开发和调试环境。
在开发环境使用它的确非常方便。php&-S&localhost:8000这样就在当前目录建立起了一个Web服务器,你可以通过 http://localhost:8000/ 来访问。
其中localhost是监听的ip,8000是监听的端口,可以自行修改。
很多应用中,都会进行URL重写,所以PHP提供了一个设置路由脚本的功能:php&-S&localhost:8000&index.php这样一来,所有的请求都会由index.php来处理。
你还可以使用 XDebug 来进行断点调试。细节修改PHP5.4 新增了动态访问静态方法的方式:$func&=&&funcXXOO&;
A::{$func}();新增在实例化时访问类成员的特征:(new&MyClass)-&xxoo();新增支持对函数返回数组的成员访问解析(这种写法在之前版本是会报错的):print&func()[0];PHP5.5(2013起)yieldyield关键字用于当函数需要返回一个迭代器的时候, 逐个返回值。function&number10()
&&&&for($i&=&1;&$i&&=&10;&$i&+=&1)
&&&&&&&&yield&$i;
}该函数的返回值是一个数组:list() 用于 foreach可以用 list() 在 foreach 中解析嵌套的数组:$array&=&[
&&&&[1,&2,&3],
&&&&[4,&5,&6],
foreach&($array&as&list($a,&$b,&$c))
&&&&echo&&{$a}&{$b}&{$c}\n&;结果:1&2&3
4&5&6细节修改不推荐使用 mysql 函数,推荐使用 PDO 或 MySQLi, 参见前文。
不再支持Windows XP.
可用 MyClass::class 取到一个类的完整限定名(包括命名空间)。
empty() 支持表达式作为参数。
try-catch 结构新增 finally 块。PHP5.6更好的常量定义常量时允许使用之前定义的常量进行计算:const&A&=&2;
const&B&=&A&+&1;
&&&&const&STR&=&&hello&;
&&&&const&STR2&=&self::STR&+&&,&world&;
}允许常量作为函数参数默认值:function&func($arg&=&C::STR2)更好的可变函数参数用于代替 func_get_args()function&add(...$args)
&&&&$result&=&0;
&&&&foreach($args&as&$arg)
&&&&&&&&$result&+=&$
&&&&return&$
}同时可以在调用函数时,把数组展开为函数参数:$arr&=&[2,&3];
add(1,&...$arr);
//&结果为&6命名空间命名空间支持常量和函数:namespace&Name\Space&{
&&&&const&FOO&=&42;
&&&&function&f()&{&echo&__FUNCTION__.&\n&;&}
namespace&{
&&&&use&const&Name\Space\FOO;
&&&&use&function&Name\Space\f;
&&&&echo&FOO.&\n&;
}本篇文章遵循CC BY-NC-SA3.0许可协议发布,来源于王子亭的博客(/jysperm)
原文链接:
积分:23267
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。mysql、mysqli和PDO的区别
自己在写脚本的时候偶尔会用mysql,偶尔会用mysqli,有时候用mysql不能够执行成功,然后傻乎乎得又改成mysqli,也没有深究过之间的区别,今天看stackoverflow无意浏览到了mysql与mysqli的区别的问题,于是深入学习了一下。使用百度的话是出不来stackoverflow的答案的,究竟是stackoverflow不让收录还是百度不显示。。。咱就不深究了。百度出来的第一个结果是:
首先两个函数都是用来处理DB 的。
首先, mysqli 连接是永久连接,而mysql是非永久连接。什么意思呢?
mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。
其次,mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。具体查看&
应用比较多的地方是 mysqli的事务。
比如下面的示例:
$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli-&autocommit(false);//开始事物
$mysqli-&query($sql1);
$mysqli-&query($sql2);
if(!$mysqli-&errno){
$mysqli-&commit();
echo 'ok';
echo 'err';
$mysqli-&rollback();
看过之后只知道mysqli与mysql一个永久连接,一个是非永久连接。继续扒拉了一下第一页的结果,都差不多只提到了这么一个区别。
用谷歌试一试,好多stackoverflow上的问答,其中的答案很不错:
There are (more than) three popular ways to use MySQL from PHP.
(有3个主流php mysql接口)
The&&are procedural and use manual
escaping.(mysql函数是过程化的,需要手动断连?这个escaping不知道该怎么翻译为好)
a replacement for the mysql functions, with object-oriented and
procedural versions. It has support for prepared
statements.(mysqli是mysql函数的一个替代品,是面向对象的,过程可视化,支持写好的语句。)
Data Objects) is a general database abstraction layer with support
for MySQL among many other databases. It provides prepared
statements, and significant flexibility in how data is
returned.(PDO
,php数据对象,是一个通用的数据库抽象层,支持mysql与很多其他数据库混用,它支持写好的语句并且能够灵活显示返回的数据。)
I would recommend using PDO with prepared statements. It is a
well-designed API and will let you more easily move to another
database (including any that supports ODBC) if
necessary.(回答者推荐使用PDO,因为他是个设计优良的API,需要的话,你能够非常容易得迁移到其他数据库(包括任何支持ODBC的数据库)上去。)
Use MySQLi over the older MySQL functions. The "i" stands for
"improved". The list of improvements can be found in(用mysqli而不是老掉牙的mysql函数,多出来的”i"代表"improved"(改进版),相应的改进点可以在中找到。)
Here’s an interesting article showing benchmarks between the
various libraries used to query MySQL databases. It looks like the
mysql and mysqli libraries work much faster than PDO.
mysqli (prepared)
PDO (prepared)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。PDO与mysqli怎样判断查询的结果集是否为空?_php吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:52,528贴子:
PDO与mysqli怎样判断查询的结果集是否为空?收藏
$pdo-&query()与$mysqli-&query()这两个函数,如果查询的结果集0条记录,即没有查到符合条件的数据,怎样才能判断?求大神解答
原生 mysql_ 系列函数可以,具体是用 mysql_num_rows
$stmt=$pdo-&query($sql)...$stmt-&rowCount();//判断是否有记录数吧。。如果有,表示查到符合数据。嗯,就这样。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或php中数据库连接方式pdo和mysqli对比分析
1)总的比较
数据库支持
12种不同的数据库支持
OOP +&过程
Connection
对象映射支持
预处理语句&
支持存储过程
2 连接方式
&先来看下两者连接数据库的方式:
$pdo = new PDO("mysql:host=dbname=database", 'username', 'password');
// mysqli, 面向过程方式
$mysqli = mysqli_connect('localhost','username','password','database');
// mysqli, 面向对象
$mysqli = new mysqli('localhost','username','password','database');
3 数据库支持
PDO支持多种数据库,但MYSQLI只支持MYSQL
4 命名参数name parameter
PDO的方式:
$params = array(':username' =& 'test', ':email' =& $mail, ':last_login' =& time() - 3600);
$pdo-&prepare('
SELECT * FROM users
WHERE username = :username
AND email = :email
AND last_login & :last_login');
而MYSQLI则麻烦点,不支持这样,只能:
$query = $mysqli-&prepare('
SELECT * FROM users
WHERE username = ?
AND email = ?
AND last_login & ?');
$query-&bind_param('sss', 'test', $mail, time() - 3600);
$query-&execute();
这样的话,一个个对问号的顺序,也比较麻烦,不大方便。
5 ORM映射的支持
比如有个类user,如下:
class User
&&& public $
&&& public $first_
&&& public $last_
&&& public function info()
&&&&&&& return '#' . $this-&id . ': ' . $this-&first_name . ' ' . $this-&last_
$query = "SELECT id, first_name, last_name FROM users";
$result = $pdo-&query($query);
$result-&setFetchMode(PDO::FETCH_CLASS, 'User');
while ($user = $result-&fetch())
&&& echo $user-&info() . "\n";
MYSQLI用面向过程的方式:
if ($result = mysqli_query($mysqli, $query)) {
  while ($user = mysqli_fetch_object($result, 'User')) {
  echo $user-&info()."\n";
MYSQLI采用面向过程的方式:
// MySQLi, object oriented way
if ($result = $mysqli-&query($query)) {
  while ($user = $result-&fetch_object('User')) {
  echo $user-&info()."\n";
6 防止SQL注入方面:
PDO 手工设置
$username = PDO::quote($_GET['username']);
$pdo-&query("SELECT * FROM users WHERE username = $username");
使用mysqli
$username = mysqli_real_escape_string($_GET['username']);
$mysqli-&query("SELECT * FROM users WHERE username = '$username'");
7 preparestament
&PDO方式:
$pdo-&prepare('SELECT * FROM users WHERE username = :username');
$pdo-&execute(array(':username' =& $_GET['username']));
$query = $mysqli-&prepare('SELECT * FROM users WHERE username = ?');
$query-&bind_param('s', $_GET['username']);
$query-&execute();
小伙伴们是否通过本文对于PHP的2种链接方式PDO和mysqli有了新的认识了呢,希望本文能对大家有所帮助。
顶一下(0) 踩一下(0)
热门标签:

我要回帖

更多关于 php pdo mysql 的文章

 

随机推荐