我正在为网站构建搜索功能。我不喜欢的是,如果我输入一些特殊的符号,比如<或者>或者在搜索框中的%或其他内容,即使搜索条目中没有这样的符号,它也会打印出整个数据库内容。 我该怎么办,搜索只输出包含特殊符号的条目。而不是数据库包含的所有条目。
代码:
mysql_connect("localhost","root","") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());;
$output = '';
if(isset($_POST['search'])) {
$searchq = $_POST['search'];
$searchq = preg_replace("#[^0-9a-z]#i","",$searchq);
$query = mysql_query("SELECT * FROM users WHERE firstname LIKE '%$searchq%' OR lastname LIKE '%$searchq%'") or die("Could not search!");
$count = mysql_num_rows($query);
if ($count == 0) {
$output = 'There was no search results!';
} else {
while($row = mysql_fetch_array($query)) {
$fname = $row['firstname'];
$lname = $row['lastname'];
$id = $row['id'];
$output .= '<div>'.$fname.' '.$lname.'</div>';
}
}
}
?>
<html>
<head>
<title>Search</title>
</head>
<body>
<div id="top">
<form action="search3.php" method="post">
<input type="text" name="search" placeholder="Search here" />
<input type="submit" value=">>" />
</form>
</div>
<div id="top2">
<?php print("$output"); ?>
</div>
</body>
</html>
编辑。我试图消毒,它仍然没有像计划那样工作。
function sanitize($data) {
return htmlentities(strip_tags(mysql_real_escape_string($data)));
}
$searchq = sanitize($_POST['search']);
答案 0 :(得分:1)
你容易受到sql injection的攻击。你应该使用mysqli_或pdo。例如,您可以使用mysql_real_escape_string()
来避免这种情况[虽然不推荐]。
$searchq = mysql_real_escape_string($_POST['search']);
已编辑:如果您清理输入并返回空字符串(&#34;&#34;),则查询将是:
SELECT * FROM users WHERE firstname LIKE '%%' OR lastname LIKE '%%'
将始终打印出整个数据库内容。因此,请在清理后检查输入变量$searchq
。如果它包含任何内容,您可以执行以下查询:
if(strlen($searchq) > 0)
{
//run query
}
else{
//error message
}