我正在使用PHP和Postgresql 9.0。我希望插入一个字符串,例如。
"TiMxji+bhCJlk9OGcYosmBpEK8K+Li1Ygut9MJWFtpT8t0MlbGgMWJ7\/SHj8PjSWXoeGRmjjAqBTPQMe"
使用预准备语句进入列。生成的字符串是身份验证系统的一部分,因此必须准确输入。我的问题是反斜杠被解释为转义字符而不是文字字符。通常我相信我只会使用E运算符来表示字符串文字,但这只会引发错误。有没有办法告诉Postgres在使用预准备语句时这是一个字符串文字?
下面是一个简单的示例语句,其中$ 1是我希望表示为字符串文字的字符串。
pg_prepare($p->db,'setToken','UPDATE users SET token=$1 WHERE email=$2');
感谢您的帮助,
标记
答案 0 :(得分:1)
$ 1是我希望表示为字符串文字的字符串。
这里的术语存在矛盾,因为将字符串作为文字写入与通过$1
占位符通过参数提供字符串相反。
如果使用参数,则代码为:
$result=pg_prepare($p->db, 'setToken','UPDATE users SET token=$1 WHERE email=$2');
// error checking on $result skipped
$result=pg_execute($p->db, 'setToken', array($token, $email));
如果使用$token
和$email
作为字符串文字,代码可能如下所示:
$query = sprintf("UPDATE users SET token='%s' WHERE email='%s'",
pg_escape_string($p->db, $token),
pg_escape_string($p->db, $email));
$result=pg_prepare($p->db, 'setToken', $query);
// error checking on $result skipped
$result=pg_execute($p->db, 'setToken', array());
这两种方法都有效,但方法#1通常被认为更加万无一失且高效。
关于反斜杠字符的注意事项:通常情况下,\
必须进行转义。在标准SQL中,反斜杠是一个不能转义的普通字符。出于兼容性原因,PostgreSQL有一个参数standard_conforming_strings
,当ON时,表示\
正常,当OFF表示它是一个转义字符时。
此参数的默认值为OFF,最高为9.0,从9.1开始为ON
pg_escape_string
知道此设置并自动将其考虑在内(除非您使用过时版本的postgresql客户端库)。
由于您提到了E'...'
前缀表示法,因此使用它时\
始终是后面的字符串中的转义字符,无论standard_conforming_strings
设置如何。一般情况下,您不希望将PHP变量中的文字填充到E'...'
postgresql构造中,因为涉及多个引用级别,所以这是不必要的。