php里mysql, mysqli和pdo
远古的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