Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL查询,按顺序列出包含用户提交的字母的单词_Php_Mysql - Fatal编程技术网

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%'