原文来自: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. SSH 登录警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

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

  2. Pytest(11)allure报告

    前言 allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. mac环境: ...

  3. 解决 error MSB4057: 该项目中不存在目标“_CopyWebApplication” 问题

    在使用MSBuild 编译项目的时候报错: 解决办法: 在Web项目中,使用Nuget添加引用  MSBuild.Microsoft.VisualStudio.Web.targets 即可.

  4. 2020牛客暑期多校训练营(第八场)Game SET

    传送门:Game SET 题意 一套牌有四种属性,每种属性都有三种特征,shapes (one, two, or three), shape (diamond, squiggle, or oval), ...

  5. Codeforces Round #604 (Div. 2) A. Beautiful String(贪心)

    题目链接:https://codeforces.com/contest/1265/problem/A 题意 给出一个由 a, b, c, ? 组成的字符串,将 ? 替换为 a, b, c 中的一个字母 ...

  6. Codeforces Round #547 (Div. 3) F1/2. Same Sum Blocks (Easy/Hard) (贪心,模拟)

    题意:有一长度为\(n\)的数组,求最多的区间和相同的不相交的区间的个数. 题解:我们可以先求一个前缀和,然后第一层循环遍历区间的右端点,第二层循环枚举左端点,用前缀和来\(O(1)\)求出区间和,\ ...

  7. Light Bulb ZOJ - 3203 三分

    三分: 和二分非常类似的一个算法,与二分不同的是 二分是单调的,而三分是一个先增后减或者先减后增 三分可以求出峰值. 注意三分一定是严格单调的,不能有相等的情况. 讲个例题: 题目 题意: 一个人发现 ...

  8. CF1475-C. Ball in Berland

    CF1475-C. Ball in Berland 题意: 一个班级有\(a\)个男生和\(b\)个女生,现在这个班级有\(k\)对男女愿意一起出席毕业典礼,这里注意\(k\)对男女中可能会有某个男生 ...

  9. Postman查看上传文件过程时出现400 - Required MultipartFile parameter 'files' is not present错误

    我在利用postman查看上传图片文件时,出现了如下图的错误,看到之后很懵逼. 图1 上网搜了一下,归结下来就是参数不一致导致的.不过还有一些是由于没加注解,如下图示: 图2 关于参数不一致问题,主要 ...

  10. 蓝桥杯——试题 算法训练 Sereja and Squares

    Java 代码 ```` import java.util.Scanner; public class Main { private static long num = 0; private stat ...