2012-04-28 8 views
1

フォームから、テキストを入力するようユーザーに求めています。私はこのテキストを$_POST['text']で検索します。テキスト出力のスラッシュ

ユーザーは「It's my text!」という文字列を入力します。今、非常に同じページに、私は私が にユーザーにテキストを表示し、また、PHPを使用して入力テキストボックスの値としてそれを使用するデータベースへ$newTextを挿入した後

$newText = mysql_real_escape_string($_POST['text']); 

// I want to make sure the user hasn't added any unsafe html in their string 
$newText = htmlentities($newText); 
echo "You've entered: " . $newText . "<br />"; 
echo "<form action=someaction.php method=post>"; 
echo "<input type=text value=\"" . $newText . "\">"; 
echo "</form>"; 

出力は次のようになります。

You've entered: It\'s my text! 
[It\'s my text!] 

は、どのように私はこれらのスラッシュを避けるか、と私は私のデータで何かをやるべき?

答えて

3

名前が示すように、アポストロフィなどの文字列をエスケープするmysql_real_escape_string()にテキストを渡しています。 mysql_real_escape_string()は、のみを意味し、は、データベースに保存するためのデータを作成するためのものです。ユーザーにデータを表示するときには使用しないでください。

解決方法は簡単です。行を削除してhtmlentities()のみを使用してください。文字列をデータベースに保存するときは、mysql_real_escape_string()を使用します(そのときのみ)。

+2

これがなぜ落とされたのかわからない、それは100%正しい。 –

+0

時には最も簡単な解決策は、私が自動的に見落とすことです。ありがとうございました。 – Nate

+0

@ネイト私が質問を持っている限り、 "行を削除する"は正確に正しい文ではありません。 "2つの変数を作成します.1つはデータベース用、もう1つはHTML用"という方が良いでしょう。しかし、私の答えを見てください。 –

-2

はmysql_real_escape_stringの()

を使用して正常に保存し、次の形式で表示したいとき:

htmlspecialchars(stripslashes($row['text_data'])) 

それはトリックを行います。

+2

だから...服を着て、もう一度裸になる?なぜ裸にならないの? –

+0

あなたはポイントを逃した。 HTMLを受け入れることができるテキストエリアがあるとします。できるだけ生のままデータベースに保存します。私が示した方法は、それをデータベースに保存してフォームに再び表示することを示しています。そのまま印刷したい場合は、htmlspecialchars()を使わずにstripslashes()を行います。これはHTMLエディタのために行く... – galchen

+1

あなたはポイントを欠場しています。 m_r_e_s()はデータベース操作用です。その出力をhtml形式に戻すことはありません。また、元のエスケープされていないバージョンがまだ利用可能であるため、ストライプラッシュを使用した操作の実行は無意味です。 –

-1

クエリで使用する変数にはmysql_real_escape_string()を使用します。これは、スラッシュを追加して文字列の一部の文字をエスケープするためです。これはmysqlにはうってつけですが、ページ上で使用したいときは奇妙に見えます。

MySQLでは1、生のテキストを表示するには1の2つの変数を作成できます。

$text = $_POST['text']; 
$db_text = mysql_real_escape($text); 

はまた、あなたがスラッシュを削除するには、後でデータベースから取得したデータにstrip_slashes()を使用する必要があることに注意してください。

この明快なことを少し願ってください。

+1

データを取得するときに 'strip_slashes()'は必要ありません。(正しく使用された場合) 'mysql_real_escape_string()'はクエリのデータだけをエスケープするからです。スラッシュは実際にデータベースに保存されません。 – JJJ

+0

それは正しいです、それを忘れてしまった。 \ – fhugas

+0

mysql_real_escape_string()は、クエリで使用する変数ごとに使用するのではなく、引用符付きの文字列でのみ使用するようにしてください –

-1

は今、非常に同じページに、私はデータベースに$をnewTextを挿入した後、私はあなたが間違ってやっていることだユーザー

にテキストを表示したいです。
HTTP標準では、すべてのPOST要求が成功するたびにのGETメソッドをリダイレクトする必要があります。
したがって、同じページにユーザーをリダイレクトする必要があります。このページでは、データベースから挿入されたデータを読み取ってユーザーに表示することができます。

あなたが行った間違いは、データベース操作に近い場所にエスケープして、目的にのみ使用されていることを確認してください(忘れてしまう危険はなく、義務的です!)。
理想的には、クエリ内のデータを表現するためにいくつかの変数を使用し、それらを処理するハンドラを使用する必要があります。
したがって、クエリコールは

DB::run("UPDATE table SET text=s:text",$_POST['text']); 

ように見えるかもしれs:textで適切に準備、$_POST['text']値で置換されたプレースホルダ名に設定された種類に応じするよう可変(と呼ばれるプレースホルダ)、(s "文字列"を意味し、関数にエスケープしてデータを引用するように指示します)
したがって、必要な準備はすべて内部で実行され、ソース変数を壊すことはありません。