我有一个遗留的PHP脚本,它从存储在MySQL数据库中的信息创建资源列表。用户可以搜索列表或按标题中的第一个字母进行过滤(标题作为列存储在数据库中)。你可以在这里看到它的实际效果:http://lib.skidmore.edu/library/index.php/researchdatabases)。该脚本运行良好,除了一个资源FT.com,它在用户按字母过滤时出现错误。无论选择哪个字母,其条目都将位于顶部或底部。注意,在未过滤的视图中,FT.com是按正确的字母顺序排列的。我的第一个想法是查看数据库条目,但是一切看起来都很好。
我的假设是变量设置不正确。脚本的工作方式是它的上半部分包含一个web表单。下面的PHP获取输入并将其赋值给变量$searchletter
。
然后,while循环和mysqli查询的组合检索并显示结果。有趣的是,当$searchletter = !empty
行被注释掉时,对于未过滤的视图,除了FT.com条目的之外,整个列表都会消失(例如,请参阅此测试脚本:http://lib.skidmore.edu/library/search_dbs2.php)。否则,我在脚本和数据库中都看不到任何可能导致观察到的行为的东西。我的怀疑是正确的吗?
下面是代码。我已经包含了除连接信息之外的所有内容,这样您就可以看到它是如何工作的。
$search=(isset($_GET['search']) ? $_GET['search'] : null);
$search = !empty($_GET['search']) ? $_GET['search'] : 'default';
$search= addslashes($search);
$searchletter=(isset($_GET['searchletter']) ? $_GET['searchletter'] : null);
$searchletter = !empty($_GET['searchletter']) ? $_GET['searchletter'] : 'default';
var_dump ($_GET['searchletter']);
$con=mysqli_connect(DB_HOST,WEBMISC_USER,WEBMISC_PASS,DB_NAME);
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
if ($search == "default" && $searchletter == "default"){
$result = mysqli_query($con,"SELECT title,summary,url,coverage,format FROM dbs");
//This while loop creates the inital A to Z list.
while($row = mysqli_fetch_array($result))
{
$url=$row['url'];
$title=$row['title'];
$summary=$row['summary'];
$coverage=$row['coverage'];
$format=$row['format'];
echo <<<HTML
<p><h6><a href="$url">$title</a></h6>
<br />$summary</p>
HTML;
}
}
else {
$result = mysqli_query($con,"SELECT title,summary,url,coverage,format,fletter FROM dbs where title like '%$search%' or summary like '%$search%' or fletter = TRIM('$searchletter')");
//This block creates the filtered and searched version of the list.
while($row = mysqli_fetch_array($result))
{
$url=$row['url'];
$title=$row['title'];
$summary=$row['summary'];
$coverage=$row['coverage'];
$format=$row['format'];
echo <<<HTML
<p><h6><a href="$url">$title</a></h6>
<br />$summary</p>
HTML;
}
mysqli_close($con);
发布于 2018-07-26 04:05:58
这个脚本的第一个严重问题是它似乎容易出现MySQL注入,这是所有问题中最严重的问题。(但我可能错了)。请考虑将此代码转换为PDO及其准备好的语句和bindParam方法。
第二种情况是,在表单中,您支持搜索或字母(但不是两者都支持),但在mysql查询中两者都使用。您应该拆分从
$result = mysqli_query($con,"SELECT
title,summary,url,coverage,format,fletter
FROM dbs
where title like
'%$search%' or summary like '%$search%' or fletter = '$searchletter'");
into if/else语句:
if(!empty($search)){
$result = mysqli_query($con,"SELECT
title,summary,url,coverage,format,fletter
FROM dbs
where title like
'%$search%' or summary like '%$search%'");
} elseif(!empty($searchletter)){
$result = mysqli_query($con,"SELECT
title,summary,url,coverage,format,fletter
FROM dbs
where fletter = '$searchletter'");
}
这不会在搜索中触发两种情况,应该会根据您的选择返回更可靠的结果。
编辑:添加更多代码后,很明显每个"unset by user“字段都有"default”值。这意味着:无论你选择什么字母,“FT.com”将被设置为"default“,并且"default”将出现在搜索结果中(你可以在搜索结果中看到这个单词)。再说一次:将查询分成两种情况可以解决这个问题,因此搜索查询中永远不会使用"default“这个词。
https://stackoverflow.com/questions/51525529
复制相似问题