PHP MYSQL多词搜索

PHP MYSQL多词搜索,php,html,mysql,mysqli,pdo,Php,Html,Mysql,Mysqli,Pdo,注意上的文档中关于第一个参数的说明: 参数标识符。 对于使用命名占位符的已准备语句,这将是一个参数名,其形式为:name。对于使用问号占位符的准备好的语句,这将是参数的1索引位置 SQL字符串中既没有?占位符,也没有冒号前缀的命名占位符。相反,你 实际上,将用户提供的输入直接注入到您的SQL中,并且变得容易受到SQL注入的攻击。 因此,您应该开始使用文档中描述的占位符 如果希望找到任何单独的单词,则需要将扩展到WHERE 动态地添加或设置与每个单词匹配的条件。使用?占位符会更容易 在这种动态生成

注意上的文档中关于第一个参数的说明:

参数标识符。

对于使用命名占位符的已准备语句,这将是一个参数名,其形式为
:name
。对于使用问号占位符的准备好的语句,这将是参数的1索引位置

SQL字符串中既没有
占位符,也没有冒号前缀的命名占位符。相反,你 实际上,将用户提供的输入直接注入到您的SQL中,并且变得容易受到SQL注入的攻击。 因此,您应该开始使用文档中描述的占位符

如果希望找到任何单独的单词,则需要将
扩展到WHERE
动态地添加或设置与每个单词匹配的条件。使用
占位符会更容易 在这种动态生成的SQL中

此外,由于参数是字符串,因此可以使用的可选参数传递参数数组:

输入参数

包含与正在执行的SQL语句中的绑定参数数量相同的元素的值数组。所有值都被视为
PDO::PARAM_STR

以下是一些建议代码:

<?$search=$_POST['search'];
$query = $pdo->prepare("select * from tag where tag1 LIKE '%$search%' OR tag2 LIKE  '%$search%' LIMIT 0 , 10");
$query->bindValue(1, "%$search%", PDO::PARAM_STR);
$query->execute();
// Display search result
         if (!$query->rowCount() == 0) {
                echo "Search found :<br/>";

            while ($results = $query->fetch()) {

                echo "$".$results['name'];
                echo "</td></tr>";              
            }
                echo "</table>";        
        } else {
            echo 'Nothing found';
        }
?>
<form action="" method="post">
Search: <input type="text" name="search" placeholder=" Search here ... "/>
<input type="submit" value="Submit" />
</form>

按分隔符分解搜索字符串sql注入的高风险:
$search='%'。$search'%'$query=$pdo->prepare(“从标记中选择*,其中标记1 LIKE:strings或标记2 LIKE:strings LIMIT 0,10”)$查询->bindParam(':strings',$search,PDO::PARAM_STR)仅供参考,SQL注入并不安全。通过在此处嵌入用户输入:
%$search%
,您可以使用户直接操纵SQL语句。您使用的
bindValue
不正确。考虑更改您的语句,如:<代码> $Que= $PDO->准备(“选择标签从TAG1喜欢的标签为%:SHIVCH1%'或TAG2类似的'%:SexCH2%'限制0, 10”);查询->bindValue(“:search1”,$search,PDO::PARAM_STR)$查询->bindValue(“:search2”,$search,PDO::PARAM_STR)
// Explode to words and filter for words which are not the empty string:
$words = array_filter(explode(" ", $_POST['search']), 'strlen');
// Wrap each of the words in '%'
$words = array_map(function ($search) { return "%$search%"; }, $words);
// Add a condition for each of the words in the WHERE clause, and repeat for tag2
$sql = "select * 
        from   tag 
        where  " .
        implode(" OR ", array_fill(0, count($words), "tag1 LIKE ?")) .
        " OR " .
        implode(" OR ", array_fill(0, count($words), "tag2 LIKE ?")) .
        " LIMIT  0, 10";    
$query = $pdo->prepare($sql);
// Pass the values as string twice: once for tag1 and once for tag2
$query->execute(array_merge($words, $words));