MySQL数据查询

mysql数据查询语句是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 字段1,字段2…from 表名;
select * from 表名 where 条件;

where关键字注意:

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

MySQL比较运算符:

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

MySQL逻辑运算符:

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

条件查询:

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

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 = new PDO($url,$user,$pwd);
  7. $st = $conn->query("select * from user");
  8. //通过pdo的query方法,执行查询语句,返回值 为PDOStatement实例
  9. print_r($st);

在PDO中,使用fetchALL()方法可以返回一个包含结果集中所有行的二维数组。
语法格式:
array PDOStatement::fetchAll([ int $fetch_style[ , mixed $fetch_argument[ , array $ctor_args ] ] ] )

  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 = new PDO($url,$user,$pwd);
  7. $st = $conn->query("select * from user");
  8. $rs = $st->fetchAll();
  9. //通过PDO实例,调用fetchAll()方法,获得查询结果集中所有数据
  10. echo "<pre>";
  11. print_r($rs);
  12. echo "</pre>";

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

sql注入

SQL 注入是指攻击者篡改程序中的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来欺骗数据库服务器执行非授权的任意查询语句,从而进一步得到相应的数据信息。

SQL 注入最常出现在 “会员登陆” 功能中。例如,某用户在网站中执行登陆操作时,程序将会执行如下 SQL 语句:
select * from 用户表 where username=’用户名’ and password=’密码’
当用户输入正确的用户名、密码时,该语句将会查询到相应记录,则表示会员登陆成功。

示例:

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

恶意的:
select * from user where username=’’ or 1=1;#’ and password=’’;
为了防止这种漏洞我们有了预处理

PDO预处理

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

  1. <?php
  2. header("content-type:text/html;charset=utf-8");
  3. $userName = "张三";
  4. $password = "123456";
  5. //连接数据库
  6. $url = "mysql:host=127.0.0.1;dbname=cai";
  7. $user = "root";
  8. $pwd = "123";
  9. $conn = new PDO($url,$user,$pwd);
  10. //预处理
  11. $st = $conn->prepare("select * from user where username=? and password=?");
  12. $st->bindParam(1,$userName);
  13. $st->bindParam(2,$password);
  14. $st->execute();
  15. //获得结果集
  16. $rs = $st->fetch();
  17. echo "<pre>";
  18. var_dump($rs);
  19. 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() 方法,执行预处理语句。