PHP';s缺少未签名的int和MySQL';s CRC32功能
我告诉Sphinx将CRC32形式的一些字符串作为属性进行索引,如下所示:PHP';s缺少未签名的int和MySQL';s CRC32功能,php,mysql,sphinx,Php,Mysql,Sphinx,我告诉Sphinx将CRC32形式的一些字符串作为属性进行索引,如下所示: sql_query = SELECT [...], CRC32(LOWER(color)) AS color, [...], FROM table sql_attr_uint = color 我正在尝试在PHP中进行一些分面搜索,用户可以单击带有上述颜色之一的链接,Sphinx将获得另一个搜索请求,搜索结果将缩小,例如: Previous page: <h3>Narrow down results:<
sql_query = SELECT [...], CRC32(LOWER(color)) AS color, [...], FROM table
sql_attr_uint = color
我正在尝试在PHP中进行一些分面搜索,用户可以单击带有上述颜色之一的链接,Sphinx将获得另一个搜索请求,搜索结果将缩小,例如:
Previous page:
<h3>Narrow down results:</h3>
<p><a href="search.php?query=something&color=1678454">Red (11)</a></p>
<p><a href="search.php?query=something&color=4133605867">Yellow (5)</a></p>
<?php
if (isset($_GET[$name]))
{
$sphinx->SetFilter('color', intval($_GET['color'])); // <-- Uh-oh
}
[...]
$sphinx->Query($query, 'table');
?>
上一页:
缩小结果范围:
这里出现了问题,因为MySQL的CRC32()返回一个无符号的32位整数,PHP非常有帮助地不支持该整数,并将其上限设置为2^31-1。上面的黄色链接暴露了我的问题
StackOverflow,什么是可以接受的解决方法?我认为在SQL查询端进行一些计算是可能的,但我担心会使令人担忧的冲突更加严重
提前感谢。引用PHP的:
因为PHP的整数类型是有符号的,而且许多crc32校验和都是有符号的
如果生成负整数,则需要使用的“%u”格式化程序
sprintf()或printf()来获取未签名字符串的字符串表示形式
crc32校验和
换句话说,PHP无法处理大整数,但在这种情况下,您可以模拟无符号整数以达到双精度。您可以在转换为字符串时获得实际值
这应该足够了,因为你不需要做数学运算,比如加法或乘法
更新:我想我忽略了你问题的关键部分。与此相反:
intval($_GET['color'])
。。。您可以使用正则表达式验证或筛选:
preg_match('/^\d+$/', $_GET['color'])
preg_replace('[^\d]', '', $_GET['color'])
。。。并将CRC值作为字符串处理。如果您正在执行intval
以进行验证(除了数字之外,sphinx没有奇怪的字符),我会使用filter\u var(filter\u SANITIZE\u NUMBER\u INT,$\u GET['color'])代码>允许数字、加号和减号。不知道Sphinx可以将其作为字符串。谢谢你的洞察力!