[php学习资料] PHP完全自学手册(文档教程)

[复制链接]
 楼主| 发表于 2019-11-19 16:32:59 | 显示全部楼层
PHP 7 新特性
PHP 7+ 版本极大地改进了性能,在一些WordPress基准测试当中,性能可以达到PHP 5.6的3倍。
PHP 7+ 版本新加特性如下表所示:
序号
内容
1PHP 标量类型与返回值类型声明
2PHP NULL 合并运算符
3PHP 太空船运算符(组合比较符)
4PHP 常量数组
5PHP 匿名类
6PHP Closure::call()
7PHP 过滤 unserialize()
8PHP IntlChar()
9PHP CSPRNG
10PHP 7 异常
11PHP 7 use 语句
12PHP 7 错误处理
13PHP intdiv() 函数
14PHP 7 Session 选项
15PHP 7 废弃特性
16PHP 7 移除的扩展
17PHP 7 移除的 SAPI

腾讯云
回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:34:13 | 显示全部楼层
PHP MySQL 简介
通过 PHP,您可以连接和操作数据库。
MySQL 是跟 PHP 配套使用的最流行的开源数据库系统。


MySQL 是什么?
  • MySQL 是一种在 Web 上使用的数据库系统。
  • MySQL 是一种在服务器上运行的数据库系统。
  • MySQL 不管在小型还是大型应用程序中,都是理想的选择。
  • MySQL 是非常快速,可靠,且易于使用的。
  • MySQL 支持标准的 SQL。
  • MySQL 在一些平台上编译。
  • MySQL 是免费下载使用的。
  • MySQL 是由 Oracle 公司开发、发布和支持的。
  • MySQL 是以公司创始人 Monty Widenius's daughter: My 命名的。

MySQL 中的数据存储在表中。表格是一个相关数据的集合,它包含了列和行。
在分类存储信息时,数据库非常有用。一个公司的数据库可能拥有以下表:
  • Employees
  • Products
  • Customers
  • Orders


PHP + MySQL
  • PHP 与 MySQL 结合是跨平台的。(您可以在 Windows 上开发,在 Unix 平台上应用。)


查询
查询是一种询问或请求。
通过 MySQL,我们可以向数据库查询具体的信息,并得到返回的记录集。
请看下面的查询(使用标准 SQL):
  1. mysql> set names utf8;mysql> SELECT name FROM websites;+---------------+| name          |+---------------+| Google        || 淘宝        || 阿里云大学  || 微博        || Facebook      || stackoverflow |+---------------+6 rows in set (0.00 sec)
复制代码

语句 set names utf8;用于设定数据库编码,让中文可以正常显示。
上面的查询选取了 "websites" 表中 "name" 列的所有数据。
如需学习更多关于 SQL 的知识,请访问我们的 SQL 教程

下载 MySQL 数据库
如果您的 PHP 服务器没有 MySQL 数据库,可以在此免费下载 MySQL: http://www.mysql.com

关于 MySQL 数据库的事实
关于 MySQL 的一点很棒的特性是,可以对它进行缩减,来支持嵌入的数据库应用程序。也许正因为如此,许多人认为 MySQL 仅仅能处理中小型的系统。
事实上,对于那些支持巨大数据和访问量的网站(比如 Friendster、Yahoo、Google),MySQL 是事实上的标准数据库。
这个地址提供了使用 MySQL 的公司的概览: http://www.mysql.com/customers/

回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:36:01 | 显示全部楼层
PHP 连接 MySQL
PHP 5 及以上版本建议使用以下方式连接 MySQL :
  • MySQLi extension ("i" 意为 improved)
  • PDO (PHP Data Objects)

在 PHP 早起版本中我们使用 MySQL 扩展。但该扩展在 2012 年开始不建议使用。

我是该用 MySQLi ,还是 PDO?
如果你需要一个简短的回答,即 "你习惯哪个就用哪个"。
MySQLi 和 PDO 有它们自己的优势:
PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。
所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。
两者都是面向对象, 但 MySQLi 还提供了 API 接口。
两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。

MySQLi 和 PDO 连接 MySQL 实例
在本章节及接下来的章节中,我们会使用以下三种方式来演示 PHP 操作 MySQL:
  • MySQLi (面向对象)
  • MySQLi (面向过程)
  • PDO


