Symfony5原生SQL插入语句无法绑定参数,字段值全为NULL
问题:Symfony 5原生SQL插入参数绑定后字段值全部为NULL
为提升Symfony 5应用中部分操作的性能,使用原生SQL查询时无法成功绑定参数。执行时无报错,数据库新增行但所有字段值均为NULL。
原实现代码:
$sql = "INSERT INTO `brand` (name, created_at) VALUES (name=:name, created_at=:date)"; $connection = $this->em->getConnection(); $statement = $connection->prepare($sql); $statement->bindValue(':name', $data); $statement->bindValue(':date', $now); $statement->executeQuery(); return $connection->lastInsertId();
打印Statement可见SQL语句和参数数组均正确:
Doctrine\DBAL\Statement {#939 ▼ #sql: "INSERT INTO brand (name, created_at) VALUES (name=:name, created_at=:date)" #params: array:2 [▼ ":name" => "Hyundai" ":date" => "2024-10-23 14:37:13" ] #types: array:2 [▶] #stmt: Symfony\Bridge\Doctrine\Middleware\Debug\Statement {#934 ▶} #platform: Doctrine\DBAL\Platforms\MySQL57Platform {#621 ▶} #conn: Doctrine\DBAL\Connection {#446 ▶} }
lastInsertId返回预期结果,但数据库中新增行的所有字段值均为NULL。尝试过直接在execute()中传入参数数组、仅绑定单个字符串参数、指定参数类型(如\PDO::PARAM_STR),甚至直接将参数值写入SQL语句,结果均为字段值NULL。
解决方案
问题核心是INSERT语句的VALUES语法错误:你在VALUES子句里错误地使用了name=:name这种键值对形式,这不是标准的INSERT写法。标准语法应该直接传入参数占位符,不需要重复字段名。
修正后的代码:
$sql = "INSERT INTO `brand` (name, created_at) VALUES (:name, :date)"; $connection = $this->em->getConnection(); $statement = $connection->prepare($sql); $statement->bindValue(':name', $data); $statement->bindValue(':date', $now); $statement->executeQuery(); // 也可以用更简洁的写法,直接在executeQuery里传参数数组 // $statement->executeQuery([':name' => $data, ':date' => $now]); return $connection->lastInsertId();
原因说明
MySQL不会对这种写法抛出错误,但name=:name会被解析为布尔比较表达式:此时name字段还未赋值,默认是NULL,NULL=参数值的结果是NULL,最终插入的就是NULL值。这就是所有字段都变成NULL的根本原因。
内容的提问来源于stack exchange,提问作者Yoc
相关产品推荐
相关产品推荐

