**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
两年前关门了。
改进这个问题
$a=$_GET["a"];
$b=$_GET["b"];
$a=str_replace("%", "\%", $a);
$b=str_replace("%", "\%", $b);
$sql="SELECT * FROM table ";
$sql.="WHERE ColA LIKE :txtA AND ColB LIKE :txtB";
$query = $db->prepare($sql);
$query->bindValue(':txtA', '%'.$a.'%', PDO::PARAM_STR);
$query->bindValue(':txtB', '%'.$b.'%', PDO::PARAM_STR);
$query->execute();
我想给用户搜索任何东西的能力。我应该过滤更多的字符吗?它会是100%安全的,并且像它在数据库中搜索文本片段时应该做的那样工作吗?
1条答案
按热度按时间2ledvvac1#
是的,您的代码遵循防止sql注入的良好实践。使用参数是正确的方法。
唯一的建议是可选的,为了代码风格,而不是安全代码。你的也一样安全。
pdo允许您将查询参数作为数组参数传递给
execute()
,所以你不必使用bindValue()
.而且,你不需要
PDO::PARAM_STR
的参数bindValue()
至少对mysql来说不是。mysql的pdo驱动程序总是以字符串的形式传递参数。也许其他品牌的数据库也需要它。您可以在一个多行字符串中编写sql查询(与java等一些语言不同)。你不需要使用
.=
.可以在双引号字符串中嵌入php变量。你不需要使用
'%'.$a.'%'
,您可以使用"%{$a}%"
. 我发现后者更具可读性,尤其是当您有多个变量要包含时。