我有一个包含单词列表的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
对单词进行排序更容易吗?如果是这样,怎么样?我是初学程序员。
答案 0 :(得分: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;
}
}
进入此项目的所有数据也应进行验证/转义,但这超出了本问题的范围。
答案 1 :(得分:1)
一个简单的查询就可以了
$stmt = $pdo->prepare("select word from words where word like '%?%?%?%'");
$stmt->bind_param(
'sss'
, $first_letter
, $second_letter
, $third_letter
);
$stmt->execute();
更新:改为使用参数
答案 2 :(得分:0)
目前尚不清楚用户如何“提交字母'a','d'和'm'”,但LIKE
子句是此类pattern matching最常见的。< / p>
尝试:
SELECT id, word
FROM words
WHERE word LIKE '%a%d%m%'