使用PostgreSql和PHP的INSERT语句出错

时间:2015-04-14 20:46:34

标签: php postgresql pdo

我使用postgresql,使用php和pdo。我收到了错误,我不知道自己做错了什么。

  • 我的环境是:

PostgreSQL 9.3.6

Ubuntu 14.04.2 LTS

PHP 5.6.7

Apache / 2.4.12(Ubuntu)

我使用的表是:

-- 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]:语法错误:7错误:语法错误在或附近&#34; INSERT&#34;第2行:插入acesso.usuario(^   42601object(PDOStatement)#14(1){[&#34; queryString&#34;] =&gt;字符串(291)&#34; INSERT INTO acesso.usuario(usuariopessoafisicaidentificador,usuarionome,usuarionomecompleto,usuariodescricao,usuariosenha,usuariosenhaalterar,usuariosituacao)VALUES(null,&#39;&#39;,&#39;&#39;,null,&#39;&# 39;,&#39; 1&#39;,&#39; 1&#39;); &#34; }

我试图找出正在发生的事情。

你知道吗?

无论如何,谢谢你。

1 个答案:

答案 0 :(得分: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时产生语法错误的原因。< / p>

解决方案只是删除第二个参数:

$query = $conn->prepare($this->statement);