3

我有MySQL一张包含单词列表的表格:

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

我还有一个HTML包含三个输入字段的表单,用户应该在其中输入三个字母:

<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查询以在单词中按出现顺序获取包含三个字母的单词?

例如,如果我们有的话

adams
damn
mad

...并且用户提交字母“a”、“d”、“m”它应该只给出结果

adams

因为第一个提交的字母是“a”,第二个提交的字母在“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 回答