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

问题描述 投票:0回答:1

我在带有 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 类型详细信息的语法:令牌“06061c”无效。上下文:JSON 数据,第 1 行:06061c 未命名门户参数 $1 = '...'

但是如果我尝试这种方式,它会起作用。

$stmt->bindValue("code", "456478", PDO::PARAM_STR);
php postgresql pdo
1个回答
0
投票

您可以使用函数 to_jsonb() 为新值创建有效的 jsonb:

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

还将内容 CAST 为 TEXT,以便数据库非常明确地了解如何处理输入。

© www.soinside.com 2019 - 2024. All rights reserved.