1

基本的に全文検索として使用している4列のVIEWがあります。ユーザーがテキストボックスに文字列を入力すると、次のようにVIEWにクエリが実行されます。

SELECT * FROM vw_clients WHERE
col1 = "'%".$userInput."%'"
OR col2 = "'%".$userInput."%'"
OR col3 = "'%".$userInput."%'"
OR col4 = "'%".$userInput."%'"

結果は正しく返されますが、検索語が含まれている列を特定する方法はありますか?MySQLまたはPHPのいずれかを介して?

4

4 に答える 4

4

MySQL に直接ではありませんが、恐ろしく醜いハックがあります。

SELECT col1, (col1 LIKE '%$userinput%') AS found_in_col1,
     col2, (col2 LIKE '%$userinput%') AS found_in_col2, 
     etc...
etc...
WHERE ...

PHP では、結果セットのフィールドをループしてstrpos()チェックするだけです。いずれにせよ…醜い。

于 2012-12-13T18:54:32.407 に答える
2
   SELECT 
      *,
      CONCAT_WS(',',
        IF(col1 = "'%".$userInput."%'",'col1',NULL),
        IF(col2 = "'%".$userInput."%'",'col2',NULL),
        IF(col3 = "'%".$userInput."%'",'col3',NULL),
        IF(col4 = "'%".$userInput."%'",'col4',NULL)) as colmatches
   FROM ....
于 2012-12-13T18:56:50.407 に答える
0

このようなもの:

SELECT IFNULL(v.col1 LIKE CONCAT('%','$userInput','%'),0) AS col1_match
     , IFNULL(v.col2 LIKE CONCAT('%','$userInput','%'),0) AS col2_match
     , IFNULL(v.col3 LIKE CONCAT('%','$userInput','%'),0) AS col3_match
     , IFNULL(v.col4 LIKE CONCAT('%','$userInput','%'),0) AS col4_match
     , v.*
  FROM vw_clients v
 WHERE v.col1 LIKE CONCAT('%','$userInput','%') = 1
    OR v.col2 LIKE CONCAT('%','$userInput','%') = 1
    OR v.col3 LIKE CONCAT('%','$userInput','%') = 1
    OR v.col4 LIKE CONCAT('%','$userInput','%') = 1

注: この構造は SQL インジェクションに対して脆弱です。$userInputそれは、SQL コンストラクトを含まないことに依存しています。例えば

$userInput = "foo')=1 OR '1' LIKE CONCAT('1";
于 2012-12-13T19:40:27.127 に答える
0

もう 1 つ醜い方法があります。select クエリで「case」または「if」を使用します。

SELECT CASE WHEN col1='%value%' THEN 'col1' WHEN col2='%value%' THEN 'col2' END as found_column
FROM ....
WHERE ....
于 2012-12-13T19:00:20.280 に答える