如何基于标题关键词修改PHP代码以展示相关主题?
问题
现有一段展示最新主题的PHP代码,希望修改为仅根据标题的部分内容或单个关键词展示相似主题。现有代码如下:
<?php $fresh_song = $database->query('SELECT tag FROM search ORDER BY id DESC LIMIT ' . $freshsong)->fetchAll(PDO::FETCH_ASSOC); //var_dump($fresh_song); foreach ($fresh_song as $fsong) { // print_r($fsong); $fsong = ucwords($fsong['tag']); ?> <a href="<?php echo mp3_url($fsong); ?>" title="<?php echo toAscii($fsong); ?> mp3" class="list-group-item"><?php echo toAscii($fsong); ?></a> <?php }?>
另外还有一段获取当前标题的代码:
<?php echo (isset($final_result[0]))?$final_result[0]['title']:''; ?>
请问是否可以实现该需求?
解决方案
当然可以实现,按以下步骤修改即可:
- 获取匹配关键词
从你提供的标题代码中,先拿到当前页面的目标标题,作为匹配的核心关键词:
// 获取当前页面的目标标题 $target_title = isset($final_result[0]) ? $final_result[0]['title'] : ''; // 去除首尾空格,得到可用的搜索关键词 $search_keyword = trim($target_title);
- 修改SQL查询(用PDO预处理防注入)
原代码直接拼接SQL存在安全风险,必须改用PDO预处理语句,同时添加模糊匹配条件:
$fresh_song = []; if (!empty($search_keyword)) { // 匹配tag字段中包含关键词的记录,%表示前后可匹配任意字符 $stmt = $database->prepare('SELECT tag FROM search WHERE tag LIKE :keyword ORDER BY id DESC LIMIT :limit'); $stmt->bindValue(':keyword', "%{$search_keyword}%", PDO::PARAM_STR); $stmt->bindValue(':limit', $freshsong, PDO::PARAM_INT); $stmt->execute(); $fresh_song = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { // 如果没拿到有效关键词, fallback到原逻辑展示最新主题 $fresh_song = $database->query('SELECT tag FROM search ORDER BY id DESC LIMIT ' . $freshsong)->fetchAll(PDO::FETCH_ASSOC); }
- 保留原有展示逻辑
循环输出的部分不需要修改,因为只是数据源变成了匹配关键词的结果,展示逻辑完全一致:
foreach ($fresh_song as $fsong) { $fsong = ucwords($fsong['tag']); ?> <a href="<?php echo mp3_url($fsong); ?>" title="<?php echo toAscii($fsong); ?> mp3" class="list-group-item"><?php echo toAscii($fsong); ?></a> <?php }
- 可选:精准匹配单个关键词
如果不想用完整标题匹配,想拆成单个关键词进行多条件匹配,可以用以下代码:
$keywords = explode(' ', $search_keyword); $conditions = []; // 过滤空关键词 foreach ($keywords as $key) { $trimmed_key = trim($key); if (!empty($trimmed_key)) { $conditions[] = "tag LIKE ?"; } } $fresh_song = []; if (!empty($conditions)) { $sql = 'SELECT tag FROM search WHERE ' . implode(' OR ', $conditions) . ' ORDER BY id DESC LIMIT ?'; $stmt = $database->prepare($sql); // 绑定每个关键词参数 $param_pos = 1; foreach ($keywords as $key) { $trimmed_key = trim($key); if (!empty($trimmed_key)) { $stmt->bindValue($param_pos++, "%{$trimmed_key}%", PDO::PARAM_STR); } } $stmt->bindValue($param_pos, $freshsong, PDO::PARAM_INT); $stmt->execute(); $fresh_song = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { // 无有效关键词时展示最新主题 $fresh_song = $database->query('SELECT tag FROM search ORDER BY id DESC LIMIT ' . $freshsong)->fetchAll(PDO::FETCH_ASSOC); }
内容的提问来源于stack exchange,提问作者Mixat
相关产品推荐
相关产品推荐

