原文来自:https://blog.csdn.net/zc474235918/article/details/50544484

看一下这两个句子:

select * from user
select * from user where 1=1

这两个 句子执行结果是一样一样的。而sql注入就是利用了这个原理 来进行破坏。比如:

select * from user where id='1000'

如果允许用户输入的话,那么这个句子就成了:

select * from user where id='XXX' or 1=1

这样的话,这个句子就是恒成立的了。

上述1=1 的使用,会影响预先指定的查询结果,使得本来要查询的数据 失效。 
       where 1=1 这种写法 虽然给程序开发人员带来不便,还要避免sql注入的问题。       但 “1=1” 这种写法 也会给程序编写增加了方便。

1=1 可以很方便的规范语句

对于组合查询的来说,因为查询比较模糊,而查询的where条件的个数也不确定。 
一般这样的sql语句进行查询的时候:

sql.append("select * from User");
if (whereUser.getID()!="") {
sql.append(" where ID=@id");
}
if (whereUser.getName()!="") {
sql.append(" and Name=@name");
}
if (whereUser.getAddress()!="") {
sql.append(" and Phone=@phone");
}

对于上述这种写法,逻辑上感觉没有问题。但是如果whereUser里面的id为空。那么最后拼接出来得到的语句会成:

select * from User and Name='XXX' and Phone='XXX'.

这条语句 没有where关键字,肯定会报错的。 
       但是如果说,既然条件个数未知,那么把where关键字放到 if外面去:

sql.append("select * from User");
sql.append("where"); if (whereUser.getID()!="") {
sql.append(" ID=@id");
}
if (whereUser.getName()!="") {
sql.append(" and Name=@name");
}
if (whereUser.getAddress()!="") {
sql.append(" and Phone=@phone");
}

这样写的话,如果三个条件都为空。则这是一条不带查询条件的查询。那么最后这条语句会被解析成:

select * from User where;

这条语句,空有where关键字 没有条件,照样会报错的。

对于解决上述这种未知的问题,只能进行各种情况的判断进行拼接。

当然可以用“where 1=1”进行代码的规范:

sql.append("select * from User where 1=1 ");
if (whereUser.getID()!="") {
sql.append(" and ID=@id");
}
if (whereUser.getName()!="") {
sql.append(" and Name=@name");
}
if (whereUser.getAddress()!="") {
sql.append(" and Phone=@phone");
}

对于上述的这种写法,无论是否有条件 都是可以成立的。

无条件的的时候:

select * from User where 1=1;

有条件的时候:

select * from User where 1=1 and id='XX' ……;

这样写的代码,会比 分情况判断的代码 更规范。对于以上的写法,并不是唯一的。也可以使 where ‘a’=’a’ 、’a’<>’b’等。

sql where 1=1 的详细解释的更多相关文章

  1. SQL Server 运行计划操作符具体解释(3)——计算标量(Compute Scalar)

    接上文:SQL Server 运行计划操作符详细解释(2)--串联(Concatenation ) 前言: 前面两篇文章介绍了关于串联(Concatenation)和断言(Assert)操作符,本文介 ...

  2. cmd批处理转义字符%的详细解释

    cmd批处理转义字符%的详细解释 在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同. 1.%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符.逃逸 ...

  3. .htaccess语法之RewriteCond与RewriteRule指令格式详细解释

    htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签:  htaccess it 分类: 网络 上文htacc ...

  4. cookie的详细解释

    突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...

  5. tar命令的详细解释

    tar命令的详细解释 标签: linuxfileoutputbashinputshell 2010-05-04 12:11 235881人阅读 评论(12) 收藏 举报  分类: linux/unix ...

  6. Linux学习笔记15——GDB 命令详细解释【转】

    GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...

  7. C语言 - 结构体(struct)比特字段(:) 详细解释

    结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...

  8. 姿势体系结构的详细解释 -- C

    我基本上总结出以下4部分: 1.问题的足迹大小. 2.字节对齐问题. 3.特别保留位0. 4.这种结构被存储在存储器中的位置. #include <stdio.h> #include &l ...

  9. Java - 面向对象(object oriented)计划 详细解释

    面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...

随机推荐

  1. 常用的正则表达式@java后台

    package Regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @作者 Goofy * @邮件 ...

  2. python ---线程,进程,协程

    本章内容 线程 进程 协程 线程是最小的调度单位 进程是最小的管理单元 线程 多线程的特点: 线程的并发是利用cpu上下文切换 多线程的执行的顺序是无序的 多线程共享全局变量 线程是继承在进程里的,没 ...

  3. SSH 登录警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    1.使用Linux SSH登录其他Linux或者cisco交换机时有如下报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! (远程主机标识已更改) ...

  4. Redis 实战 —— 14. Redis 的 Lua 脚本编程

    简介 Redis 从 2.6 版本开始引入使用 Lua 编程语言进行的服务器端脚本编程功能,这个功能可以让用户直接在 Redis 内部执行各种操作,从而达到简化代码并提高性能的作用. P248 在不编 ...

  5. B 等差素数列

    B 等差素数列:2,3,5,7,11,13,....是素数序列.类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列.上边的数列公差为30,长度为6.2004年,格 ...

  6. E - E(最短路解决源点到多点,多点到源点的和(有向图))

    问从1号点到各个点的距离+各个点到1号点之间的距离和的最小值 详解键连接https://www.cnblogs.com/csx-zzh/p/13411588.html In the age of te ...

  7. Codeforces Round #638 (Div. 2)

    Contest Info Practice Link Solved A B C D E F 4/6 O O Ø  Ø     O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试 Sol ...

  8. HDU6532 Chessboard (最大费用流)

    题意:棋盘上有n个棋子 每个棋子都有收益 现在给定1e5条线 有横着的 竖着的 规定只能在线的一侧选最多ki个棋子 问最大收益 题解:写自闭的一道题 很容易想到是网络流 但是建图有点难 第一道最大费用 ...

  9. Python 装包与拆包

    装包就是把未命名的参数放到元组中,把命名参数放到字典中 a = 1, 2 print(a) (1, 2) 拆包将一个结构中的数据拆分为多个单独变量中 *args **kwargs def run1(* ...

  10. Zabbix + Grafana 可视化

    Zabbix 自定义图形 Zabbix 自带图形 Zabbix 图形树安装 # 1.上传 [root@zabbix ~]# cd /usr/share/zabbix [root@zabbix zabb ...