PHP MySQL在Web服务器和phpmyadmin上查询之间的结果不同

时间:2012-09-25 04:05:41

标签: php mysql phpmyadmin

我有一个看起来像这样的字段:

  

情报: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}))')

2 个答案:

答案 0 :(得分:1)

扎线,

当你说"在我的实时网络服务器"上,您的意思是在PHP呈现的网页上,还是SQL命令行实用程序?

sql demon记录查询。您将能够比较执行完全查询的内容! log query (MySQL doc)

您似乎在文件列中有更多的数据单元。通常,尝试在每列中包含一个数据单元,并尽可能地尊重Normal Forms(Database_normalization)。您将获得更快,更简单的查询,没有正则表达式。但是,在您的情况下可能无法实现。

答案 1 :(得分:1)

我认为,查询不同。

print_r()上执行var_dump()$stmt以获取通过php执行的确切查询,以确保正则表达式部分按原样运行,并且不会在中间进行任何调整其他操作,如bind