我的网站上有一些代码,用于检查数据库中是否存在输入字段的输入值,然后输出结果尽可能简单。
不幸的是,如果发送了错误的值,它不会给我“未找到结果”。1-我该如何解决?没有错误消息或其他任何内容,只有白页。
2-另一个问题:公众是否可以使用输入字段的这种类型的检查来获取我的数据库登录凭据,并使用单独的search.php将登录凭据放在文件顶部?
3-如何用我的php代码保护此检查免受任何主要攻击?我认为SQL注入已经被阻止。
谢谢
index.php:
<form action="search.php" method="Post">
<input type="text" name="query" />
<input type="submit" value="Search" />
</form>
search.php:
<?php
$mydatabase=mysqli_connect("localhost", "root", "") or die("Error connecting to database: ".mysql_error());
mysqli_select_db($mydatabase, "mydb") or die(mysql_error());
$query = $_POST['query'];
$min_length = 1;
if(strlen($query) >= $min_length){
$query = htmlspecialchars($query);
$query = mysqli_real_escape_string($mydatabase, $query);
$raw_results = mysqli_query($mydatabase, "SELECT * FROM mytable WHERE (`title` LIKE '%".$query."%')") or die("mysql_error()");
while($results = mysqli_fetch_array($raw_results)){
if (empty($results)) {
echo 'No results found';
} else {
echo "<p><h3>".$results['title']."</h3>".$results['name']."</p>";
}
}
} else{
echo "Minimum length is ".$min_length;
}
?>
问题1的答案mysqli_fetch_array的手册页提醒您,如果结果集中没有行,它将返回NULL
。如果$results
设置为NULL
,则while
循环将永远不会运行,这就是为什么您永远不会看到未找到结果消息的原因。您需要在while
循环外进行空检查,或将其切换到do-while循环。
问题2的答案我不确定我是否完全理解您的要求,但只要您的凭据位于.php
文件内的PHP标记内,就没有人可以公开看到这些内容。*
*此语句肯定有例外。最佳做法是使用环境变量作为凭据。至少从单独的文件加载global variables,以防原始PHP文件暴露给用户。在这种情况下,他们所看到的只是环境变量或全局变量,而不是您的实际凭据。
问题3的答案我认为您对htmlspecialchars
和mysqli_real_escape_string
的使用是保护数据库的一个好的开始,但是您确实应该仔细阅读这些功能可能带来的缺点。我建议研究准备好的陈述。 PHP manual提供了大量信息,但是SO Answer也做得很好。如果您错过了我链接到another answer的链接的答案,也会发现非常有帮助。