一、MySQL 数据查询
SQL 数据查询语句是 select 语句,可以进行各种各样的查询,以满足用户的查询需求。
user 表结构:
字段名 | 数据类型 | 约束 | 字段说明 |
---|---|---|---|
id | int | auto_increment primary key | 编号 |
username | varchar(200) | not null | 姓名 |
password | varchar(200) | not null | 密码 |
gold | int | default 100 | 金币 |
普通查询语法格式:
示例
代码讲解
1、普通查询
select from user;
通过 select 语句,查询 user 表中所有记录。
select:代表当前是查询语句。
:代表查询 user 表中的所有字段。
from:用于指定将要查询的表名。
user:代表查询 user 表的数据。
运行效果
有些情况下,我们并不需要查询表中所有字段,可以将 “ * ” 替换为将要查询的字段名。
普通查询语法格式:
示例
select id,username,password from user;
代码讲解
1、普通查询
select id,username,password from user;
通过 select 语句,查询 user 表中所有记录,并且只查询 id、username、password 字段值。
id,username,password:代表将要查询的字段,多个字段之间用逗号分割。
运行效果
在大多数情况下,用户并不需要查询表中所有记录,而是需要根据特定条件来查询部分数据,此时,可以使用 where 关键字实现条件查询。
条件查询语法格式:
示例
select * from user where gold=100;
代码讲解
1、条件查询
select * from user where gold=100;
通过 select 语句,查询 user 表中 gold 字段值等于 100 的所有记录。
where:用于指定查询语句的条件。
gold=100:代表查询语句的条件。
运行效果
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” 的记录。
运行效果
2、PDO 执行 select 语句
在 PHP 中,想要对 MySQL 执行查询操作,可以通过 PDO 的 query() 方法来实现。query() 方法不同于 exec() 方法,它通常用于执行 select 语句,返回值是 PDOStatement 实例。
语法格式:
PDOStatement PDO::query(String sql)
示例
<?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");
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’;
运行效果
恶意登录
但是一些别有用心的人,会在输入用户名、密码时,嵌入恶意的 SQL 语句,以此来实现非法登陆的操作。例如,输入的用户名为 “’or 1=1;#” ,密码为任意内容。
示例
select * from user where username=’’ or 1=1;#’ and password=’’;
运行效果
可见这样的结果不是我们想要的,有漏洞的代码是致命的。为了防止 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() 方法,执行预处理语句。