【问题标题】:SQL OR not returning all rowsSQL OR 不返回所有行
【发布时间】:2016-02-20 07:09:09
【问题描述】:

我遇到了可能是最愚蠢的问题。
我正在使用 phpmyadmin,当我使用 OR 查询表时,它不会返回所有值。
这是未返回所有值的查询:
SELECT * FROM ecrdatabase.ecrtable m WHERE m.ecrChangeOwner = '$partialOwner' OR m.ecrInitByName = '$partialOwner'.
这里,$partialOwner 是从 $_GET['user'] 传递过来的。
一些行被返回 - 不是所有的。我有一个查询数据库的 php 页面,我尝试通过 phpmyadmin 使用查询直接在数据库上运行查询:
SELECT * FROM ecrtable WHERE ecrChangeOwner = 'ecunningham' OR ecrInitByName = 'ecunningham'.

直接查询和 php 页面的结果都返回相同的行数。
我也试过:
SELECT * FROM ecrtable WHERE (ecrChangeOwner = 'ecunningham' OR ecrInitByName = 'ecunningham').

我错过了什么?我有更复杂的查询运行良好。请告诉我,我只是错过了一些愚蠢的东西......

【问题讨论】:

  • 直接查询和php页面的结果都返回相同的行数。那有什么问题呢?
  • @Manu 他们都错了。正确的行数应该是 119,但两者都只返回 97。如果我单独运行查询,“SELECT * FROM ecrtable WHERE ecrInitByName”会返回 32 行。 'SELECT * FROM ecrtable WHERE ecrChangeOwner' 返回 87 行。
  • 您知道,当条件1 和条件2 匹配一行时,两个查询都可以返回双精度值……最后一个查询返回查询1 和查询2 中的所有数据,但没有双精度值。
  • @Manu 就是这样。这很有道理。
  • 我没想到

标签: php mysql phpmyadmin


【解决方案1】:

真的首先应该在这里使用准备好的语句。您很容易受到注入攻击。

第二,你怎么知道这个查询没有返回所有的行?你做了哪些查询来验证这个是错误的?

如果你经营一个工会,你会得到什么:

SELECT * FROM ecrtable WHERE ecrChangeOwner = 'ecunningham'
UNION ALL
SELECT * FROM ecrtable WHERE ecrInitByName = 'ecunningham')

【讨论】:

  • 你说的都是对的。我正在寻找的行为在我运行查询的方式中是不可能的。我在两列中有重复项。您对注射也是绝对正确的。我一直懒于尝试理解 PDO,这是针对我工作中的内部系统(低安全性)。但我仍然需要了解重要的问题。谢谢。我投票赞成这个答案。
  • this is for an internal system at my job (low security) -> **著名的遗言**。如果它有用,就不会长期这样,而且第一次做对就容易 100 倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
相关资源
最近更新 更多