1

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

智力:0/75

我有一个表单,用户可以搜索此字符串的值。在我的实时网络服务器上,这是查询:

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}))')
4

2 回答 2

1

挪威语,

当您说“在我的实时 Web 服务器上”时,您是指在您的由 PHP 或 SQL 命令行实用程序呈现的网页上吗?

sql 恶魔记录查询。您将能够比较执行了哪些确切的查询! 日志查询(MySQL 文档)

您似乎在文件列中有更多的数据单元。一般来说,尝试在每一列中包含一个数据单元,并尽可能尊重范式(Database_normalization)。您将获得更快、更简单的查询,而无需正则表达式。但是,在您的情况下,这可能是不可能的。

于 2012-09-25T05:48:33.737 回答
1

我认为,查询是不同的。

执行 aprint_r()var_dump()on$stmt以获得通过 php 执行的确切查询,以确保 regex 部分按原样运行,并且不会被任何其他操作(如bind.

于 2012-09-25T07:02:08.493 回答