MySQLi 安装
Linux 和 Windows: 在 php5 mysql 包安装时 MySQLi 扩展多数情况下是自动安装的。
安装详细信息,请查看: http://php.net/manual/en/mysqli.installation.php
可以通过 phpinfo() 查看是否安装成功:

PDO 安装
For 安装详细信息,请查看: http://php.net/manual/en/pdo.installation.php
可以通过 phpinfo() 查看是否安装成功:

连接 MySQL
在我们访问 MySQL 数据库前,我们需要先连接到数据库服务器:
实例 (MySQLi - 面向对象)
  1. <?php$servername = "localhost";$username = "username";$password = "password";
  2. // 创建连接$conn = new mysqli($servername, $username, $password);
  3. // 检测连接if ($conn->connect_error) {
  4.     die("连接失败: " . $conn->connect_error);} echo "连接成功";?>
复制代码


注意在以上面向对象的实例中 $connect_error 是在 PHP 5.2.9 和 5.3.0 中添加的。如果你需要兼容更早版本 请使用以下代码替换:

// 检测连接
if (mysqli_connect_error()) {
    die("数据库连接失败: " . mysqli_connect_error());
}

实例 (MySQLi - 面向过程)
  1. <?php$servername = "localhost";$username = "username";$password = "password";
  2. // 创建连接$conn = mysqli_connect($servername, $username, $password);
  3. // 检测连接if (!$conn) {
  4.     die("Connection failed: " . mysqli_connect_error());}echo "连接成功";?>
复制代码


实例 (PDO)
  1. <?php$servername = "localhost";$username = "username";$password = "password";
  2. try {
  3.     $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);    echo "连接成功";
  4. }catch(PDOException $e){
  5.     echo $e->getMessage();}?>
复制代码


注意在以上 PDO 实例中我们已经指定了数据库 (myDB)。PDO 在连接过程需要设置数据库名。如果没有指定,则会抛出异常。


关闭连接
连接在脚本执行完后会自动关闭。你也可以使用以下代码来关闭连接:
实例 (MySQLi - 面向对象)
  1. $conn->close();
复制代码


实例 (MySQLi - 面向过程)
  1. mysqli_close($conn);
复制代码


实例 (PDO)
  1. $conn = null;
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:37:19 | 显示全部楼层
PHP MySQL 创建数据库
数据库存有一个或多个表。
你需要 CREATE 权限来创建或删除 MySQL 数据库。

使用 MySQLi 和 PDO 创建 MySQL 数据库
CREATE DATABASE 语句用于在 MySQL 中创建数据库。
在下面的实例中,创建了一个名为 "myDB" 的数据库:
实例 (MySQLi - 面向对象)
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";
  5. // 创建连接
  6. $conn = new mysqli($servername, $username, $password);
  7. // 检测连接
  8. if ($conn->connect_error) {
  9.     die("连接失败: " . $conn->connect_error);
  10. }
  11. // 创建数据库
  12. $sql = "CREATE DATABASE myDB";
  13. if ($conn->query($sql) === TRUE) {
  14.     echo "数据库创建成功";
  15. } else {
  16.     echo "Error creating database: " . $conn->error;
  17. }
  18. $conn->close();
  19. ?>
复制代码



注意: 当你创建一个新的数据库时,你必须为 mysqli 对象指定三个参数 (servername, username 和 password)。

Tip: 如果你使用其他端口(默认为3306),为数据库参数添加空字符串,如: new mysqli("localhost", "username", "password", "", port)

实例 (MySQLi Procedural)
  1. aaaysqli_connect_error());
  2. }
  3. // 创建数据库
  4. $sql = "CREATE DATABASE myDB";
  5. if (mysqli_query($conn, $sql)) {
  6.     echo "数据库创建成功";
  7. } else {
  8.     echo "Error creating database: " . mysqli_error($conn);
  9. }
  10. mysqli_close($conn);
  11. ?>
复制代码


注意: 以下使用 PDO 实例创建数据库 "myDBPDO":
实例
使用 PDO:
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";

  5. try {
  6.     $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);

  7.     // 设置 PDO 错误模式为异常
  8.     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  9.     $sql = "CREATE DATABASE myDBPDO";

  10.     // 使用 exec() ,因为没有结果返回
  11.     $conn->exec($sql);

  12.     echo "数据库创建成功<br>";
  13. }
  14. catch(PDOException $e)
  15. {
  16.     echo $sql . "<br>" . $e->getMessage();
  17. }

  18. $conn = null;
  19. ?>
