select * from users where [Name]='abc' and Password='ddd' or 1=1
和select * from users where [Name]='abc' or 1=1 and Password='ddd'
两条语句同样的结果,不明白第2个语句的and两边的条件 1 and 0 为什么还能查出来呢?Password是随便输的一个密码,不是正确的
急,请解答谢谢

解决方案 »

  1.   

    因为or前面的条件Name='abc'为真。
      

  2.   


    select * from users where [Name]='abc' and Password='ddd' or 1=1 这一句作用等同于select * from usersselect * from users where [Name]='abc' or 1=1 and Password='ddd' 这句等同于select * from users where Password='ddd' 
      

  3.   

    是的  1or1 or两边的条件为真,但是 1 and 0 
    and两边的不全为真,为什么也能执行正确呢?
      

  4.   

    or操作符一头为真,整个表达式就为真。所以只要表里有一条记录满足Name='abc',就能查出结果,or后面根本无需计算。
      

  5.   

    谢了ThirstyCrow,不过第2个我有点乱感觉,select * from users where [Name]='abc' or 1=1 and Password='ddd' 
    这边的 1 or 1 已经为真了,而后面的and呢? and两边不全为真啊 1 and 0
    这边为什么不起作用了?
      

  6.   

    呵呵,小弟真是乍一看急了一下,晕了,呵呵
    实在惭愧,and优先级高于or执行完之后是 0
    而 1 or 0 仍然为 1 所以等同第一条,谢谢大家
      

  7.   

    语句里面只要有1=1,则select语句验证永远都是正确的,因为1=1永远为真!!!
      

  8.   

    and的优先级高于or,所以这两个条件可以分别写成:
    1. ([Name]='abc' and Password='ddd') or 1=1
    2. [Name]='abc' or (1=1 and Password='ddd')
    简化后就是:
    1. true
    2. [Name]='abc' or Password='ddd'