1

次のようなフィールドがあります。

知能: 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このクエリでは結果が得られません。しかし、私のライブWebサーバーではそうです。フィールドを返しますIntelligence: 0/75

この EXACT クエリを 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})' )

なぜこれが2つの差分を生み出しているのか、誰にもわかりますか。結果?

アップデート:

私はそれを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によってレンダリングされたWebページ、またはSQLコマンドラインユーティリティを意味しますか?

sqldemonにクエリをログに記録させます実行された正確なクエリ を比較できるようになります。ログクエリ(MySQLドキュメント)

ファイル列にデータの単位が多いようです。一般に、各列に1単位のデータを含めるようにし、正規形( Database_normalization )を可能な限り尊重します。正規表現を使用せずに、より高速でシンプルなクエリを実行できます。ただし、あなたの場合は不可能かもしれません。

于 2012-09-25T05:48:33.737 に答える
1

クエリが違うと思います。

aprint_r()またはvar_dump()on$stmtを実行して、php を介して実行されている正確なクエリを取得し、正規表現の部分がそのまま進行し、bind.

于 2012-09-25T07:02:08.493 に答える