首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL/PHp筛选结果列表错误

MySQL/PHp筛选结果列表错误
EN

Stack Overflow用户
提问于 2018-07-26 02:30:09
回答 1查看 68关注 0票数 1

我有一个遗留的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)。否则,我在脚本和数据库中都看不到任何可能导致观察到的行为的东西。我的怀疑是正确的吗?

下面是代码。我已经包含了除连接信息之外的所有内容,这样您就可以看到它是如何工作的。

代码语言:javascript
复制
$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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 04:05:58

这个脚本的第一个严重问题是它似乎容易出现MySQL注入,这是所有问题中最严重的问题。(但我可能错了)。请考虑将此代码转换为PDO及其准备好的语句和bindParam方法。

第二种情况是,在表单中,您支持搜索或字母(但不是两者都支持),但在mysql查询中两者都使用。您应该拆分从

代码语言:javascript
复制
$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语句:

代码语言:javascript
复制
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“这个词。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51525529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档