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. $token代わりにandを文字列リテラルとして使用すると$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_stringsON の場合\は正常であることを示し、OFF の場合はエスケープ文字であることを示すパラメータがあります。
このパラメーターのデフォルト値は、9.0 までは OFF で、9.1 以降は ON です。
pg_escape_stringはこの設定を認識しており、自動的に考慮します (古いバージョンの postgresql クライアント ライブラリを使用しない限り)。

E'...'また、プレフィックス表記について言及したので、それを使用する場合\、設定に関係なく、常に後続の文字列のエスケープ文字になりstandard_conforming_stringsます。一般に、リテラルを php 変数から postgresql コンストラクトに詰め込みたくはありませんE'...'。複数レベルの引用が含まれているため、不必要に困難です。

于 2013-08-15T15:30:36.190 に答える