在准备好的语句Postgres中使用字符串文字

时间:2013-08-13 12:35:41

标签: php postgresql postgresql-9.0

我正在使用PHP和Postgresql 9.0。我希望插入一个字符串,例如。

"TiMxji+bhCJlk9OGcYosmBpEK8K+Li1Ygut9MJWFtpT8t0MlbGgMWJ7\/SHj8PjSWXoeGRmjjAqBTPQMe"

使用预准备语句进入列。生成的字符串是身份验证系统的一部分,因此必须准确输入。我的问题是反斜杠被解释为转义字符而不是文字字符。通常我相信我只会使用E运算符来表示字符串文字,但这只会引发错误。有没有办法告诉Postgres在使用预准备语句时这是一个字符串文字?

下面是一个简单的示例语句,其中$ 1是我希望表示为字符串文字的字符串。

pg_prepare($p->db,'setToken','UPDATE users SET token=$1 WHERE email=$2'); 

感谢您的帮助,

标记

1 个答案:

答案 0 :(得分:1)

  

$ 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));
    
  2. 如果使用$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());
    
  3. 这两种方法都有效,但方法#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构造中,因为涉及多个引用级别,所以这是不必要的。