Php 在()列表中对MySQL有限制吗
我在MySQL in()列表中有大约273个项目,我认为这会导致获取这些项目所需的所有信息时出现问题,并且不确定如何将此查询更改为仅1个或至少少于273个单独的查询。基本上,我有一个字符串名称列表,需要查询并获取Php 在()列表中对MySQL有限制吗,php,mysql,wordpress,quickbooks,Php,Mysql,Wordpress,Quickbooks,我在MySQL in()列表中有大约273个项目,我认为这会导致获取这些项目所需的所有信息时出现问题,并且不确定如何将此查询更改为仅1个或至少少于273个单独的查询。基本上,我有一个字符串名称列表,需要查询并获取名称和列表ID,其中名称位于273计数数组中: $result = $wpdb->get_results(' SELECT Name, ListID FROM ' . $wpdb->prefix . 'quickbook_items WHERE Nam
名称
和列表ID
,其中名称位于273计数数组中:
$result = $wpdb->get_results('
SELECT Name, ListID
FROM ' . $wpdb->prefix . 'quickbook_items
WHERE Name IN ("' . implode('", "', array_map('addslashes', $part_names)) . '")
ORDER BY NULL', ARRAY_A);
我觉得我在某个地方读到过,如果列表太大,在Wordpress中使用中的查询可能会有问题,因为Wordpress无法获取所有数据。但我不记得这是Wordpress$wpdb
限制还是MySQL限制。在任何情况下,我都不会返回所有273行,因此我真的不确定如何执行此查询,同时保持db命中率低于273次(如果我将查询放在循环中,循环通过$part\u names
,就会发生这种情况)
任何人对如何从如上所示的quickbook\u items
表中查询Name和ListID有什么建议吗?这里真的需要一些帮助,或者如果有一种方法可以不限制查询集中的字符数,来实现这一点?IN
子句和max\u allowed\u packet
在(…)
中,中的项目数量没有定义限制
但是,SQL字符串本身的长度(以字节为单位)受max_allowed_packet
系统变量的值限制
以下是一段摘录自:
in列表中的值数量仅受max_allowed_数据包值的限制
默认值为4MB,因此,除非您更改了此值,否则问题不大可能出现。
此外,达到这个极限会导致错误,而不是错误的结果
addslashes
使用addslashes
来构建MySQL字符串文本确实不是一个好主意。
考虑使用这个目的。
建议
你能做以下的事情来分析这个问题吗。
在$part_names
上构建一个循环,并执行完全相同的语句(包括内爆
)-但每次迭代只针对一个名称。然后检查每次迭代是否返回非空结果
通过这种方式,您将获得未返回的名称,它可以为您提供一些线索
另一种可能的结果是返回所有名称-在这种情况下,问题可能确实在于in
子句中的项数。stackoverflow在MySQL中表示可能重复使用LOWER()或UPPER()函数与名称匹配。可能是大小写问题。或者像maxlee=maxlee'sOfftopic这样的问题:您可能不想使用addslashes,但mysqli_real_escape_string或Pdo::quote。请参阅addslashes()不适用于MySQL的真正转义(例如,可能使用十六进制表示)也许我误解了,但这似乎不同于WordPress自己推荐的sql注入预防。WordPress添加了神奇的引号,即使您在php中关闭了它。addslashes
对于此功能很重要,该功能只对WordPress管理员可用,总共需要2人。我我记得我读到Wordpress类$wpdb
函数对这些函数中允许的字符总数进行了限制。我的一位同事以前甚至为我确认过这一点。好了,伙计们,似乎wpengine正在终止查询,因为它的字符太长(这太荒谬了):