2010-12-14 11 views
1

これは夢中になっていますが、私は答えが見つからないようです。私たちは、時にはネットワークドライブへのマッピング用のWindows sambaパスを含む技術的な知識ベースを実行します。PHP 'addslashes'が期待通りに動作しない

たとえば

「にaddslashes」を実行しているとき

私たちはお互いに続いて2つのバックスラッシュを持ってパスを含める\\servername\sharenameは、彼らが適切にエスケープされません。私の予想される結果は "\\\\servername\\sharename"ですが、 "\\servername\\sharename"を返します。明らかに、後で 'stripslashes'を実行すると、二重バックスラッシュプレフィックスはスラッシュだけです。私もstr_replace("\\", "\", $variable);を使ってみましたが、"\\servername\sharename"と期待したら"\servername\sharename"を返します。

addslashesでは、最初の二重バックスラッシュのセットを無視し、str_replaceでは二重バックスラッシュを単一のエンコードされたバックスラッシュに変更します。

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

これはApache上でPHP 5.3.1で動作します。

EDIT:サンプル・コードは、
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo addslashes($variable);
これが返されます:In the box labeled Folder type: \\servername\\sharename

EDIT:サンプルコード#は2
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo str_replace('\\', '\', $variable);
これが返されます:In the box labeled Folder type: \servername\sharename

私も思いますのが好き一重引用符や二重引用符を使用しても、私には異なる結果が得られるとは言えません。いずれかまたは両方を使用すると、私には同じ正確な結果が得られます。

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

+4

私はちょうど2つのバックスラッシュを含む文字列にaddslashesを実行し、4つのバックスラッシュを返します。私は、いくつかのコード例が必要だと思います。 – StasM

+1

あなたのケースでpg_escape_stringはなぜ機能しませんか? – babonk

+0

コードサンプルをセコンディングする。私はこれが "'(エスケープしない)と" "(エスケープする)という文字列への扱いの違いになると思います。 – lotsoffreetime

答えて

-1

私は、より多くのテストで、PHPがハードコードされた文字列をどのように処理しているかを判断しました。ハードコードされた文字列は私が興味を持っているものではないので(私は単にテスト/この例で使っていました)、私は単一のテキストボックスと送信ボタンを持つフォームを作成しました。 addslashesはPOSTのデータをこのように正しくエスケープします。

さらに多くの調査をして、私が経験している問題は、PostgreSQLがエスケープされたデータをどのように受け入れるかということでした。 PostgreSQLデータベースにデータを挿入すると、実際にテーブルにデータを置くときに与えられるエスケープ文字はすべて削除されます。したがって、データを引き出すときにエスケープ文字を削除する場合は、stripslashesは不要です。

この問題は、PHP 4.1(マジッククォート付き)からPHP 5.3(マジッククォートの使用は推奨されていません)へのコード移行に起因しています。既存のシステム(PHP4)では、マジッククォートがオンになっていることを認識していなかったと思います。したがって、すべてのPOSTデータはすでにエスケープされていましたが、挿入する前にaddslashesでそのデータを再度エスケープしていました。 PostgreSQLに挿入されたら、スラッシュの1セットを取り除き、残りのものを残すので、私たちには出口のところにstripslashesが必要です。 Magic Quotesをオフにして、addslashesでエスケープしますが、途中でstripslashesを使用する必要はありません。

問題がどこにあるのかを正確に整理して判断するのは非常に難しかったので、この回答は私の元々の質問に対してちょっとしたものです。しかし、私は貢献した皆さんに感謝します。あなたのアイデアに他の人が耳を傾けさえすれば、あなたが自分で持っていないかもしれない道を考えさせることができます。

1

私はどこに問題があるのか​​知っていると思います。ただ、これを実行しよう:単一引用符をエスケープするために使用されているので

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

そして、この1

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

PHPは、さえ単一引用符と二重のスラッシュをエスケープします。

+0

私の結果は、それぞれ '\\ servername \\ sharename'と' \\\\ servername \\ sharename'です。 –

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つの構築物によって処理される方法の違いを示しています。使用される場合、!別の正規表現を使って簡単に目的の文字に置き換えることができます。

+0

あなたのコード例も私のために働いていました。ただし、記事の本文に共有パスが表示されることはありません。一度表示される場合もあれば、著者の裁量で複数回表示される場合もあります。私は、すべてと一致し、理想よりも小さいそれらを置き換えるpreg_replaceを書かなければなりません。しかし、それが私が働くことができる唯一のものなら、私はそうする必要があるかもしれないと思います。あなたのコード例をありがとう。 –

1

これはaddslashesでは問題ありません。文字列を変数に割り当てる方法には問題があります。

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

これが返されます:ボックスラベルされたフォルダの種類で:\サーバー名\共有名

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

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

私は "変数"が何であるかを制御できません。それは私がこの質問のために作成した単なる例でした。 「変数」は、ユーザーが入力したフォームからPOSTされたものになります。 –

+0

@mririgoいずれの場合でも、例2からあなたの質問では、1つの行に2つのバックスラッシュ(\ servername \ sharename)が含まれていないことが明らかです。問題はaddslashesではなく、あなたの文字列にあります。 –

関連する問題