我有一个像这样的字段:
情报: 0/75
我有一个表单,用户可以搜索这个字符串的值。在我的实时web服务器上,这是一个查询:
SELECT * FROM `test` WHERE `id` IS NOT NULL AND `file` REGEXP CONCAT('Intelligence(: | : )([', :var2, '-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([', :var2, '-9]|[0-9]{1,3})')
$var2 = $_POST['int'];
$stmt->bindValue(':var2', $var2);:var2是$_POST值。我一直在使用4的案例。这是插入4时的文字regexp:
Intelligence(: | : )([4-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([4-9]|[0-9]{1,3})因为我的数据库中的字段是Intelligence: 0/75,所以这个查询不应该产生任何结果。但它确实在我的实时网络服务器上。它返回字段Intelligence: 0/75。
如果我在phpmyadmin中运行这个确切的查询,就不会得到任何结果。我在文本编辑器中排列了来自phpmyadmin和我的服务器的查询,它们是相同的。这样我就不会疯了,下面是来自phpmyadmin的查询拷贝/粘贴:
SELECT *
FROM `test`
WHERE `id` IS NOT NULL
AND `file`
REGEXP CONCAT( 'Intelligence(: | : )([4-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([4-9]|[0-9]{1,3})' )有人能明白为什么这会产生两种不同的结果吗。结果?
更新:
我想我已经把它缩小到PHP了。如果我将绑定到:var2的值更改为
$stmt->bindValue(':var2', '6284');结果是一样的。返回带有Intelligence: 0/75的所有行。
如果我删除bindValue代码,所以没有任何绑定到:var2,结果仍然是一样的!
print_r($stmt) =
SELECT * FROM `test` WHERE `id` IS NOT NULL AND `file` REGEXP
CONCAT('(INT:[ ]{1,2}([', :var2, '-9]|[0-9]{2,3})[ ]{1,2}/[ ]{1,2}([', :var2, '-9]|[0-9]{1,3})|Intelligence(: | : )([', :var2, '-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([', :var2, '-9]|[0-9]{1,3}))')发布于 2012-09-25 05:48:33
北欧人
当您说“在我的活动web服务器上”时,您的意思是在PHP呈现的web页面上,还是在SQL命令行实用程序上?
让sql记录查询。您将能够比较执行哪些确切的查询!日志查询(MySQL文档)
文件列中似乎有更多的数据单位。通常,尝试在每一列中有一个数据单元,并尽可能地尊重标准表单(归一化)。您将有更快,更简单的查询,没有正则表达式。然而,在你的情况下,这可能是不可能的。
发布于 2012-09-25 07:02:08
我想,问题是不同的。
在print_r()或var_dump()上执行$stmt,以获得通过php执行的准确查询,以确保regex部分按原样运行,而不会被任何其他操作(如bind )在中间进行调整。
https://stackoverflow.com/questions/12576055
复制相似问题