PHP布尔模式全文搜索:数组转字符串拼接错误修复
解决布尔模式全文搜索的字符串拼接问题
你遇到的问题很典型——在foreach循环里每次都直接覆盖了$value1变量,而不是把每个关键词的搜索片段累加起来,所以最后只会保留数组里的最后一个词,导致生成的搜索条件只有+(car)而不是+(blue) +(car)。下面是具体的修复方案和优化建议:
1. 修复字符串拼接逻辑
处理多字词组时,你需要先初始化一个空字符串,然后通过.=操作符把每个词的搜索片段追加进去,而不是每次都直接赋值:
// 初始化空字符串用于累加搜索条件 $value1 = ""; foreach ($WordsArr as $value) { // 用.=追加每个词的布尔模式搜索片段 $value1 .= " +(" . $value . "*)"; }
2. 统一单字词的搜索写法
为了让代码更一致、易维护,单字词的情况也可以套用布尔模式的格式,避免重复编写SQL语句:
// 单字词直接生成对应的布尔模式条件 $value1 = " +(" . $WordsArr[0] . "*)";
3. 关键优化:防止SQL注入
你的代码目前直接把数据库中的words字段值拼到SQL语句里,存在SQL注入风险(哪怕是内部数据,也应该遵循安全规范)。建议改用mysqli的预处理语句来绑定参数,从根源避免注入问题:
完整修正后的代码
<?php $query = "SELECT * FROM words ORDER BY `words`.`words` ASC"; $result = mysqli_query($con, $query); $i = 1; while($row = mysqli_fetch_array($result)){ $Word = $row['words']; $WordsArr = explode(" ", $row['words']); $searchCondition = ""; // 生成布尔模式的搜索条件 if(count($WordsArr) > 1){ foreach ($WordsArr as $value) { $searchCondition .= " +(" . $value . "*)"; } }else{ $searchCondition = " +(" . $WordsArr[0] . "*)"; } // 使用预处理语句执行查询,避免SQL注入 $query1 = "SELECT COUNT(*) AS `count`, COUNT(DISTINCT t.name) AS `cnt` FROM toys t WHERE MATCH (toys_text) AGAINST (? IN BOOLEAN MODE)"; $stmt = mysqli_prepare($con, $query1); mysqli_stmt_bind_param($stmt, "s", $searchCondition); mysqli_stmt_execute($stmt); $Data1 = mysqli_stmt_get_result($stmt); $total1 = mysqli_fetch_assoc($Data1); mysqli_stmt_close($stmt); ?> <tr> <td><?php echo $i;?></td> <td><?php echo $row['words'];?></td> <td><a href="showtoys.php?word=<?php echo urlencode($Word); ?>" target="_blank"><?php echo $total1['count']; ?></a></td> <td><a href="showtoys.php?keyword=<?php echo urlencode($Word); ?>" target="_blank"><?php echo $total1['cnt']; ?></a></td> </tr> <?php $i++; } ?>
额外说明
- 现在生成的搜索条件会正确包含词组里的所有词,比如“blue car”会变成
+(blue*) +(car*),确保toys_text字段同时匹配所有关键词 - 预处理语句的用法彻底避免了SQL注入风险,哪怕
words表里的内容包含特殊字符,也不会破坏SQL语句的结构 - 代码结构更清晰,将搜索条件生成与SQL查询逻辑分离,后续维护起来更方便
内容的提问来源于stack exchange,提问作者user20152015
相关产品推荐
相关产品推荐

