用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.传递一个只作为输入参数值的数组。
具体实例详见官方文档:点击打开链接
而参数绑定又有两种不同的语法:命名参数(比如: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都有不错的性能。