【问题标题】:Having trouble with MYSQL IN() functionMYSQL IN() 函数有问题
【发布时间】:2023-03-02 22:28:01
【问题描述】:

我正在为一个站点构建一个动态新闻应用程序。新闻将被分成类别,然后可能包含子类别(可能包含子类别)和新闻文章。我创建了一个递归函数来返回某个类别的所有子类别的所有类别 ID。我想运行一个查询来获取其类别在递归函数返回的集合中的所有新闻帖子。

当我尝试使用它时(我正在使用 PEAR DB)

//$myReturnedIDs is a comma delimited list of ids. 5,6,7,8,10,12

$oPrep = $oConn->prepare("SELECT NewsID FROM SiteNews WHERE NewsCategory IN (?)");

$oRes = $oConn->execute($oPrep, array($myReturnedIDs));

生成的查询如下所示:

SELECT NewsID FROM SiteNews WHERE NewsCategory IN('5,6,7,8,10,12')

虽然我需要它看起来像:

SELECT NewsID FROM SiteNews WHERE NewsCategory IN(5,6,7,8,10,12)

现在,我意识到我可以在 prepare 语句中填充查询的那部分,但我觉得这会导致一些可能的攻击漏洞。我是否过于谨慎,因为数据不是用户生成的?有什么方法可以使这项工作吗?我的另一个想法是添加一个?对于每个 ID,金额将在准备语句之前确定(在获取所有 ID 之后),但这对我来说感觉很笨拙。有什么建议吗?

【问题讨论】:

标签: php mysql pear


【解决方案1】:

我猜$myReturnedIDs 是一个逗号分隔的字符串。所以这个:

array($myReturnedIDs)

产生一个单元素数组:

["5,6,7,8,10,12"]

如果是这样,那么你想使用explode 来制作你想要的数组:

$oRes = $oConn->execute($oPrep, explode(",", $myReturnedIDs));

希望有帮助!

【讨论】:

  • 使用 PEAR 执行,准备好的语句中的参数数量必须等于参数数组的数量。这会导致不匹配错误。
  • @MichaelWheeler - 我想我误解了execute 的论点。尝试改用array(explode(",", $myReturnedIDs))。如果那行得通,我也会在我的答案中修复它。干杯!
  • 我仍然收到不匹配错误。我正在查看stackoverflow.com/questions/920353/…,因为我的问题似乎与此重复。
  • 当。本来很方便...另一个想法-如果您信任$myReturnedIDs 的来源,则可以在prepare 中使用! 而不是? 来替换它而不转义它的参数。但这就是我所得到的。祝你好运!
  • 感谢您的想法!实际上,不应该出现一个会干扰任何查询的 ID(所有 ID 都是在管理员创建子类别时自动生成的),所以数据应该是卫生的!
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多