通过用户注释过滤-SQL参数数量必须在0到65535之间

时间:2019-04-16 09:53:58

标签: php mysql sql

我正在创建带有过滤器和排序选项的数据表。我需要让那些在评论中带有“测试”一词的用户(例如)。因此,我首先进行了查询,以获取其中注释正文包含搜索词的所有user_id。然后使用这些ID仅返回那些用户。

此方法的问题是,如果我的数据库有数百万条记录,我将开始收到此错误。

  

无法执行以下SQL语句:SQLSTATE [HY000]:常规错误:7   参数的数量必须在0到65535之间。

还有另一种方法可以过滤结果吗?

用户表

id |  username
1     jacko2
2     billyElf
3     crazyJack

user_comments表

id | user_id |    comment_body
1       1         test comment
2       2         another one
3       1         hello world
4       3         testing 123

到目前为止,这是我的代码

$search_term = 'test'

$user_ids = query("SELECT user_id FROM user_comments WHERE comment_body LIKE '%$test%'")
$result = query("SELECT * FROM users WHERE id IN ($user_ids)")

2 个答案:

答案 0 :(得分:1)

只需将查询合并为单一查询并使用EXISTS

SELECT u.*
FROM users u
WHERE EXISTS (SELECT 1
              FROM user_comments uc
              WHERE uc.user_id = u.id AND
                    uc.comment_body LIKE ?
             );

您要使用EXISTS而不是JOIN,以防万一有多个用户具有多个匹配的注释。

?是用于传递字符串值的占位符(您可能确实想要CONCAT('%', ?, '%')。出于各种原因,应使用此类参数来传递此类值:

  • 这使代码免受SQL注入攻击的侵害。
  • 它有助于优化器(特别是用于重用查询计划)。
  • 它可以防止非常难以调试的语法错误。

答案 1 :(得分:0)

您必须使用GROUP_CONCAT

$search_term = 'test'

$user_ids = query("SELECT GROUP_CONCAT(user_id) as user_id from user_comments where comment_body like '%$test%'")
$result = query("SELECT * FROM users WHERE id IN ($user_ids)")