我有一个旧版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);
答案 0 :(得分:0)
此脚本的第一个严重问题是它似乎易于MySQL注入,这是所有脚本中最严重的问题。 (但我可能错了)。请考虑将这段代码切换到PDO及其准备好的语句和bindParam方法。
第二个是,在FORM中,您支持搜索或字母(但不能同时支持) 但是您在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'");
插入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'");
}
这不会在搜索中同时触发这两种情况,并且应根据您的选择返回更可靠的结果。
编辑:添加更多代码后,很明显,每个“用户未设置”字段的值均为“默认”。意思是: 无论您选择什么字母,“ seachphrase”都将设置为“ default”,“ default”似乎是FT.com摘要字段的一部分(您可以在搜索结果中看到该词)。再次:将查询分为两种情况将解决此问题,因此搜索查询中永远不会使用“默认”一词。