PHP的MySQL扩展操作
Posted eyes++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP的MySQL扩展操作相关的知识,希望对你有一定的参考价值。
一:连接与关闭数据库
- PHP的mysqli扩展(mysqli即mysql improved)
- PDO (使用PDO MySQL驱动和MySQL Native驱动)
- PHP的mysql扩展
PHP的mysqli扩展 | PDO (使用PDO MySQL驱动和MySQL Native驱动) | PHP的mysql扩展 | |
---|---|---|---|
引入的PHP版本 | 5.0 | 5.0 | 3.0之前 |
PHP5.x是否包含 | 是 | 是 | 是 |
MySQL开发状态 | 活跃 | 在PHP5.3中活跃 | 仅维护 |
在MySQL新项目中的建议使用程度 | 建议 - 首选 | 建议 | 不建议 |
API的字符集支持 | 是 | 是 | 否 |
服务端prepare语句的支持情况 | 是 | 是 | 否 |
客户端prepare语句的支持情况 | 否 | 是 | 否 |
存储过程支持情况 | 是 | 是 | 否 |
多语句执行支持情况 | 是 | 大多数 | 否 |
是否支持所有MySQL4.1以上功能 | 是 | 大多数 | 否 |
值得注意的是,mysql扩展自 PHP 5.5.0 起已废弃,并在将来会被移除。其中mysql_query 很不安全,所以才被废弃,而强制采用PDO的方式去搜索PDO, 另外,不只是废弃mysql_query,是所有的mysql_*函数都废弃了,现在都换用mysqli扩展。mysqli扩展相对于mysql经过了增强,它的执行速度更快。mysqli扩展被封装到一个类中,它是一种面向对象的技术,不过喜欢过程化编程的用户也不用担心,mysqli也提供了一个面向过程的接口,我们可以像调用函数那样去使用mysqli扩展。
MySQLi 和 PDO 有它们自己的优势:
- PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。
- 两者都是面向对象, 但 MySQLi 还提供了 API 接口。
- 两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。
MySQLi面向过程连接:
连接指定的mysql服务器(端口号可以和$host写在一起,不写的话默认是3306端口,只有前三个参数是必须的,而加错误抑制符是为了抑制php默认报错,而让后面的自定义错误提示显示出来):
$link = @mysqli_connect($host, $user, $password, $database, $port);
连接错误时的提示:
int mysqli_connect_errno(); // 返回最后一次连接调用的错误代码,连接成功则返回0,失败则返回1
string mysqli_connect_error(); // 返回一个字符串描述的最后一次连接调用的错误代码
设置默认字符编码:
bool mysqli_set_charset(mysqli $link, string $dbname);
选择特定的数据库
bool mysqli_select_db(mysqli $link, string $dbname);
关闭与mysql服务器的连接
bool mysqli_close(mysqli $link);
代码示例:
<?php
header('Content-type:text/html;charset=utf-8');
// 创建连接
$link = mysqli_connect('localhost', 'root', '数据库密码');
// 连接错误提示
if(mysqli_connect_errno()){
// 若连接错误,则结束执行
exit(mysqli_connect_error());
}
// 设置默认字符编码,mysql不识别"-",因此字符集填utf8
mysqli_set_charset($link, 'utf8');
// 选择特定的数据库
mysqli_select_db($link, '要进行操作的数据库名');
// 对数据库进行各种操作
...
...
// 关闭与mysql服务器的连接
mysqli_close($link);
二:执行SQL语句
执行SQL语句的函数格式:
mysqli_query($link, $query);
1:创建数据库
mysqli_query()执行创建、删除、插入、更新等操作时不会返回数据,而是执行成功时返回true,执行失败返回false。
$sql = "CREATE DATABASE newdb";
if (mysqli_query($link, $sql)) {
echo "数据库创建成功";
} else {
echo "数据库创建失败: " . mysqli_error($link);
}
2:创建数据表
要注意的是,在创建表和对表内数据进行操作时一定要先选定数据库。
下面实例创建了一个名为 “MyGuests” 的表,有 5 个列: “id”, “firstname”, “lastname”, “email” 和 “reg_date”:
// 使用 sql 创建数据表
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
if (mysqli_query($conn, $link)) {
echo "数据表 MyGuests 创建成功";
} else {
echo "创建数据表错误: " . mysqli_error($link);
}
3: 插入数据
在创建完数据库和表后,我们可以向表中添加数据,其实PHP执行插入数据、删除数据更新数据操作都一样,区别在于SQL指令而已,因此这篇博客只展示插入操作。
以下为一些语法规则:
- PHP 中 SQL 查询语句必须使用引号
- 在 SQL 查询语句中的字符串值必须加引号
- 数值的值不需要引号
- NULL 值不需要引号
上面我们已经创建了表 “MyGuests”,表字段有: “id”, “firstname”, “lastname”, “email” 和 “reg_date”。 现在,让我们开始向表填充数据。
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
if ($conn->query($sql) === TRUE) {
echo "新记录插入成功";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
4:插入多条数据
使用mysqli_multi_query()执行多条SQL语句的函数(每个SQL语句必须用分号隔开)
mysqli_multi_query($link, $query);
以下实例向 “MyGuests” 表添加了三条新的记录。
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
if (mysqli_multi_query($link, $sql)) {
echo "新记录插入成功";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($link);
}
mysqli 扩展还提供了第二种方式用于插入语句,即使用预处理语句插入多条函数,我们可以预处理语句及绑定参数。mysql 扩展可以不带数据发送语句或查询到mysql数据库。 你可以向列关联或 “绑定” 变量。详细说明见后面的5.预处理数据。
<?php
header('Content-type:text/html;charset=utf-8');
// 连接数据库
$link = mysqli_connect('localhost', 'root', '', 'mydb');
// 检测连接
if ($link->connect_error) {
die("连接失败: " . $link->connect_error);
} else {
$sql = "INSERT INTO MyGuests(firstname, lastname, email) VALUES(?, ?, ?)";
// 为 mysqli_stmt_prepare() 初始化 statement 对象
$stmt = mysqli_stmt_init($link);
//预处理语句
if (mysqli_stmt_prepare($stmt, $sql)) {
// 绑定参数
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
// 设置参数并执行
$firstname = 'John';
$lastname = 'Doe';
$email = 'john@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Mary';
$lastname = 'Moe';
$email = 'mary@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Julie';
$lastname = 'Dooley';
$email = 'julie@example.com';
mysqli_stmt_execute($stmt);
}
}
5:预处理数据
预处理语句用于执行多个相同的 SQL 语句,执行效率更高。并且对于防止 MySQL 注入是非常有用的。
预处理语句及绑定参数
预处理语句的工作原理如下:
- 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 “?” 标记 。例如:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
-
数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
-
执行:最后将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
相比于直接执行SQL语句,预处理语句有三个主要优点:
- 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
- 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
MySQLi 预处理语句
以下实例在 MySQLi 中使用了预处理语句,并绑定了相应的参数:
<?php
// 创建连接
$link = new mysqli('localhost', 'root', '', 'mydb');
// 检测连接
if ($link->connect_error) {
die("连接失败: " . $link->connect_error);
}
// 预处理及绑定:在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。
$stmt = $link->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "新记录插入成功";
$stmt->close();
$link->close();
我们看下 bind_param() 函数:
$stmt->bind_param("sss", $firstname, $lastname, $email);
该函数绑定了 SQL 的参数,且告诉数据库参数的值。 “sss” 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。
参数有以下四种类型:
i - integer(整型)
d - double(双精度浮点型)
s - string(字符串)
b - BLOB(binary large object:二进制大对象)
每个参数都需要指定类型。
通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。
注意: 如果你想插入其他数据(用户输入),对数据的验证是非常重要的。
6:读取数据
以下实例中我们从 mydb 数据库的 myguests 表读取了 id, firstname 和 lastname 列的数据并显示在页面上:
<?php
// 创建连接
$link = mysqli_connect('localhost', 'root', '', 'mydb');
if (!$link) {
die("连接失败: " . mysqli_connect_error());
}
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($link, $sql);
if (mysqli_num_rows($result) > 0) {
// 输出数据
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 结果";
}
// 断开连接
mysqli_close($link);
以上是关于PHP的MySQL扩展操作的主要内容,如果未能解决你的问题,请参考以下文章
小结有关mysql扩展库和mysqli扩展库的crud操作封装