复制代码


回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:38:46 | 显示全部楼层
PHP 创建 MySQL 表
一个数据表有一个唯一名称,并有行和列组成。

使用 MySQLi 和 PDO 创建 MySQL 表
CREATE TABLE 语句用于创建 MySQL 表。
创建表前,我们需要使用 use myDB 来选择要操作的数据库:
  1. use myDB;
复制代码

我们将创建一个名为 "MyGuests" 的表,有 5 个列: "id", "firstname", "lastname", "email" 和 "reg_date":
  1. CREATE TABLE MyGuests (
  2. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  3. firstname VARCHAR(30) NOT NULL,
  4. lastname VARCHAR(30) NOT NULL,
  5. email VARCHAR(50),
  6. reg_date TIMESTAMP
  7. )
复制代码

上表中的注意事项:
数据类型指定列可以存储什么类型的数据。完整的数据类型请参考我们的 数据类型参考手册
在设置了数据类型后,你可以为没个列指定其他选项的属性:
  • NOT NULL - 每一行都必须含有值(不能为空),null 值是不允许的。
  • DEFAULT value - 设置默认值
  • UNSIGNED - 使用无符号数值类型,0 及正数
  • AUTO INCREMENT - 设置 MySQL 字段的值在新增记录时每次自动增长 1
  • PRIMARY KEY - 设置数据表中每条记录的唯一标识。 通常列的 PRIMARY KEY 设置为 ID 数值,与 AUTO_INCREMENT 一起使用。

每个表都应该有一个主键(本列为 "id" 列),主键必须包含唯一的值。
以下实例展示了如何在 PHP 中创建表:
实例 (MySQLi - 面向对象)
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";
  5. $dbname = "myDB";
  6. // 创建连接
  7. $conn = new mysqli($servername, $username, $password, $dbname);
  8. // 检测连接
  9. if ($conn->connect_error) {
  10.     die("连接失败: " . $conn->connect_error);
  11. }
  12. // 使用 sql 创建数据表
  13. $sql = "CREATE TABLE MyGuests (
  14. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  15. firstname VARCHAR(30) NOT NULL,
  16. lastname VARCHAR(30) NOT NULL,
  17. email VARCHAR(50),
  18. reg_date TIMESTAMP
  19. )";
  20. if ($conn->query($sql) === TRUE) {
  21.     echo "Table MyGuests created successfully";
  22. } else {
  23.     echo "创建数据表错误: " . $conn->error;
  24. }
  25. $conn->close();
  26. ?>
复制代码



实例 (MySQLi - 面向过程)
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";
  5. $dbname = "myDB";
  6. // 创建连接
  7. $conn = mysqli_connect($servername, $username, $password, $dbname);
  8. // 检测连接
  9. if (!$conn) {
  10.     die("连接失败: " . mysqli_connect_error());
  11. }
  12. // 使用 sql 创建数据表
  13. $sql = "CREATE TABLE MyGuests (
  14. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  15. firstname VARCHAR(30) NOT NULL,
  16. lastname VARCHAR(30) NOT NULL,
  17. email VARCHAR(50),
  18. reg_date TIMESTAMP
  19. )";
  20. if (mysqli_query($conn, $sql)) {
  21.     echo "数据表 MyGuests 创建成功";
  22. } else {
  23.     echo "创建数据表错误: " . mysqli_error($conn);
  24. }
  25. mysqli_close($conn);
  26. ?>
复制代码



实例 (PDO)
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";
  5. $dbname = "myDBPDO";

  6. try {
  7.     $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  8.     // 设置 PDO 错误模式,用于抛出异常
  9.     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  10.     // 使用 sql 创建数据表
  11.     $sql = "CREATE TABLE MyGuests (
  12.     id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  13.     firstname VARCHAR(30) NOT NULL,
  14.     lastname VARCHAR(30) NOT NULL,
  15.     email VARCHAR(50),
  16.     reg_date TIMESTAMP
  17.     )";

  18.     // 使用 exec() ,没有结果返回
  19.     $conn->exec($sql);
  20.     echo "数据表 MyGuests 创建成功";
  21. }
  22. catch(PDOException $e)
  23. {
  24.     echo $sql . "<br>" . $e->getMessage();
  25. }

  26. $conn = null;
  27. ?>
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:40:26 | 显示全部楼层
PHP MySQL 插入数据
使用 MySQLi 和 PDO 向 MySQL 插入数据
在创建完数据库和表后,我们可以向表中添加数据。
以下为一些语法规则:
  • PHP 中 SQL 查询语句必须使用引号
  • 在 SQL 查询语句中的字符串值必须加引号
  • 数值的值不需要引号
  • NULL 值不需要引号

