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

通过Slim webservice向MariaDB插入数据时报SQL错误1064如何解决?

报错原因
  • 核心原因是你使用了SQL保留关键字desc作为数据库表的字段名,desc是SQL中用于ORDER BY 字段 DESC降序排序的专用关键词,直接在INSERT语句的字段列表中使用未加包裹的desc时,MariaDB会把它识别为语法关键词而非普通字段名,因此触发1064语法错误。
  • 你使用的NotORM框架默认没有对插入的字段名做保留关键字校验和自动包裹处理,生成的INSERT语句直接拼接了未加反引号的desc字段,最终导致语法解析失败。
解决方法
  • 方案1:修改字段名(更推荐,从根源避免后续冲突)
    把数据库reportes表中的desc字段改为非保留关键字,比如description或者descricao(适配你的命名习惯),同时同步修改后端代码中对应字段的映射逻辑即可:
$app->post('/api/addrepp', function ($request) {
    require_once ('db/dbconnect.php');
  
    $idutilizador = $request->getParsedBody()['idutilizador'];
    $desc = $request->getParsedBody()['desc'];
    $lat = $request->getParsedBody()['lat'];
    $lng = $request->getParsedBody()['lng'];
    $titulo = $request->getParsedBody()['titulo'];
    $imagem = $request->getParsedBody()['imagem'];
              
    $report = array(
      "idutilizador" => $idutilizador,
      "descricao" => $desc, // 和修改后的数据库字段名保持一致
      "lat" => $lat,
      "lng" => $lng,
      "titulo" => $titulo,
      "imagem" => $imagem,
    );
  
    $reports = $db->reportes();
    $result = $reports->insert($report);
  
    if($result == false) {
      echo json_encode([ 'status' => false, 'message' => "Ocorreu um erro ao inserir report"], JSON_UNESCAPED_UNICODE);
    }else{
      echo json_encode([ 'status' => true, 'message' => "Report adicionado com sucesso"], JSON_UNESCAPED_UNICODE);
    }
  
});
  • 方案2:保留desc字段名,开启NotORM自动转义配置
    在dbconnect.php中初始化NotORM时添加quoteIdentifiers配置,让框架自动给所有表名、字段名加上反引号包裹,规避保留关键字冲突:
// dbconnect.php中NotORM初始化逻辑示例
$pdo = new PDO('mysql:host=localhost;dbname=你的库名', '账号', '密码');
$db = new NotORM($pdo, null, null, [
    'quoteIdentifiers' => true // 开启标识符自动转义
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 23:03:02