【问题标题】:use an array of unknown length in where clause of mysql [duplicate]在mysql的where子句中使用未知长度的数组[重复]
【发布时间】:2020-01-23 12:56:15
【问题描述】:

我正在编写一个 SQL 查询。我有一个长度未知的数组,我想通过在查询的 WHERE 子句中使用该数组来从 MySQL 中选择数据。这是我现在的查询,它工作正常

$sql = "SELECT DISTINCT messagesutou.SenderID from messagesutou where (messagesutou.SenderID !='$items[1]' AND messagesutou.SenderID !='$items[0]' AND messagesutou.SenderID !='$items[2]') AND messagesutou.RecieverID='$uid'";

但是在这里我知道数组 (3) 的长度,并且我只是使用带有索引的数组名称来进行测试。现在我想知道如果数组长度未知那么我将如何编写这个查询?

【问题讨论】:

  • 数组从何而来?我想你找where messagesutou.SenderID not in (...)
  • 来自retorfit android库
  • 我想你已经明白我在查询中想要什么
  • 警告:您的代码面临 SQL 注入攻击的风险,需要使用 PHP Prepared Statements 重写

标签: php mysql arrays


【解决方案1】:
$list = implode(',', $items);

SELECT DISTINCT SenderID 
FROM messagesutou 
WHERE 0 = FIND_IN_SET(SenderID, '$list')
  AND RecieverID='$uid'

或(取自Jens的答案,已被他删除)

SELECT DISTINCT SenderID 
FROM messagesutou 
WHERE SenderID NOT IN ($list)
  AND RecieverID='$uid'

区别 - 当 SenderID$items 值具有数字类型时,这两种变体都适用,只有在它们具有字符串类型时才适用,当它们具有字符串类型并包含逗号或刻度时则不适用。

但后者可能会被改编:

$list = '\''.implode('\',\'', $items).'\'';

SELECT DISTINCT SenderID 
FROM messagesutou 
WHERE SenderID NOT IN ($list)
  AND RecieverID='$uid'

它现在接受任何数据类型并允许使用逗号(但不包括记号 - 它们必须在内爆前被引用)。

【讨论】:

  • 您应该使用 PDO 或 MySQLi 准备好的语句
  • 我正在使用 mysqli
  • @Martin 我使用 OP 的方法。
  • @Akina 更好地向 OP 展示他们当前方法的问题。它从根本上是不安全的。
  • 实际上当我只写 $items 它给出输出数组时我得到了一个错误但是当我写 $item[n] 它在 n 索引处给出相应的值
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 2021-09-19
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多