INSERT INTO 语句通常用于向 MySQL 表添加新的记录:
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

在前面的几个章节中我们已经创建了表 "MyGuests",表字段有: "id", "firstname", "lastname", "email" 和 "reg_date"。 现在,让我们开始向表填充数据。
注意: 如果列设置 AUTO_INCREMENT (如 "id" 列) 或 TIMESTAMP (如 "reg_date" 列),,我们就不需要在 SQL 查询语句中指定值; MySQL 会自动为该列添加值。
以下实例向 "MyGuests" 表添加了新的记录:
实例 (MySQLi - 面向对象)
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";
  5. $dbname = "myDB";
  6. // 创建连接
  7. $conn = new mysqli($servername, $username, $password, $dbname);
  8. // 检测连接
  9. if ($conn->connect_error) {
  10.     die("连接失败: " . $conn->connect_error);
  11. }
  12. $sql = "INSERT INTO MyGuests (firstname, lastname, email)
  13. VALUES ('John', 'Doe', 'john@example.com')";
  14. if ($conn->query($sql) === TRUE) {
  15.     echo "新记录插入成功";
  16. } else {
  17.     echo "Error: " . $sql . "<br>" . $conn->error;
  18. }
  19. $conn->close();
  20. ?>
复制代码



实例 (MySQLi - 面向过程)
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";
  5. $dbname = "myDB";

  6. // 创建连接
  7. $conn = mysqli_connect($servername, $username, $password, $dbname);
  8. // 检测连接
  9. if (!$conn) {
  10.     die("Connection failed: " . mysqli_connect_error());
  11. }

  12. $sql = "INSERT INTO MyGuests (firstname, lastname, email)
  13. VALUES ('John', 'Doe', 'john@example.com')";

  14. if (mysqli_query($conn, $sql)) {
  15.     echo "新记录插入成功";
  16. } else {
  17.     echo "Error: " . $sql . "<br>" . mysqli_error($conn);
  18. }

  19. mysqli_close($conn);
  20. ?>
复制代码

实例 (PDO)
  1. <?php
  2. $servername = "localhost";
  3. $username = "username";
  4. $password = "password";
  5. $dbname = "myDBPDO";
  6. try {
  7.     $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  8.     // 设置 PDO 错误模式,用于抛出异常
  9.     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10.     $sql = "INSERT INTO MyGuests (firstname, lastname, email)
  11.     VALUES ('John', 'Doe', 'john@example.com')";
  12.     // 使用 exec() ,没有结果返回
  13.     $conn->exec($sql);
  14.     echo "新记录插入成功";
  15. }
  16. catch(PDOException $e)
  17. {
  18.     echo $sql . "<br>" . $e->getMessage();
  19. }
  20. $conn = null;
  21. ?>
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:41:49 | 显示全部楼层
使用 MySQLi 和 PDO 向 MySQL 插入多条数据
mysqli_multi_query() 函数可用来执行多条SQL语句。
以下实例向 "MyGuests" 表添加了三条新的记录:
实例 (MySQLi - 面向对象)
  1. <?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDB";
  2. // 创建链接$conn = new mysqli($servername, $username, $password, $dbname);// 检查链接if
  3. ($conn->connect_error) {
  4.     die("连接失败: " . $conn->connect_error);}
  5. $sql = "INSERT INTO MyGuests (firstname, lastname, email)
  6. VALUES ('John', 'Doe', 'john@example.com');";$sql .= "INSERT INTO MyGuests
  7. (firstname, lastname, email)
  8. VALUES ('Mary', 'Moe', 'mary@example.com');";$sql .= "INSERT INTO MyGuests
  9. (firstname, lastname, email)
  10. VALUES ('Julie', 'Dooley', 'julie@example.com')";
  11. if ($conn->multi_query($sql) === TRUE) {
  12.     echo "新记录插入成功";} else {
  13.     echo "Error: " . $sql . "<br>" . $conn->error;}
  14. $conn->close();?>
