php里mysql, mysqli和pdo

Author Avatar
Aryb1n 7月 16, 2017

远古的mysql

mysql_connect($host, $user, $passwd);
mysql_select_db($db_name);
$result = mysql_query("SELECT * FROM news where id = '$id'");
if(!$result) {
    // error report
}

这个时候只能只过程化的写法,而且不能使用bind column,导致容易注入
然后出现了mysql_escape_string()mysql_real_escape_string()

mysql_escape_string

这里和另一个叫做mysql_real_escape_string是兄弟,唯一的区别real是根据当前字符集转义字符串

从这个数据来源来说
magic_quotes_gpc作用范围是GET,POST,COOKIE
magic_quotes_runtime作用范围是数据库或者文件中获得的数据
addslashes,mysql_[real_]escape_string是对字符串作用

从作用范围来说
addslashes和GPC和magic_quotes_runtime是对

['], ["], [\], NULL

mysql_[real_]escape_string是针对

['], ["], [\], NULL
[\n], [\r], [\x1a]

之后出现的mysqli

这个时候的mysqli
既可以面向过程
又可以面向对象
所以既能看到这样子的

mysqli_connect($host, $user, $passwd, $db);
mysqli_query($db, $query);

又有这样子的

$mysqli = new mysqli($host, $user, $passwd, $db);
$mysqli -> query($sql);

或者还有预编译的功能,先编译,然后绑定,执行(有面向对象和过程两种风格)

$mysqli = new mysqli($host, $user, $passwd, $db);
$stmt = $mysqli -> prepare("INSERT INTO test(id) VALUES (?)");
$id = 1;
$stmt -> bind_param("i", $id);
$stmt -> execute();
$res = $stmt -> get_result();

这个参数绑定可以提高安全性的样子
这里的bind_param($type, $arg1 [,$arg2...])arg1,arg2…对应的分别是第一个,第二个?,$type是参数类型

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

最后的pdo

加了一个抽象层,把应用层和数据库之间加了一层pdo