Php MySQL查询,按顺序列出包含用户提交的字母的单词
我有一个Php MySQL查询,按顺序列出包含用户提交的字母的单词,php,mysql,Php,Mysql,我有一个MySQL表,其中包含一个单词列表: desc words; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | in
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>
。。。并且用户提交字母“a”、“d”、“m”,它应该只给出结果
adams
因为第一封提交的信是“a”,第二封提交的信在“a”之后,依此类推(即使中间还有其他信)
或者使用
PHP
对单词进行排序更容易吗?如果是,怎么做?我是一名初级程序员。无论如何,它都不会有效率,但应该完成以下工作:
$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
变量名更改为字母[]
,则过程可以简化为:
foreach($_POST['letters'] as $letter){
if($letter){
$letters[] = $letter;
}
}
所有进入这个问题的数据也应该被验证/转义,但这超出了这个问题的范围。一个简单的查询就可以做到这一点
$stmt = $pdo->prepare("select word from words where word like '%?%?%?%'");
$stmt->bind_param(
'sss'
, $first_letter
, $second_letter
, $third_letter
);
$stmt->execute();
更新:改为使用参数不清楚用户是如何“提交字母“a”、“d”和“m”的,但是
LIKE
子句是这种情况下最常见的
尝试:
OP要找的似乎是像“%a%d%m%”这样的
。
。谢谢,我错过了。修正。为了了解范围,你希望数据库中有多少个单词,单词有多长,你希望用户提交多少个字母?大约120k个单词,从1到30个字符。汉克,这似乎是为了完成这项工作。是否可以对结果进行更多过滤,只填充以第一个提交的字母开头的单词?在我的示例中,仅列出以“a”开头的单词@David Yes,只需删除$string
行上的第一个%
。请原谅我缺乏PHP知识,但是$letters
变量看起来如何?@David您需要构建它。我现在用一个例子更新我的答案。你的代码容易受到SQL注入攻击。您真的应该使用,将变量作为参数传递到其中,而这些参数不会对SQL进行计算。如果您不知道我在说什么,或者不知道如何修复它,请阅读的故事。字符串文本中不能包含参数。要使用参数,您的模式需要是在SQL中执行字符串连接的表达式的结果,例如WHERE word-LIKE-CONCAT_WS('%','','',:A,:B,:C')
。
$stmt = $pdo->prepare("select word from words where word like '%?%?%?%'");
$stmt->bind_param(
'sss'
, $first_letter
, $second_letter
, $third_letter
);
$stmt->execute();
SELECT id, word
FROM words
WHERE word LIKE '%a%d%m%'