复制代码


请注意,每个SQL语句必须用分号隔开。

实例 (MySQLi - 面向过程)
  1. <?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDB";
  2. // 创建链接$conn = mysqli_connect($servername, $username, $password, $dbname);//
  3. 检查链接if (!$conn) {
  4.     die("连接失败: " . mysqli_connect_error());}
  5. $sql = "INSERT INTO MyGuests (firstname, lastname, email)
  6. VALUES ('John', 'Doe', 'john@example.com');";$sql .= "INSERT INTO MyGuests
  7. (firstname, lastname, email)
  8. VALUES ('Mary', 'Moe', 'mary@example.com');";$sql .= "INSERT INTO MyGuests
  9. (firstname, lastname, email)
  10. VALUES ('Julie', 'Dooley', 'julie@example.com')";
  11. if (mysqli_multi_query($conn, $sql)) {
  12.     echo "新记录插入成功";} else {
  13.     echo "Error: " . $sql . "<br>" . mysqli_error($conn);}
  14. mysqli_close($conn);?>
复制代码


实例 (PDO)
  1. <?php$servername = "localhost";$username = "username";$password = "password";$dbname =
  2. "myDBPDO";
  3. try {
  4.     $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);  
  5.       // set the PDO error mode to exception
  6.     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.     // 开始事务
  8.     $conn->beginTransaction();    // SQL 语句
  9.     $conn->exec("INSERT INTO MyGuests (firstname, lastname, email)
  10.     VALUES ('John', 'Doe', 'john@example.com')");   
  11.      $conn->exec("INSERT INTO MyGuests (firstname, lastname, email)
  12.     VALUES ('Mary', 'Moe', 'mary@example.com')");   
  13.      $conn->exec("INSERT INTO MyGuests (firstname, lastname, email)
  14.     VALUES ('Julie', 'Dooley', 'julie@example.com')");
  15.     // 提交事务
  16.     $conn->commit();    echo "新记录插入成功";}catch(PDOException $e){
  17.     // 如果执行失败回滚
  18.     $conn->rollback();    echo $sql . "<br>" . $e->getMessage();}
  19. $conn = null;?>
复制代码



使用预处理语句
mysqli 扩展提供了第二种方式用于插入语句。
我们可以预处理语句及绑定参数。
mysql 扩展可以不带数据发送语句或查询到mysql数据库。 你可以向列关联或 "绑定" 变量。
实例 (MySQLi 使用预处理语句)
  1. <?php$servername = "localhost";$username = "username";$password = "password";$dbname =
  2. "myDB";
  3. // 创建连接$conn = new mysqli($servername, $username, $password, $dbname);//
  4. 检测连接if ($conn->connect_error) {
  5.     die("连接失败: " . $conn->connect_error);} else {
  6.     $sql = "INSERT INTO MyGuests(firstname, lastname, email)  VALUES(?, ?, ?)";
  7.     // 为 mysqli_stmt_prepare() 初始化 statement 对象
  8.     $stmt = mysqli_stmt_init($conn);
  9.     //预处理语句
  10.     if (mysqli_stmt_prepare($stmt, $sql)) {
  11.         // 绑定参数
  12.         mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
  13.         // 设置参数并执行
  14.         $firstname = 'John';        $lastname = 'Doe';      
  15.          $email = 'john@example.com';        mysqli_stmt_execute($stmt);
  16.         $firstname = 'Mary';        $lastname = 'Moe';      
  17.          $email = 'mary@example.com';        mysqli_stmt_execute($stmt);
  18.         $firstname = 'Julie';        $lastname = 'Dooley';      
  19.           $email = 'julie@example.com';      
  20.            mysqli_stmt_execute($stmt);    }}?>
复制代码

我们可以看到以上实例中使用模块化来处理问题。我们可以通过创建代码块实现更简单的读取和管理。
注意参数的绑定。让我们看下 mysqli_stmt_bind_param() 中的代码:
  1. mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
复制代码

该函数绑定参数查询并将参数传递给数据库。第二个参数是 "sss" 。以下列表展示了参数的类型。 s 字符告诉 mysql 参数是字符串。
可以是以下四种参数:
  • i - 整数
  • d - 双精度浮点数
  • s - 字符串
  • b - 布尔值

每个参数必须指定类型,来保证数据的安全性。通过类型的判断可以减少SQL注入漏洞带来的风险。

回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:42:58 | 显示全部楼层
PHP MySQL 预处理语句
预处理语句对于防止 MySQL 注入是非常有用的。

预处理语句及绑定参数
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。
预处理语句的工作原理如下:
  • 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:
    1. INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
    复制代码


  • 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
  • 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

相比于直接执行SQL语句,预处理语句有两个主要优点:
  • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
  • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
  • 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。


MySQLi 预处理语句
以下实例在 MySQLi 中使用了预处理语句,并绑定了相应的参数:
实例 (MySQLi 使用预处理语句)
  1. <?php$servername = "localhost";$username = "username";$password = "password";$dbname =
  2. "myDB";
  3. // 创建连接$conn = new mysqli($servername, $username, $password, $dbname);
  4. // 检测连接if ($conn->connect_error) {
  5.     die("连接失败: " . $conn->connect_error);}
  6. // 预处理及绑定$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
  7. VALUES (?, ?, ?)");$stmt->bind_param("sss", $firstname, $lastname, $email);
  8. // 设置参数并执行$firstname = "John";$lastname = "Doe";$email = "john@example.com";
  9. $stmt->execute();
  10. $firstname = "Mary";$lastname = "Moe";$email = "mary@example.com";$stmt->execute();
  11. $firstname = "Julie";$lastname = "Dooley";$email = "julie@example.com";$stmt->execute();
  12. echo "新记录插入成功";
  13. $stmt->close();$conn->close();?>
复制代码

解析以下实例的每行代码:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"
在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。
接下来,让我们来看下 bind_param() 函数:
$stmt->bind_param("sss", $firstname, $lastname, $email);
该函数绑定了 SQL 的参数,且告诉数据库参数的值。 "sss" 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。
参数有以下四种类型:
  • i - integer(整型)
  • d - double(双精度浮点型)
  • s - string(字符串)
  • b - BLOB(binary large object:二进制大对象)

每个参数都需要指定类型。
通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。
注意: 如果你想插入其他数据(用户输入),对数据的验证是非常重要的。


PDO 中的预处理语句
以下实例我们在 PDO 中使用了预处理语句并绑定参数:
实例 (PDO 使用预处理语句)
  1. <?php$servername = "localhost";$username = "username";$password = "password";$dbname =
  2. "myDBPDO";
  3. try {
  4.     $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  5.        // 设置 PDO 错误模式为异常
  6.     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.     // 预处理 SQL 并绑定参数
  8.     $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
  9.     VALUES (:firstname, :lastname, :email)");   
  10.     $stmt->bindParam(':firstname', $firstname);   
  11.      $stmt->bindParam(':lastname', $lastname);    $stmt->bindParam(':email', $email);
  12.     // 插入行
  13.     $firstname = "John";    $lastname = "Doe";    $email = "john@example.com";    $stmt->execute();
  14.     // 插入其他行
  15.     $firstname = "Mary";    $lastname = "Moe";    $email = "mary@example.com";    $stmt->execute();
  16.     // 插入其他行
  17.     $firstname = "Julie";    $lastname = "Dooley";   
  18.      $email = "julie@example.com";    $stmt->execute();
  19.     echo "新记录插入成功";}catch(PDOException $e){
  20.     echo "Error: " . $e->getMessage();}$conn = null;?>
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:44:15 | 显示全部楼层
PHP MySQL 读取数据从 MySQL 数据库读取数据
SELECT 语句用于从数据表中读取数据:
  1. SELECT column_name(s) FROM table_name
复制代码

我们可以使用 * 号来读取所有数据表中的字段:
  1. SELECT * FROM table_name
复制代码

如需学习更多关于 SQL 的知识,请访问我们的 SQL 教程

使用 MySQLi
以下实例中我们从 myDB 数据库的 MyGuests 表读取了 id, firstname 和 lastname 列的数据并显示在页面上:
实例 (MySQLi - 面向对象)
  1. <?php$servername = "localhost";$username = "username";$password = "password";$dbname
  2. = "myDB";
  3. // 创建连接$conn = new mysqli($servername, $username, $password, $dbname);
  4. // Check connectionif ($conn->connect_error) {
  5.     die("连接失败: " . $conn->connect_error);}
  6. $sql = "SELECT id, firstname, lastname FROM MyGuests";$result = $conn->query($sql);
  7. if ($result->num_rows > 0) {
  8.     // 输出数据
  9.     while($row = $result->fetch_assoc()) {
  10.         echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " .
  11.         $row["lastname"]. "<br>";    }} else {
  12.     echo "0 结果";}$conn->close();?>
