You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理服务器搜索结果时,按'='分割字符串得到异常数组求排查

问题:分割服务器返回的搜索结果时得到异常数组

用户实现搜索功能时,服务器返回以换行符分隔的「文章id=文章标题」格式字符串,但前端按等号分割时,得到的数组仅包含元素'0',相关代码如下:

前端JavaScript代码

function findArticle(){
    let input = document.getElementById("search")
    let value = input.value
    if(value){
        let request = new XMLHttpRequest()
        request.onreadystatechange = function (){
            if(request.readyState === 4){
                let result = request.response
                if(result !== ''){
                    let searchResults = document.getElementById('search-results')
                    let split = result.split('/\n/')
                    searchResults.innerHTML = ''
                    for (const next in split) {
                        let parts = next.split("/=/")
                        console.log(parts)
                        searchResults.innerHTML += "<a href='"+parts[0]+"'>"+parts[1]+"</a>"
                    }
                }
            }
        }
        request.open("GET","article-search.php?query="+value,true)
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        request.send()
    }
}

后端PHP代码(article-search.php)

<?php
include_once 'constants.php';
include_once 'functions.php';
$query = $_GET['query'];
$q = "SELECT id,title FROM articles WHERE title LIKE '%$query%'";//;"SELECT id,title FROM defaultdb.articles WHERE MATCH (title) AGAINST ('$query')";
$c = defaultMysqlConnection();
$results = executeQuery($c,$q,true);
if($results){
    foreach ($results as $result){
        echo $result['id']."=".$result['title']."\n";
    }
}
?>

错误原因及修正方案

1. 分隔符使用错误

  • 换行符分割时,result.split('/\n/')错误地把正则写法用在了字符串参数中,实际会把'/n/'作为分隔符匹配,而非换行符。正确写法是result.split('\n')(字符串形式)或result.split(/\n/)(正则形式)。
  • 等号分割时,next.split("/=/")同理错误,应改为split('=')。

2. 数组遍历方式错误

for (const next in split)遍历的是数组的字符串类型索引(如"0"、"1"),而非数组内的每行数据。分割索引字符串自然得到['0']这类异常结果,应改用for...of遍历数组元素或forEach方法。

3. 多余的请求头设置

GET请求无请求体,无需设置Content-type头,可直接删除该代码行。

4. SQL注入风险

后端直接将$_GET['query']拼接进SQL语句,存在严重注入风险,需改用预处理语句绑定参数。

修正后的代码

修正后的前端代码

function findArticle(){
    let input = document.getElementById("search")
    let value = input.value
    if(value){
        let request = new XMLHttpRequest()
        request.onreadystatechange = function (){
            if(request.readyState === 4){
                let result = request.response
                if(result !== ''){
                    let searchResults = document.getElementById('search-results')
                    // 正确分割换行符并过滤空行
                    let lines = result.split('\n').filter(line => line.trim() !== '');
                    searchResults.innerHTML = ''
                    // 遍历数组元素而非索引
                    for (const line of lines) {
                        let parts = line.split('=')
                        // 确保分割结果有效再渲染
                        if(parts.length === 2){
                            searchResults.innerHTML += `<a href="${parts[0]}">${parts[1]}</a>`
                        }
                    }
                }
            }
        }
        // 对查询参数编码避免特殊字符问题
        request.open("GET", `article-search.php?query=${encodeURIComponent(value)}`, true)
        request.send()
    }
}

修正后的后端代码(修复SQL注入)

<?php
include_once 'constants.php';
include_once 'functions.php';
$query = $_GET['query'] ?? '';
// 使用预处理语句防止SQL注入
$q = "SELECT id,title FROM articles WHERE title LIKE ?";
$c = defaultMysqlConnection();
// 以mysqli预处理为例(可根据现有函数调整)
$stmt = $c->prepare($q);
$likeQuery = "%{$query}%";
$stmt->bind_param("s", $likeQuery);
$stmt->execute();
$result = $stmt->get_result();
$results = $result->fetch_all(MYSQLI_ASSOC);
if($results){
    foreach ($results as $row){
        echo $row['id']."=".$row['title']."\n";
    }
}
$stmt->close();
$c->close();
?>

内容的提问来源于stack exchange,提问作者Alexiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:47:52