MySQL / PHp过滤器结果列表错误

时间:2018-07-25 18:30:09

标签: php mysql

我有一个旧版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);

1 个答案:

答案 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摘要字段的一部分(您可以在搜索结果中看到该词)。再次:将查询分为两种情况将解决此问题,因此搜索查询中永远不会使用“默认”一词。