PHP的MySQL扩展操作

Posted eyes++

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP的MySQL扩展操作相关的知识,希望对你有一定的参考价值。

一:连接与关闭数据库

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.05.03.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 有它们自己的优势:

  1. PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。
  2. 两者都是面向对象, 但 MySQLi 还提供了 API 接口。
  3. 两者都支持预处理语句。 预处理语句可以防止 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操作封装

使用 json rereiver php mysql 在片段中填充列表视图

PHP中的数据库操作扩展

PHP mysql 扩展库 操作mysql数据库步骤

mysqli扩展库操作mysql数据库

PHP的mysql扩展整理,操作数据库的实现过程分析