Utilisez différents dollar-quotes à la place :
select upsert( $unique_token$INSERT INTO zz(a, b) VALUES (66, 'ha$$hahaha')$unique_token$, $unique_token2$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$unique_token2$ )
Chaque fin doit correspondre à chaque début. Les deux paires n'ont pas besoin d'être distinctes, mais c'est plus sûr ainsi.
Cela laisse encore une chance théorique que la citation en dollars corresponde à l'intérieur de la chaîne.
Si vous construisez la requête à la main, vérifiez simplement $
dans la chaîne. Si vous construisez la requête à partir de variables, vous pouvez utiliser quote_literal(querystring)
à la place.
Il y a aussi le pratique format()
fonction.
Voir :
A part :Je suppose que vous savez que cette forme de SQL dynamique est extrêmement vulnérable à l'injection SQL ? Tout élément de ce genre doit être réservé à un usage très privé ou très sécurisé.