我在带有 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);
您可以使用函数 to_jsonb() 为新值创建有效的 jsonb:
UPDATE usuarios
SET usuario = jsonb_set(usuario, '{code}', to_jsonb(CAST(:code AS text)), false)
WHERE usuario->>'email' = :email;
还将内容 CAST 为 TEXT,以便数据库非常明确地了解如何处理输入。