复制代码

以上代码解析如下:
首先,我们设置了 SQL 语句从 MyGuests数据表中读取 id, firstname 和 lastname 三个字段。之后我们使用改 SQL 语句从数据库中取出结果集并赋给复制给变量 $result。
函数 num_rows() 判断返回的数据。
如果返回的是多条数据,函数 fetch_assoc() 将结合集放入到关联数组并循环输出。 while() 循环出结果集,并输出 id, firstname 和 lastname 三个字段值。
以下实例使用 MySQLi 面向过程的方式,效果类似以上代码:
实例 (MySQLi - 面向过程)
  1. <?php$servername = "localhost";$username = "username";$password = "password";
  2. $dbname = "myDB";
  3. // 创建连接$conn = mysqli_connect($servername, $username, $password, $dbname);
  4. // Check connectionif (!$conn) {
  5.     die("连接失败: " . mysqli_connect_error());}
  6. $sql = "SELECT id, firstname, lastname FROM MyGuests";$result =
  7. mysqli_query($conn, $sql);
  8. if (mysqli_num_rows($result) > 0) {
  9.     // 输出数据
  10.     while($row = mysqli_fetch_assoc($result)) {
  11.         echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " .
  12.         $row["lastname"]. "<br>";    }} else {
  13.     echo "0 结果";}
  14. mysqli_close($conn);?>
