3

MySQL私は単語のリストを含むこのテーブルを持っています:

desc words;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| word    | varchar(255) | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

またHTML、ユーザーが3文字を入力する必要がある3つの入力フィールドを持つフォームがあります。

<form action='load.php' method='post'>
    <input type='text' name='first_letter'>
    <input type='text' name='second_letter'>
    <input type='text' name='third_letter'>

    <input type='submit' name='submit'>
</form>

MySQL単語内の出現順に3文字を含む単語をフェッチするクエリを作成することは可能ですか?

たとえば、私たちが言葉を持っている場合

adams
damn
mad

...そしてユーザーが文字「a」、「d」、「m」を送信すると、結果のみが表示されます

adams

最初に送信された文字は「a」であり、2番目に送信された文字は「a」の後に続くため(間に他の文字がある場合でも)。

または、を使用して単語を並べ替える方が簡単PHPですか?もしそうなら、どのように?私は初心者プログラマーです。

4

3 に答える 3

5

まあ、それは決して効率的ではありませんが、以下は仕事を成し遂げるはずです:

$string = '%' . implode('%', $letters) . '%';
$query = "SELECT word FROM words WHERE word LIKE '$string'";

これは、文字が正しい順序で表示されている限り、文字の間に何かがあるかどうかに関係なく機能します。また、さまざまな数の文字を指定することもできます。

編集: $lettersクエリ用にも作成する必要があります。この例に固有の例は、次のように作成できます。

$vars = array('first_letter', 'second_letter', 'third_letter');
foreach($vars as $var){
    if($_POST[$var]){
        $letters[] = $_POST[$var];
    }
}

POST変数名がに変更された場合letters[]、プロセスは次のように簡略化できます。

foreach($_POST['letters'] as $letter){
    if($letter){
        $letters[] = $letter;
    }
}

これに入るすべてのデータも検証/エスケープする必要がありますが、それはこの質問の範囲外です。

于 2012-12-19T22:01:17.220 に答える
1

簡単なクエリでそれができます

$stmt = $pdo->prepare("select word from words where word like '%?%?%?%'");

$stmt->bind_param(
  'sss'
  , $first_letter
  , $second_letter
  , $third_letter
);

$stmt->execute();

更新:代わりにパラメーターを使用

于 2012-12-19T22:03:21.153 に答える
0

ユーザーが「文字「a」、「d」、および「m」を送信する」方法は明確ではありませんが、この種のパターンマッチングLIKEではこの句が最も一般的です。

試す:

SELECT id, word
FROM words
WHERE word LIKE '%a%d%m%'
于 2012-12-19T22:03:31.187 に答える