【问题标题】:mysql, query with to where condation, if the one value = any thingmysql,查询条件条件,如果一个值=任何东西
【发布时间】:2014-06-30 16:25:43
【问题描述】:

表格

id        name            value  
1         abc             12
2         def             13
4         mkg             14
5         pcr             10

select * from table where name = 'abc' and value = 12;--------------------- 这会给我

的结果
1        abc       12

SELECT * FROM table WHERE name = 'abc' AND value = 12 OR 1=1

这将列出我所有的项目,因为它应该只列出 name='abc' 然后搜索值 12 或任何东西,如果不是 12 意味着空白,它应该可以。

    1         abc             12
    2         def             13
    4         mkg             14
    5         pcr             10

在这里,我只想获取 name='abc',但每次查询时都必须运行两个条件。 like (select * from table where name=x and value=x or 1=1)

应该显示:

1    abc    12

idia 是用户将通过输入为其中一列赋予值,结果应根据用户输入进行搜索。

query: (SELECT * FROM table WHERE name = x or 1=1 AND (value = x or 1=1)

所以如果用户只查询 name ='abc' 和 value any

 select * from table where name = 'abc' OR 1=1 and (value = '' OR 1=1):
 select * from table where name = '' OR 1=1  and (value = 12 OR 1=1):

因为用户会将其中之一放在 namevalue 所以我必须将 OR 1=1 放在两者中他们。

<form>
<input type='text' name='name'>
<input type='text' name='value'>
<submit>
</form>

所以现在

1- 如果用户为两者都设置了值,则可以使用简单的 Q= 其中 x=x 和 y=y

2= 如果用户为 one(name) Q= WHERE name=x and value = '' OR 1=1;

3- 如果用户为 one(value)Q=select * from table WHERE name = 'abc' and (value = '' OR 1=1) 输入值:

4-如果用户为both(name,value) Q=select * from table WHERE name='abc' AND value=12;

现在我想要可以管理所有内容的查询:

query = SELECT * FROM table where name = Get-INPUT OR 1=1 AND (value= Get-INPUT or 1=1)

但这对我不起作用,因为条件 (1=1) 为真,它会向我显示所有记录。 问题:如何管理我的表单,如果用户输入一个条件其他条件只是用户 1=1-true

问候

【问题讨论】:

  • 您是否只是想获取名称为“abc”的所有行?如果是这样,那么它就是SELECT * FROM table WHERE name = 'abc'
  • 如果你不使用方括号,系统会在这种模式下解释 where 子句: (name='abc' and Value=12) 这给出结果 abc 12 然后查询评估 or 子句(1=1) 在您的情况下始终为真,因此它会返回所有其他行。
  • 您的问题不清楚。给出的第一个结果有什么问题?为什么要在查询中添加OR 1=1
  • 更新前的第一个答案,因为我必须在 WHERE 中设置条件,并且用户将给出一个值(对于名称或值),因此如果一个条件获得值,另一个条件将为空,因为它与 AND 它一样不会给出结果,所以我设置 1=1 表示 tue,现在我设置了两个,因为用户将输入一个值,所以我设置 1=1 表示两个条件都为真,结果都是我

标签: mysql sql


【解决方案1】:

在查询中使用方括号,对 WHERE 子句项进行逻辑分组。

WHERE name = 'abc' AND (value = 12 OR 1=1)

如果您尝试提供一个接受两个变量的查询,并根据这些变量进行搜索,那么您的逻辑只会稍有偏差。

同时提供两个变量

假设我们有两个变量@incoming_name@incoming_value

SET @incoming_name = 'abc';
SET @incoming_value = 12;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

这会给你

1        abc       12

提供一个变量

然后,如果用户为其中任何一个值提供 NULL,它将在您的搜索中跳过它们。

SET @incoming_name = 'abc';
SET @incoming_value = NULL;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

这仍然会给你预期的结果

1        abc       12

不提供变量

如果用户没有提供任何变量来缩小搜索范围

SET @incoming_name = NULL;
SET @incoming_value = NULL;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

你会得到表格中的所有结果

1         abc             12
2         def             13
4         mkg             14
5         pcr             10

在脚本中使用变量

使用这种方法你不必SET MySQL 中的变量名,那只是为了演示目的。您也可以将代码/脚本中的值放在其他语言中。例如使用 PHP 和 PDO Prepared Statments

SELECT * FROM table1 
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)

然后您可以将您的用户变量绑定到:incoming_name:incoming_value,它会按照您的预期进行搜索。如果其中一个为 null,它将跳过它们,否则搜索中将需要它们。

警告:我没有测试过这段代码,只是为了让你大致了解它的工作原理。它使用 PHPs PDO and prepared statements as documented here

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

$stmt = $dbh->prepare("SELECT * FROM table1 
    WHERE (:incoming_name1 = name OR :incoming_name2 IS NULL)
    AND (:incoming_value1 = value OR :incoming_value2 IS NULL)");
$stmt->bindParam(':incoming_name1', $name);
$stmt->bindParam(':incoming_name2', $name);
$stmt->bindParam(':incoming_value1', $value);
$stmt->bindParam(':incoming_value2', $value);

if ($stmt->execute()) {
  while ($row = $stmt->fetch()) {
    var_dump($row);
  }
}

您需要为查询中的每个参数绑定一个单独的名称,这就是为什么当我们需要两次相同的参数时我们需要给它一个单独的名称(incoming_value1incoming_value2

【讨论】:

  • 那只是SELECT * FROM table WHERE name = 'abc'
  • 分析器是正确的,但在这里我有查询(select * from table where name = x OR 1=1 and (value = x or 1=1)) 因为用户会给出值for (name or value , or name or value) 其中之一或两者。
  • 我将更新我的答案,以包含一个如何执行该逻辑的示例。
  • 更新了我的答案,展示了如何根据各种用户输入过滤结果。
  • @SOomee 我添加了一个简短的示例,说明如何使用 PHPs PDO 和准备好的语句来实现这一点。
【解决方案2】:

1=1 表示TRUE。和(? OR TRUE) = TRUE

这就是为什么如果您的查询中有OR 1=1,您将获得所有项目。那么这就足够了:

SELECT * FROM table WHERE name = 'abc'

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2011-11-16
    • 1970-01-01
    • 2021-12-15
    • 2016-04-12
    • 2019-11-06
    相关资源
    最近更新 更多