平时总是用封装的写法写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 = $pdo->prepare($sql);
$sth->execute(array(22, '908', '高数', '76'));
echo $pdo->lastInsertId() . '<br />';