PDO执行INSERT插入语句报SQLSTATE[42000] 1064语法错误
问题产生原因
- 字段与传入值的数量不匹配:你声明的待插入字段一共5个,分别是
naam、adres、postcode、email、nieuwsbrief,但VALUES子句中传入了6个变量,多传入了$plaats(对应报错片段里的Rotterdam),列数和值数不对等本身就违反SQL语法规则。 - 字符串类型值未按SQL规范包裹单引号:SQL语法明确要求,字符串、邮编、邮箱这类非数值类型的插入值,必须用单引号包裹后才能被识别为字面值。你直接把PHP变量拼接到SQL语句中,没有给字符串值加引号,数据库解析时会把这些字符串内容误判为语法关键字、字段名,最终触发解析错误。你看到报错位置指向
4,1234AB,Rotterdam,email@gmai.com,1)片段,就是因为前面的字符串值没有引号包裹,解析到这个位置时已经不符合语法规则。 - 你提到语句在PHPMyAdmin中测试正常,本质是你在PHPMyAdmin手动写测试语句时,要么对齐了字段和值的数量,要么给字符串值手动加了单引号,和PHP里拼接出来的实际执行语句并不一致,自然运行结果不同。
修复方法
优先推荐使用PDO预处理语句实现插入,从根源上避免字符串引号、拼接错误,同时防范SQL注入风险,参考代码如下:
// 先核对表结构:如果klant表确实有plaats字段,就把该字段加到插入字段列表中;如果没有plaats字段,就把VALUES里的$plaats删掉,保证字段数和值数完全一致 $insertSql = "INSERT INTO `klant` (`naam`,`adres`,`postcode`,`plaats`,`email`,`nieuwsbrief`) VALUES (:naam, :adres, :postcode, :plaats, :email, :nieuwsbrief)"; $statement = $pdo->prepare($insertSql); // 传入参数执行,PDO会自动根据参数类型处理转义、引号包裹,不需要手动处理 $statement->execute([ ':naam' => $naam, ':adres' => $adres, ':postcode' => $postcode, ':plaats' => $plaats, ':email' => $email, ':nieuwsbrief' => $nieuwsbrief ]);
如果你坚持使用字符串拼接的方式写SQL(该写法存在严重SQL注入风险,仅作语法演示,禁止生产环境使用),需要同时对齐字段和值的数量、给所有非数值类型值用$pdo->quote()方法转义并包裹单引号,示例如下:
// 仅作语法问题演示,不推荐实际使用 $query = "INSERT INTO `klant` (`naam`,`adres`,`postcode`,`plaats`,`email`,`nieuwsbrief`) VALUES ( {$pdo->quote($naam)}, {$pdo->quote($adres)}, {$pdo->quote($postcode)}, {$pdo->quote($plaats)}, {$pdo->quote($email)}, " . (int)$nieuwsbrief . " )";
内容的提问来源于stack exchange,提问作者thedjhouse
相关产品推荐
相关产品推荐

