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

Node.js查询MySQL出现ER_PARSE_ERROR语法错误的解决方法

解决MySQL查询语法错误(ER_PARSE_ERROR)的问题

错误根源

问题出在参数数组与SQL占位符数量不匹配:当searchString为空时,SQL语句中没有WHERE子句对应的?占位符,但你仍然把空字符串的searchParam加入了参数数组,导致数据库执行时解析出错——多余的空字符串被错误识别为无效语法,触发ER_PARSE_ERROR。

解决方案

动态构建参数列表,确保占位符数量和参数数量完全对应:

  • 初始化空的参数数组,仅当存在有效搜索条件时,才将搜索参数加入数组
  • 分页参数始终添加到参数数组末尾

修改后的完整代码

export async function fetchAllPatients({
  searchString = "",
  pageNumber = 1,
  pageSize = 20,
  sortBy = "desc"
}: {
  searchString?: string;
  pageNumber?: number;
  pageSize?: number;
  sortBy?: SortOrder;
}): Promise<{
  patients: any[];
  isNext: boolean;
}> {
  let db: Connection | null = null;

  try {
    db = connectToDatabase();

    return new Promise((resolve, reject) => {
      const skipAmount = (pageNumber - 1) * pageSize;
      let sql = 'SELECT id, firstName, lastName, sex, age, residence, enrollmentDate FROM patients';
      const params: any[] = [];

      // 处理搜索条件
      if (searchString.trim() !== '') {
        sql += ` WHERE CONCAT(firstName, ' ', lastName) LIKE ?`;
        params.push(`%${searchString.trim()}%`);
      }

      // 添加排序与分页
      sql += ` ORDER BY enrollmentDate ${sortBy.toUpperCase()} LIMIT ?, ?`;
      params.push(skipAmount, pageSize);

      // 执行查询
      db?.query(sql, params, (error, results) => {
        if (error) {
          console.error(`Error fetching patients: ${error.message}`);
          reject(`Failed to fetch patients: ${error.message}`);
        } else {
          const patients = results.map((patient: any) => ({
            id: patient.id,
            fullName: `${patient.firstName} ${patient.lastName}`,
            sex: patient.sex,
            age: patient.age,
            residence: patient.residence,
            enrollmentDate: formatDate(patient.enrollmentDate),
          }));
          // 解析是否存在下一页
          resolve({
            patients,
            isNext: results.length === pageSize
          });
        }
      });
    });
  } catch (error) {
    console.error(`Database connection error: ${(error as Error).message}`);
    throw new Error(`Failed to connect to database: ${(error as Error).message}`);
  } finally {
    // 关闭数据库连接,避免资源泄漏
    if (db) {
      db.end();
    }
  }
}

额外注意事项

  • 确保formatDate函数已正确实现,避免后续日期格式化出错
  • 外层try/catch处理数据库连接失败的场景,finally块中关闭连接防止资源泄漏
  • 判断isNext的逻辑可根据需求优化,比如额外查询总记录数来精确计算分页状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:57:48