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'); 

谢谢你的帮助,

标记

4

1 回答 1

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. 如果使用$tokenand$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 和 ON 从 9.1 开始。
pg_escape_string知道此设置并将自动考虑它(除非您使用过时版本的 postgresql 客户端库)。

并且由于您提到了E'...'前缀表示法,因此在使用它时\,无论设置如何,它始终是后面字符串中的转义字符standard_conforming_strings。一般来说,您不想将 php 变量中的文字填充到E'...'postgresql 结构中,因为涉及到多个级别的引用,这会变得不必要地困难。

于 2013-08-15T15:30:36.190 回答