2

Updated フォームで提供したテキストエリアは、ユーザー入力を文字列として受け取ります

二重引用符を含む文字列がDBに不完全に挿入されています。

テキスト領域に文字列を挿入しました

「レイアウト/デザイン/テキストサイズについてはあまり気にしないでください。全体的な見栄えを良くするために、バナーを「スパイスアップ」(太字、斜体、間隔)することがよくあります。

そして、文字列をDBに挿入すると、文字列はで終了します

レイアウト/デザイン/テキストサイズについてはあまり気にしないでください。

部分的に挿入されます。すべての一重引用符と二重引用符を挿入できるようにするにはどうすればよいですか。

リクエストに応じて編集

以下は、phpを使用してデータベースに挿入するために使用しているクエリです

"insert into products_description(products_id、products_name、products_logo_name1、products_logo_name2、products_logo_name3、products_description)values('"。(int)$products_id。"'、'banner_"。$products_id。"'、'"。$_ POST ['logoimage1 ' ]。"'、'"。$_ POST['logoimage2']。"'、'"。$_ POST['logoimage3']。"'、'"。mysql_real_escape_string($ _ POST ['description'])。 "') 「」

ここで、mysql_real_escape_string($ _ POST ['description'])は二重引用符をエスケープしていないため、挿入時に何をすべきかを切り捨てますか?

4

5 に答える 5

5

次のように、文字列内の二重引用符をエスケープします。

$theString = "Hello, i wonder what all these \"quotes\" are doing in here...";

バックスラッシュは、後続の二重引用符の「意味」を無視し、通常の文字のように扱うようにコンパイラに指示します (これを「エスケープ」と呼びます)。

また、ユーザー入力を操作する場合にもチェックアウトmysql_real_escape_string()します (これにより、mySQL データベースで使用する文字列内のすべての危険な要素が自動的にエスケープされます)。

于 2010-09-15T09:50:38.950 に答える
3

LOL
は質問全体を読んでいませんが、答えを知っていると確信しています

それはデータベースに正しく挿入され、次に正しく取得され、HTMLフォームのフィールド値に入ります... ;-)

まあ、真剣に。
データを段階的に追跡する必要があります。
アプリケーションにいくつかの邪悪なコードがあり、それがいくつかの邪悪なことを行います。
データ フローに従って、データがどの段階で損なわれるかを確認する必要があり
ます。次の手順でデータを印刷するだけです。

  • フォームデータの受信後
  • データベースに挿入する前に
  • データベースから取得した後
  • フォームに印刷する前に

それはあなたの一般的な欠点です。多段階のプロセスを単一のステップとして取っています。
文字列がテキストエリアに挿入されているのを見て、次にこのテキストエリアで文字列が切り捨てられているのを見ます。そして、それはデータベースの問題だと思います。確かではありませんが、データベースが関与しない多くのステップがあります。アプリを固いブロックとしてではなく、複数段階のプロセスとして見てください。

于 2010-09-15T09:53:05.387 に答える
0

引用符をエスケープする必要があります。

DBがMySQLの場合は、すべてのデータをmysql_real_escape_string()関数に渡してからDBに保存してください。

これを行わないと、データが失われるだけでなく、コードに大きなセキュリティホールが発生するリスクがあります。

(まだ行っていない場合は、他の目的でも他のデータをエスケープする必要があります。たとえば、不正なユーザーが生のHTMLまたはJavascriptコードをブラウザに追加して操作するのを防ぐために、ブラウザに返送されるデータをエスケープする必要があります。サイト。

PHPには、エスケープ文字の追加と削除、およびデータフィルタリングを処理するための関数がいくつかあります。あなたのサイトを安全にしたいのなら、あなたはこれらの機能とテクニックを学ぶ必要があります。

[編集]

あなたの編集を見た後:

まず、説明だけでなく、クエリ内のすべての文字列をエスケープする必要があります。そのため$_POST['logoimage1']、引用符が含まれている場合も同じ問題が発生するため、などにエスケープを追加します。

ただし、説明フィールドのエスケープは正しいように見えるので、なぜ切り捨てられるのかわかりません。のマニュアルページにmysql_real_escape_string()は、二重引用符と一重引用符はエスケープされていると記載されているため、問題ないはずです。これをテストするには、完全にエスケープされたSQL文字列をprint()します。これは、エスケープされていないものがあるかどうかを示します。

暗闇の中で撮影-データベースの説明フィールドの最大長を確認しましたか?それはまた、文字列の切り捨てを引き起こす可能性があります。テキストエリアを使用して入力する場合は、十分な長さに設定されていると思います。

于 2010-09-15T09:59:04.677 に答える
0

@COL Sharpnel の Scouldings によると :-)

私を自分自身に叱らせてくれてありがとうAgauin..時々それが必要です

私は $_POST['description'] をエコーし​​、これは次のように表示されます

レイアウト/デザイン/テキスト サイズについてはあまり心配しないでください。

そして私が使ったとき

htmlspecialchars(stripslashes($_POST['description']))

それは私に完全な文字列を与えました

「レイアウト/デザイン/テキスト サイズについてはあまり心配しないでください。全体的な見栄えを良くするために、バナーを「スパイスアップ」(太字、斜体、スペースなど) することがよくあります。

> 投稿の教訓: スパゲッティ コードに自信を持ってはいけない

于 2010-09-15T11:31:30.467 に答える
0

mysql_real_escape_string()ユーザー入力から来ている場合は、関数を使用します。

mysql_real_escape_string()は、MySQL のライブラリ関数 mysql_real_escape_string を呼び出します。この関数は、\x00、\n、\r、\、'、"、および \x1a の文字の前にバックスラッシュを追加します。

この関数は、クエリを MySQL に送信する前にデータを安全にするために常に (いくつかの例外を除いて) 使用する必要があります。

于 2010-09-15T09:51:07.623 に答える