一、MySQL 数据查询

SQL 数据查询语句是 select 语句,可以进行各种各样的查询,以满足用户的查询需求。

user 表结构:

字段名 数据类型 约束 字段说明
id int auto_increment primary key 编号
username varchar(200) not null 姓名
password varchar(200) not null 密码
gold int default 100 金币

普通查询语法格式:

select * from 表名;

示例

select * from user;

代码讲解

1、普通查询
select from user;
通过 select 语句,查询 user 表中所有记录。
select:代表当前是查询语句。
:代表查询 user 表中的所有字段。
from:用于指定将要查询的表名。
user:代表查询 user 表的数据。

运行效果

会员登录 - 图1
有些情况下,我们并不需要查询表中所有字段,可以将 “ * ” 替换为将要查询的字段名。

普通查询语法格式:

select 字段1,字段2… from 表名;

示例

select id,username,password from user;

代码讲解

1、普通查询
select id,username,password from user;
通过 select 语句,查询 user 表中所有记录,并且只查询 id、username、password 字段值。
id,username,password:代表将要查询的字段,多个字段之间用逗号分割。

运行效果

会员登录 - 图2
在大多数情况下,用户并不需要查询表中所有记录,而是需要根据特定条件来查询部分数据,此时,可以使用 where 关键字实现条件查询。

条件查询语法格式:

select * from 表名 where 条件;

示例

select * from user where gold=100;

代码讲解

1、条件查询
select * from user where gold=100;
通过 select 语句,查询 user 表中 gold 字段值等于 100 的所有记录。
where:用于指定查询语句的条件。
gold=100:代表查询语句的条件。

运行效果

会员登录 - 图3

where 关键字注意:

1、where 关键字可以使用比较运算符指定任何条件。
2、where 条件可以是一个,也可以是多个,这些条件可以用逻辑运算符连接。

MySQL 比较运算符:

比较运算符 说明
= 等于,检测两个值是否相等,如果相等则返回true
<>、!= 不等于,检测两个值是否不相等,如果不相等则返回true
< 小于,检测左边的值是否小于右边的值,如果小于则返回true
<= 小于或等于,检测左边的值是否小于或等于右边的值,如果小于或等于则返回true
> 大于,检测左边的值是否大于右边的值,如果大于则返回true
>= 大于或等于,检测左边的值是否大于或等于右边的值,如果大于或等于则返回true

MySQL 逻辑运算符:

逻辑运算符 说明
and 表示多个条件都必须满足
or 表示满足任意条件就可以

示例

select * from user where username=’张三’ and password=’123456’;

代码讲解

1、条件查询
select * from user where username=’张三’ and password=’123456’;
通过 select 语句,查询 user 表中 username 字段值等于 “张三” 并且 password 字段值等于 “123456” 的记录。

运行效果

会员登录 - 图4

2、PDO 执行 select 语句

在 PHP 中,想要对 MySQL 执行查询操作,可以通过 PDO 的 query() 方法来实现。query() 方法不同于 exec() 方法,它通常用于执行 select 语句,返回值是 PDOStatement 实例。

语法格式:

PDOStatement PDO::query(String sql)

示例

  1. <?php
  2. header("content-type:text/html;charset=utf-8");
  3. $url="mysql:host=127.0.0.1;dbname=cai";
  4. $user="root";
  5. $pwd="123";
  6. $conn=newPDO($url,$user,$pwd);
  7. $st=$conn->query("select * from user");
  8. print_r($st);

代码讲解

1、执行 select 查询语句
$st = $conn->query(“select * from user”);
通过 PDO 的 query() 方法,执行 select 查询语句,返回值为 PDOStatement 实例。

fetchAll() 方法

在 PDO 中,使用 fetchAll() 方法可以返回一个包含结果集中所有行的二维数组。

语法格式:

array PDOStatement::fetchAll( [ int $fetch_style [ , mixed $fetch_argument [ , array $ctor_args ] ] ] )

示例

