PHP(PDO)网站数据库查询异常:需单条数据却返回全部结果
解决PHP(PDO)查询返回全部数据而非单条的问题
看起来你遇到的问题主要出在两个地方:SQL查询没有限制返回条数,以及绑定的参数没有被有效使用。我来一步步帮你修正:
问题分析
- 你的
get_topics方法里,SQL语句是SELECT * FROM topics ORDER BY id DESC——这个语句会返回topics表的所有数据,没有任何条数限制。 - 你虽然绑定了
ledenpagina_id参数,但SQL里没有对应的WHERE条件,这个绑定完全无效,无法过滤出当前用户的主题数据。
解决方案
第一步:修正后端get_topics方法
修改SQL语句,添加WHERE条件过滤用户数据,同时用LIMIT 1强制只返回1条最新的主题(因为你用了ORDER BY id DESC,所以会拿到最新的那条):
public function get_topics(){ // 添加WHERE条件匹配当前用户,同时用LIMIT 1限制返回条数 $getTopic = $this->database->query("SELECT * FROM topics WHERE ledenpagina_id = :ledenpagina_id ORDER BY id DESC LIMIT 1"); $this->database->bind(":ledenpagina_id", $_SESSION['ledenpagina_id']); $topics = $this->database->resultset(); return $topics; }
第二步:优化前端代码
现在后端只会返回包含1条数据的数组,你可以直接取数组的第一个元素,不需要循环(当然循环也可以,但没必要):
<div class="col-md-6"> <div class="well dash-box"> <h2><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> 12</h2> <h5><a href="https://google.nl"> hoi</a></h5> <?php $toppics = $app->get_topics(); // 先检查是否有数据,避免报错 if (!empty($toppics)) { $topic = $toppics[0]; echo '<li><a href="#section4">' . $topic['onderwerp'] . '</a></li>'; } ?> </div> </div>
如果以后你可能需要改回显示多条,也可以保留循环但加break只取第一条:
<?php $toppics = $app->get_topics(); $i = 4; foreach ($toppics as $topic) { echo '<li><a href="#section' . $i++ . '">' . $topic['onderwerp'] . '</a></li>'; break; // 只循环一次,拿到第一条就停止 } ?>
关键说明
LIMIT 1是最高效的方式,它让数据库只查询并返回1条数据,避免不必要的性能消耗。- 添加
WHERE ledenpagina_id = :ledenpagina_id确保你只拿到当前登录用户的主题数据,不会泄露其他用户的内容。 - 前端加
empty判断是为了防止数据库没有数据时出现数组越界错误。
内容的提问来源于stack exchange,提问作者youarewelkommmornott
相关产品推荐
相关产品推荐

