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));