复制代码


使用 PDO (+ 预处理)
以下实例使用了预处理语句。
选取了 MyGuests 表中的 id, firstname 和 lastname 字段,并放到 HTML 表格中:
实例 (PDO)
  1. <?phpecho "<table style='border: solid 1px black;'>";
  2. echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";
  3. class TableRows extends RecursiveIteratorIterator {
  4.     function __construct($it) {
  5.         parent::__construct($it, self::LEAVES_ONLY);
  6.     }

  7.     function current() {
  8.         return "<td style='width:150px;border:1px solid black;'>" .
  9.         parent::current(). "</td>";    }

  10.     function beginChildren() {
  11.         echo "<tr>";
  12.     }

  13.     function endChildren() {
  14.         echo "</tr>" . "\n";    } }
  15. $servername = "localhost";$username = "username";$password =
  16.   "password";$dbname = "myDBPDO";
  17. try {
  18.     $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  19.         $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   
  20.          $stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests");
  21.     $stmt->execute();
  22.     // 设置结果集为关联数组
  23.     $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  24.     foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
  25.         echo $v;    }}catch(PDOException $e) {
  26.     echo "Error: " . $e->getMessage();}$conn = null;echo "</table>";?>
复制代码



回复

使用道具 举报

 楼主| 发表于 2019-11-19 16:45:18 | 显示全部楼层
PHP MySQL Where 子句
WHERE 子句用于过滤记录。

WHERE 子句
WHERE 子句用于提取满足指定标准的的记录。
语法
  1. SELECT column_name(s)FROM table_name
  2. WHERE column_name operator value
复制代码

如需学习更多关于 SQL 的知识,请访问我们的 SQL 教程
为了让 PHP 执行上面的语句,我们必须使用 mysqli_query() 函数。该函数用于向 MySQL 连接发送查询或命令。
实例
下面的实例将从 "Persons" 表中选取所有 FirstName='Peter' 的行:
  1. <?php
  2. $con=mysqli_connect("localhost","username","password","database");// 检测连接if (mysqli_connect_errno()){
  3.         echo "连接失败: " . mysqli_connect_error();}$result = mysqli_query($con,"SELECT * FROM Persons
  4. WHERE FirstName='Peter'");while($row = mysqli_fetch_array($result)){
  5.         echo $row['FirstName'] . " " . $row['LastName'];
  6.         echo "<br>";}?>
复制代码

以上代码将输出:
  1. Peter Griffin
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩图文



在线客服(工作时间:9:00-22:00)
400-600-6565

内容导航

微信客服

Copyright   ©2015-2019  云服务器社区  Powered by©Discuz!  技术支持:尊托网络     ( 湘ICP备15009499号-1 )