使用 PostgreSql 和 PHP 的 INSERT 语句出错
Error in INSERT statement with PostgreSql and PHP
我正在使用带有 php 和 pdo 的 postgresql。我收到一个错误,我不知道我做错了什么。
- 我的环境是:
PostgreSQL 9.3.6
Ubuntu 14.04.2 LTS
PHP 5.6.7
Apache/2.4.12 (Ubuntu)
我用的table是这样的:
-- Table: acesso.usuario
-- DROP TABLE acesso.usuario;
CREATE TABLE acesso.usuario
(
usuarioidentificador serial NOT NULL,
usuariopessoafisicaidentificador integer,
usuarionome character varying(30) NOT NULL,
usuarionomecompleto character varying(90) NOT NULL,
usuariodescricao text,
usuariosenha character varying(32) NOT NULL,
usuariosenhaalterar bit(1) NOT NULL,
usuariosituacao bit(1) NOT NULL
)
WITH (
OIDS=FALSE
);
如果我在 pgadmin3 执行这个
INSERT INTO acesso.usuario(
usuariopessoafisicaidentificador, usuarionome,
usuarionomecompleto, usuariodescricao, usuariosenha, usuariosenhaalterar,
usuariosituacao)
VALUES (null, '', '',
null, '', '1', '1'
);
我成功返回了这个查询:一行受到影响,执行时间为 82 毫秒。
所以我正在尝试 PHP:
try {
$query ="
INSERT INTO acesso.usuario(
usuariopessoafisicaidentificador, usuarionome,
usuarionomecompleto, usuariodescricao, usuariosenha, usuariosenhaalterar,
usuariosituacao)
VALUES (null, '', '',
null, '', '1', '1'
);
";
$this->statement = $query;
$conn = $this->getConnection();
$query = $conn->prepare($this->statement, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]);
$result = $query->execute();
} catch (\Exception $e) {
echo $e->getMessage() . " <br> " . $e->getCode();
var_dump($query);
die();
return false;
}
我得到这个输出:
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "INSERT" LINE 2: INSERT INTO acesso.usuario( ^
42601object(PDOStatement)#14 (1) { ["queryString"]=> string(291) " INSERT INTO acesso.usuario( usuariopessoafisicaidentificador, usuarionome, usuarionomecompleto, usuariodescricao, usuariosenha, usuariosenhaalterar, usuariosituacao) VALUES (null, '', '', null, '', '1', '1' ); " }
我正在尝试了解发生了什么。
你知道吗?
还是谢谢你。
由于查询是 INSERT(与 SELECT 相对),因此无法映射到游标。问题出在传递给 prepare
:
的属性中
[\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]
在内部,PDO 为 postgres 生成一个这样开始的查询:
DECLARE pdo_crsr_00000001 SCROLL CURSOR WITH HOLD FOR
INSERT INTO acesso.usuario(...
并且如 DECLARE 中所述,后面的查询必须是 SELECT 或 VALUES 命令,这就是解析器产生语法错误的原因当它在那里找到 INSERT 时。
解决方案就是删除第二个参数:
$query = $conn->prepare($this->statement);
我正在使用带有 php 和 pdo 的 postgresql。我收到一个错误,我不知道我做错了什么。
- 我的环境是:
PostgreSQL 9.3.6
Ubuntu 14.04.2 LTS
PHP 5.6.7
Apache/2.4.12 (Ubuntu)
我用的table是这样的:
-- Table: acesso.usuario
-- DROP TABLE acesso.usuario;
CREATE TABLE acesso.usuario
(
usuarioidentificador serial NOT NULL,
usuariopessoafisicaidentificador integer,
usuarionome character varying(30) NOT NULL,
usuarionomecompleto character varying(90) NOT NULL,
usuariodescricao text,
usuariosenha character varying(32) NOT NULL,
usuariosenhaalterar bit(1) NOT NULL,
usuariosituacao bit(1) NOT NULL
)
WITH (
OIDS=FALSE
);
如果我在 pgadmin3 执行这个
INSERT INTO acesso.usuario(
usuariopessoafisicaidentificador, usuarionome,
usuarionomecompleto, usuariodescricao, usuariosenha, usuariosenhaalterar,
usuariosituacao)
VALUES (null, '', '',
null, '', '1', '1'
);
我成功返回了这个查询:一行受到影响,执行时间为 82 毫秒。
所以我正在尝试 PHP:
try {
$query ="
INSERT INTO acesso.usuario(
usuariopessoafisicaidentificador, usuarionome,
usuarionomecompleto, usuariodescricao, usuariosenha, usuariosenhaalterar,
usuariosituacao)
VALUES (null, '', '',
null, '', '1', '1'
);
";
$this->statement = $query;
$conn = $this->getConnection();
$query = $conn->prepare($this->statement, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]);
$result = $query->execute();
} catch (\Exception $e) {
echo $e->getMessage() . " <br> " . $e->getCode();
var_dump($query);
die();
return false;
}
我得到这个输出:
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "INSERT" LINE 2: INSERT INTO acesso.usuario( ^ 42601object(PDOStatement)#14 (1) { ["queryString"]=> string(291) " INSERT INTO acesso.usuario( usuariopessoafisicaidentificador, usuarionome, usuarionomecompleto, usuariodescricao, usuariosenha, usuariosenhaalterar, usuariosituacao) VALUES (null, '', '', null, '', '1', '1' ); " }
我正在尝试了解发生了什么。
你知道吗?
还是谢谢你。
由于查询是 INSERT(与 SELECT 相对),因此无法映射到游标。问题出在传递给 prepare
:
[\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]
在内部,PDO 为 postgres 生成一个这样开始的查询:
DECLARE pdo_crsr_00000001 SCROLL CURSOR WITH HOLD FOR
INSERT INTO acesso.usuario(...
并且如 DECLARE 中所述,后面的查询必须是 SELECT 或 VALUES 命令,这就是解析器产生语法错误的原因当它在那里找到 INSERT 时。
解决方案就是删除第二个参数:
$query = $conn->prepare($this->statement);