簡體   English   中英

使用PostgreSql和PHP的INSERT語句中的錯誤

[英]Error in INSERT statement with PostgreSql and PHP

我正在使用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錯誤:“ INSERT”處或附近的語法錯誤:第2行:INSERT INTO acesso.usuario(^ 42601object(PDOStatement)#14(1){[“” QueryString“] => string(291) ”插入acesso.usuario(usuariopessoafisicaidentificador,usuarionome,usuarionomecompleto,usuariodescricao,usuariosenha,usuariosenhaalterar,usuariosituacao)值(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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM