mysql/php筛选器结果列表错误

icnyk63a  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(406)

我有一个遗留的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);
p8h8hvxi

p8h8hvxi1#

这个脚本的第一个严重问题是,它似乎倾向于mysql注入,这是所有脚本中最严重的问题(但我可能错了)。请考虑将此代码切换到pdo及其准备的语句和bindparam方法。
第二种是,在mysql查询中,您可以支持search或letter(但不能同时支持search和letter),但可以同时使用search和letter。您应该将从中提取的结果拆分

$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'");
}

这不会在搜索中同时触发这两种情况,并且会根据您的选择返回更可靠的结果。
编辑:添加更多代码后,很明显每个“unset by user”字段都有“default”值。这意味着:无论你选择哪个字母,“seachphrase”都将设置为“default”,“default”似乎是ft.com摘要字段的一部分(你可以在搜索结果中看到这个词)。同样:将查询分为两种情况可以解决这个问题,因此在搜索查询中从不使用“default”这个词。

相关问题