1

これは夢中になっていますが、答えが見つからないようです。ネットワーク ドライブにマッピングするための Windows samba パスが含まれる場合があるテクニカル ナレッジ ベースを実行します。

例えば:\\servername\sharename

バックスラッシュが 2 つ続くパスを含めると、「addslashes」の実行時に適切にエスケープされません。期待される結果は " " です\\\\servername\\sharenameが、" " が返されます\\servername\\sharename。後で 'stripslashes' を実行すると、二重のバックスラッシュ プレフィックスは 1 つのスラッシュにすぎません。また、 a を使用してみましたが、予想されるときにstr_replace("\\", "\", $variable);返されます。"\servername\sharename""\\servername\sharename"

したがって、addslashes を使用すると、最初の 2 つのバックスラッシュのセットが無視され、str_replace を使用すると、2 つのバックスラッシュが 1 つのエンコードされたバックスラッシュに変更されます。

データベースを挿入するには、addslashes と stripslashes を実行する必要があります。pg_escape_string を使用しても、この特定のケースでは機能しません。

これは、Apache 上の PHP 5.3.1 で実行されています。

編集: コード例
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo addslashes($variable);
これは次を返します:In the box labeled Folder type: \\servername\\sharename

編集: コード例 #2
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo str_replace('\\', '\', $variable);
これは次を返します:In the box labeled Folder type: \servername\sharename

また、一重引用符または二重引用符を使用しても、(ご想像のとおり) 異なる結果が得られないことを述べたいと思います。どちらかまたは両方を使用しても、まったく同じ結果が得られます。

私ができることについて何か提案はありますか?

4

4 に答える 4

1

あなたが説明した問題についてテストを実行しました。あなたが望む動作を得る唯一の方法は、条件と正規表現を組み合わせて、最初に二重スラッシュを予測することでした。

$str = '\\servername\sharename';
    if(substr($str,0,1) == '\\'){
    //String starts with double backslashes, let's append an escape one.
    //Exclaimation used for demonstration purposes.
    $str = '\\'.$str;
    echo addslashes(preg_replace('#\\\\\\\\#', '!',$str ));

    }

これは以下を出力します:

!servername\\sharename

これは完全な答えではないかもしれませんが、機能し、エスケープ文字がこれら2つの構造によってどのように扱われるかの違いを示しています。使用する場合、!別の正規表現を使用して、目的の文字に簡単に置き換えることができます。

于 2010-12-14T21:06:38.563 に答える
1

どこが問題なのかはわかっていると思います。これを実行してみてください:

echo addslashes('\\servername\sharename');

そしてこれは

echo addslashes('\\\\servername\sharename');

PHPは一重引用符をエスケープするために使用されるため、一重引用符を使用しても二重スラッシュをエスケープします。

于 2010-12-14T20:48:26.333 に答える
1

これは の問題ではなくaddslashes、文字列を変数に割り当てる方法の問題です。

$variable = 'In the box labeled Folder type: \\servername\sharename';
echo $variable;

これは以下を返します: [フォルダの種類] というラベルの付いたボックス: \servername\sharename

これは、二重のバックスラッシュがエスケープされたバックスラッシュとして解釈されるためです。代わりにこの割り当てを使用してください。

$variable = 'In the box labeled Folder type: \\\\servername\\sharename';
于 2010-12-14T23:43:57.967 に答える
-1

さらにテストを重ねた結果、PHPがハードコードされた文字列をどのように処理しているかが実際に問題であると判断しました。ハードコードされた文字列は私が興味を持っているものではないため(私はテスト/この例でそれらを使用していました)、単一のテキストボックスと送信ボタンを備えたフォームを作成しました。addslashesこの方法でPOSTされたデータを正しくエスケープします。

さらに調査を行った結果、私が経験した問題は、PostgreSQLがエスケープされたデータを受け入れる方法にあると判断しました。PostgreSQLデータベースにデータを挿入すると、実際にデータをテーブルに配置するときに指定されたエスケープ文字がすべて削除されます。したがって、stripslashesデータを引き出すときにエスケープ文字を削除する必要はありません。

この問題は、PHP 4.1(Magic Quotesがオンの場合)からPHP 5.3(Magic Quotesが非推奨)へのコードの移行に起因していました。既存のシステム(PHP4)では、MagicQuotesがオンになっていることに気付いていなかったと思います。addslashesしたがって、すべてのPOSTデータはすでにエスケープされており、挿入する前にそのデータを再度エスケープしていました。PostgreSQLに挿入されると、1セットのスラッシュが削除され、もう1セットが残されるためstripslashes、途中で終了する必要があります。さて、Magic Quotesをオフにすると、脱出できますが、途中でaddslashes使用する必要はありません。stripslashes

問題がどこにあるのかを正確に整理して判断するのは非常に困難でした。そのため、この回答は私の元の質問から少し外れていることを私は知っています。しかし、私は貢献してくれたすべての人に感謝します。他の人に自分の考えを聞いてもらうことは、自分ではできないかもしれない道について考えさせるのに常に役立ちます。

于 2010-12-15T16:30:44.580 に答える