<?php
header("content-type:text/html;charset=utf-8");
$url="mysql:host=127.0.0.1;dbname=cai";
$user="root";
$pwd="123";
$conn=newPDO($url,$user,$pwd);
$st=$conn->query("select * from user");
$rs=$st->fetchAll();
echo"<pre>";
print_r($rs);
echo"</pre>";

代码讲解

1、获得查询结果集
$rs = $st->fetchAll();
通过 PDOStatement 实例,调用 fetchAll() 方法,获得查询结果集中所有数据。

fetch () 方法

在 PDO 中,使用 fetch () 方法可以从结果集中获取一条指定的记录,返回值为一维数组。

语法格式:

array PDOStatement::fetch( [ int $fetch_style [ , int $cursor_orientation [ , int $cursor_offset ] ] ] )

示例

<?php
header("content-type:text/html;charset=utf-8");
$url="mysql:host=127.0.0.1;dbname=cai";
$user="root";
$pwd="123";
$conn=newPDO($url,$user,$pwd);
$st=$conn->query("select * from user where username='张三' and password='123456'");
$rs=$st->fetch();
echo"<pre>";
print_r($rs);
echo"</pre>";

代码讲解

1、获得查询结果集
$rs = $st->fetch();
通过 PDOStatement 实例,调用 fetch() 方法,获得查询结果集中的一条记录。

3、SQL 注入

SQL 注入是指攻击者篡改程序中的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来欺骗数据库服务器执行非授权的任意查询语句,从而进一步得到相应的数据信息。
SQL 注入最常出现在 “会员登陆” 功能中。例如,某用户在网站中执行登陆操作时,程序将会执行如下 SQL 语句:
select * from 用户表 where username=’用户名’ and password=’密码’
当用户输入正确的用户名、密码时,该语句将会查询到相应记录,则表示会员登陆成功。

示例

select * from user where username=’张三’ and password=’123456’;

运行效果

会员登录 - 图5

恶意登录

但是一些别有用心的人,会在输入用户名、密码时,嵌入恶意的 SQL 语句,以此来实现非法登陆的操作。例如,输入的用户名为 “’or 1=1;#” ,密码为任意内容。

示例

select * from user where username=’’ or 1=1;#’ and password=’’;

运行效果

会员登录 - 图6
可见这样的结果不是我们想要的,有漏洞的代码是致命的。为了防止 SQL 注入的发生,最简单的办法就是使用预处理语句。

4、PDO 预处理

使用预处理语句,可以确保不会发生 SQL 注入的问题。在 PDO 中,可以使用 prepare() 方法来实现预处理语句,返回值是 PDOStatement 实例。

语法格式:

PDOStatement PDO::prepare( String sql )

示例

<?php
header("content-type:text/html;charset=utf-8");
$userName="张三";
$password="123456";
//连接数据库
$url="mysql:host=127.0.0.1;dbname=cai";
$user="root";
$pwd="123";
$conn=newPDO($url,$user,$pwd);
//预处理
$st=$conn->prepare("select * from user where username=? and password=?");
$st->bindParam(1,$userName);
$st->bindParam(2,$password);
$st->execute();
//获得结果集
$rs=$st->fetch();
echo"<pre>";
var_dump($rs);
echo"</pre>";

代码讲解

1、指定将要执行的 SQL 语句

$st = $conn->prepare(“select * from user where username=? and password=?”);
通过 PDO 的 prepare() 方法,指定将要执行的 SQL 语句,返回值为 PDOStatement 实例。
问号?:SQL 语句中的问号,表示占位符,后面将会为其绑定具体的参数值。

2、占位符绑定参数

$st->bindParam(1,$userName);
$st->bindParam(2,$password);
通过 bindParam() 方法,为 SQL 语句中的问号(占位符),绑定具体的参数值。
数字1:表示 SQL 语句中的第 1 个占位符,也就是 username 字段的值。
$userName:将 $userName 变量值,绑定到 SQL 语句中的第 1 个占位符。
数字2:表示 SQL 语句中的第 2 个占位符,也就是 password 字段的值。
$password:将 $password 变量值,绑定到 SQL 语句中的第 2 个占位符。

3、执行预处理语句

$st->execute();
通过 execute() 方法,执行预处理语句。