PHP中mysql、mysqli、pdo的区别和用法

来源:互联网 发布:新疆世纪矩阵合法吗 编辑:程序博客网 时间:2024/05/19 14:18

平时总是用封装的写法写sql,最基本的数据库连接都快忘了怎么写了。现在回头总结一下PHP连接数据库的一些方法和区别:
MySQL 是 PHP 操作 MySQL 数据库最原始的 Extension。MySQLi 的 i 代表 Improvement ,提供了相对进阶的功能,就 Extension 而言,本身也增加了安全性。而 PDO(PHP Data Object)则是提供了一个 Abstraction Layer 来操作数据库,下面贴代码:

<?php$host = '127.0.0.1';$username = 'root';$userpass = '';$databases = 'mytest';$charset = "utf8";$conn = mysql_connect($host, $username, $userpass);if (!$conn) {    die('连接失败'.mysql_error());}mysql_set_charset($charset, $conn);//编码要设置的mysql_select_db($databases. $conn);$result = mysql_query("SELECT stu_id, c_name, grade FROM score");$row = mysql_fetch_array($result);

这种方式不能 Bind Column,$location 的地方容易被 SQL 注入。于是后来发展出了 mysql_escape_string()(备注:5.3.0 之后弃用)以及 mysql_real_escape_string() 来解决这个问题,不过这么一搞,整个过程会变得复杂丑陋,而且如果参数多了,可以想象会是怎样的情形……

<?php  $query = sprintf("SELECT * FROM score WHERE c_name='%s' AND grade='%s'",  mysql_real_escape_string($c_name),  mysql_real_escape_string($grade));  mysql_query($query);  

在 MySQLi 中有了不少进步,除了通过 Bind Column 来解决上述问题

<?php  $conn = new mysqli($host, $username, $userpass, $databases);  if (!$conn) {    die('连接失败'.mysqli_connect_error());}mysqli_set_charset($conn, $charset);$sql = "INSERT INTO `score` (id, stu_id, c_name, grade) VALUES (?, ?, ?, ?)";$stmt = $conn ->prepare($sql);$id = '';$stu_id = '904';$c_name = '高数';$grade = '88';$stmt->bind_param('dsss', $id, $stu_id, $c_name, $grade);//需要用变量传值$stmt->execute();echo $stmt->affected_rows; 

下面是PDO:

$pdo = new PDO("mysql:host=$host;dbname=$databases;charset=utf8", $username, "");$sql = "INSERT INTO `users` (id, stu_id, c_name, grade) VALUES(?, ?, ?, ?)";  $sth = $dbh->prepare($sql);  $sth->execute(array(22, '908', '高数', '76')); echo $pdo->lastInsertId() . '<br />'; 
0 0
原创粉丝点击