【问题标题】:sql pdo php where in variablesql pdo php 在变量中的位置
【发布时间】:2020-07-22 16:42:52
【问题描述】:

我想使用变量从我的数据库中选择一些数据。

这是我的代码的简短版本:

// $a is either null or something like [1, 2]
if ($a) {
    $debug = implode(',', $a);
} else {
    $debug = [0-9];
}

$sql = "SELECT id FROM user WHERE id IN ($debug)"

如果设置了$a,我怎样才能实现只获得用户 1 和 2(=$a 中的值),如果未设置 $a,我将获得所有用户?

【问题讨论】:

标签: php mysql sql pdo


【解决方案1】:

第一
当您直接在查询中注入字符串时请注意,因为您可能成为 SQL 注入的目标

第二
直接更改查询可能是最简单的解决方案

// $a is either null or something like [1, 2]
$sql = "SELECT id FROM user";
if ($a) {
    $debug = implode(',', $a);
    $sql = "SELECT id FROM user WHERE id IN ($debug)";
}

【讨论】:

  • ` SQL 注入的目标` 这不需要用户输入吗?如果$debug 仅设置为已知值(而不是来自$_POST 左右),那么这应该不是问题。
  • 是否存在类似SELECT id FROM user WHERE id IN (any number) 的东西?
  • @Luuk 实际上在我的代码中我已经直接注入了自 idk 以来该数组来自哪里的字符串,但我警告他这种可能性
  • @Luuk 这些值来自 $_GET 但我检查数组是否只包含数字:)。
  • @user13977445 我无法找到任何方法来实现您使用数字提出的要求,或者如果您真的需要这种东西,您可以使用where ... id IN (select id from user) 之类的东西,然后注入@ 987654326@ 作为字符串,但我的意思是,它不像一个建议那么好啊哈
【解决方案2】:

你可以在 $a 上设置标志来检查它是否为空 $debug 必须包含一个带有 id 的逗号分隔字符串,即 '2,32,12,54,56,76'

$sql = "SELECT id FROM user ";
if(!empty($a)){
$debug = implode(',', $a); //here you must get string like '1,2,3,4,5'
$sql .= " WHERE id IN ($debug)";
}

//here if $a is empty you have all rows and if $a have values you get selected rows

//final query will be
// if a is empty 'SELECT id FROM user '
// else 'SELECT id FROM user WHERE id IN (1,2,3)' // where 1,2,3 got from $debug

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2016-04-07
    • 2018-12-11
    • 2020-12-20
    • 2020-07-31
    • 2014-05-15
    相关资源
    最近更新 更多