sql pdo php 在变量中的位置

Posted

技术标签:

【中文标题】sql pdo php 在变量中的位置【英文标题】:sql pdo php where in variable 【发布时间】: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,我将获得所有用户?

【问题讨论】:

你试过isset($a)吗? 请参阅***.com/questions/2373562/pdo-with-where-in-queries,了解如何使用准备好的查询而不是替换字符串来执行此操作。 【参考方案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

【讨论】:

以上是关于sql pdo php 在变量中的位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]

在 MYSQL 中使用 IN 会导致 PHP 中的变量出现问题

有关php,pdo中的问题:setAttribute(PDO:ATTR_ERRMODE,PDO:ERRMODE_EXCEPTION)含义解释?

PHP中的PDO对象操作学习初始化PDO及原始SQL语句操作

PHP中的PDO对象操作学习初始化PDO及原始SQL语句操作

正确计算确切编号的方法。使用 PHP PDO 的 SQL 中的行数