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语句操作