通过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
相关产品推荐
相关产品推荐

