代码之家  ›  专栏  ›  技术社区  ›  Ronaldo Ávila de Arruda Junior

SQLSTATE[22P02]:无效的文本表示:7错误:json类型的无效输入语法DETAIL:令牌“06061c”无效

  •  0
  • Ronaldo Ávila de Arruda Junior  · 技术社区  · 2 年前

    我在带有PDO的PostgreSQL数据库中使用SQL子句。我有一个生成验证码的功能,还有一个更新用户代码的功能。但是,此函数中存在一个更新代码的问题。当代码中包含字母时,它将其标识为令牌。如果只是数字或字母,它会完美地更新。我在一些帖子中读到,有必要用引号将字段括起来,但这不适用于参数。

    public function upCode(Usuario $user){
        try {
            var_dump($user->getCode());
            $sql = "UPDATE usuarios
            SET usuario = jsonb_set(usuario, '{code}', :code, false)
            WHERE usuario->>'email' = :email";
            $stmt = (parent::getCon())->prepare($sql);
            $stmt->bindValue("email", $user->getEmail());
            $stmt->bindValue("code", $user->getCode(), PDO::PARAM_STR);
            $stmt->execute();
    
        }catch (PDOException $e) {
        echo "". $e->getMessage();
        var_dump($e);
        }
    }
    
    public function gerarCode(){
            $this->code = bin2hex(random_bytes(3));
        }
    

    错误:

    SQLSTATE[22P02]:无效的文本表示形式:7错误:无效输入 json DETAIL类型的语法:令牌“06061c”无效。上下文:JSON 数据,第1:06061c行未命名门户参数$1=“…”

    但如果我尝试这种方式,它是有效的。

    $stmt->bindValue("code", "456478", PDO::PARAM_STR);
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Frank Heikens    2 年前

    您可以使用该功能 to_jsonb ()为新值创建有效的jsonb:

    UPDATE usuarios
    SET usuario = jsonb_set(usuario, '{code}', to_jsonb(CAST(:code AS text)), false)
    WHERE usuario->>'email' = :email;
    

    还将内容转换为TEXT,以便非常明确地向数据库说明如何处理输入。