我有一个看起来像这样的字段:
情报: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时的文字正则表达式:
Intelligence(: | : )([4-9]|[0-9]{2,3})[ ]{0,1}/[ ]{0,1}([4-9]|[0-9]{1,3})
由于我的数据库中的字段为Intelligence: 0/75
,因此此查询不应产生任何结果。但它确实在我的实时网络服务器上。它返回字段Intelligence: 0/75
。
如果我在phpmyadmin中运行此EXACT查询,则无法获得任何结果。我已经在我的文本编辑器中排列了来自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}))')
答案 0 :(得分:1)
扎线,
当你说"在我的实时网络服务器"上,您的意思是在PHP呈现的网页上,还是SQL命令行实用程序?
让 sql demon记录查询。您将能够比较执行完全查询的内容! log query (MySQL doc)
您似乎在文件列中有更多的数据单元。通常,尝试在每列中包含一个数据单元,并尽可能地尊重Normal Forms(Database_normalization)。您将获得更快,更简单的查询,没有正则表达式。但是,在您的情况下可能无法实现。
答案 1 :(得分:1)
我认为,查询不同。
在print_r()
上执行var_dump()
或$stmt
以获取通过php执行的确切查询,以确保正则表达式部分按原样运行,并且不会在中间进行任何调整其他操作,如bind
。