mysqli 和 PDO

用PDO访问MySQL的代码如下:

<?php

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

?>

Notice:

新建PDO对象时的参数'mysql:host=localhost;dbname=dev'一定不能有空格,也不要打错字,第一次连接没经验找了很久的错。

然后用mysqli访问MySQL,分为面向对象和面向过程两种形式:

// mysqli object oriented way

$mysqli = new mysqli("localhost","root","test","dev");

foreach($mysqli->query("SELECT * FROM persons")as $row){
	print_r($row);
}
// mysqli procedural way
$link = mysqli_connect("localhost","root","test","dev");

foreach(mysqli_query($link,"SELECT * FROM persons")as $row){
	print_r($row);
}


输出结果略有不同,PDO输出的结果为"Array([personID] => 1 [0] => 1 [FirstName] => Peter [1] => Peter  [LastName] => Griffin [2] => Griffin [Age] => 35 [3] => 35)......"而mysqli输出的结果为"Array ( [personID] => 1 [FirstName] => Peter [LastName] => Griffin [Age] => 35 )......"。

因为PDO默认返回的结果集是关联及数字索引共有的数组形式。可以用PDOstatement-fetch(int mode)来获取结果集,通过设置不同的mode参数来获得不同的形式。

PDO通过bool PDOStatement::execute ([ array $input_parameters ] )来执行预处理语句。

如果预处理过的语句含有参数标记,必须选择下面其中一种做法:

1.调用PDOStatement::bindParam()绑定PHP变量到参数标记。

2.传递一个只作为输入参数值的数组。

具体实例详见官方文档:点击打开链接

扫描二维码关注公众号,回复: 3584387 查看本文章

而参数绑定又有两种不同的语法:命名参数(比如:name)和问号参数(?)。而mysqli并不支持命名参数。


在常见的SQL语句比如"SELECT * FROM users WHERE username = '$username'"';

那么就很有可能通过$_GET['username'] = "';DELETE FROM users;/*"来进行SQL注入。

PDO和mysqli都有各自的方法来对应SQL注入。

// PDO, "manual" escaping  
$username = PDO::quote($_GET['username']);  
   
$pdo->query("SELECT * FROM users WHERE username = $username");  
   
// mysqli, "manual" escaping  
$username = mysqli_real_escape_string($_GET['username']);  
   
$mysqli->query("SELECT * FROM users WHERE username = '$username'");  

Notice:

PDO::quote不仅转义了字符串,还加了单引号。

最后PDO和mysqli都有不错的性能。

猜你喜欢

转载自blog.csdn.net/ecliiipse/article/details/50269789
PDO