6

mysql_real_escape_string を使用して問題なくデータベースにデータを取得しています。

したがって、データベース内のエントリは次のようになります。

1/4" Steve's lugnuts

これは完全にデータベースに登録されています。
今、私はその正確なものを探したいと思っています。しかし、それは " または ' のいずれかで混乱します (私は多くのことを試しましたが、常にどこかで混乱します)。

これが私が今持っているものです:(user_inputは前のページのフォームから来ています)

$user_input=mysql_real_escape_string($_REQUEST['user_input']);
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' ");
while($search = mysql_fetch_array($search_row))
            {stuff happens}

echo "<form action='search_results.php' method='post'>";
echo "<input name='user_input' type='text' size='50' value='" . $user_input. "'>";
echo "<input type='submit' value='Lookup Parts' />";
echo "</form>";

しかし、問題は、エラー以外は何も得られないようだということです。
検索フィールド(すでに入力したものが入力されるはずです)には次のものがあります。

1/4\" Steve\

私は何を間違っていますか?

4

4 に答える 4

5

検索フィールド(すでに入力したものが入力されるはずです)には、1/4\" Steve\

もちろんあります!
あなたは逃げる場所を間違えました。mysql_real_escape_string は SQL 専用です! しかし、あなたはその結果をhtmlに使用しています。HTML の場合は、完全に異なるエスケープ方法を使用する必要があります。

だから、それを作る

$user_input=mysql_real_escape_string($_REQUEST['user_input']);
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' ");
while($search = mysql_fetch_array($search_row))
            {stuff happens}


$user_input =htmlspecialchars($_REQUEST['user_input'],ENT_QUOTES); // here it goes

echo "<form action='search_results.php' method='post'>";
echo "<input name='user_input' type='text' size='50' value='$user_input'>";
echo "<input type='submit' value='Lookup Parts' />";
echo "</form>";

また、このような大きな HTML のチャンクをエコーし​​ても意味がないことに注意してください。PHP タグを閉じてから、純粋な HTML を記述します。

?>
<form action='search_results.php' method='post'>
<input name='user_input' type='text' size='50' value='<?=$user_input?>'>
<input type='submit' value='Lookup Parts' />
</form>

はるかに明確で、読みやすく、便利に見えます

于 2011-09-22T16:44:00.293 に答える
4

さて、あなたの問題は適切な引用です。あなたの問題は、MySQL と HTML で異なる引用符が必要であり、おそらく magic_quotes_gpc を設定することもできるということです! 引用するときは、次のような特定の出力のテキストを常に引用します。

  1. mysql クエリの文字列値
  2. likemysql クエリの式
  3. htmlコード
  4. json
  5. mysql 正規表現
  6. php 正規表現

それぞれの使用法は異なる構文コンテキスト内に存在するため、ケースごとに異なる引用符が必要です。これは、PHP への入力ではなく、特定の出力で引用符を付けるべきであることも意味します。magic_quotes_gpcこれが、次のような機能が壊れている理由です(スイッチがオフになっていることを確認してください!!! )。

では、これらの特定のケースで引用するためにどのような方法を使用するのでしょうか? (お気軽に修正してください。より現代的な方法があるかもしれませんが、これらは私にとってはうまくいっています)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode()-utf8のみ!iso-8859-2に関数を使用しています
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))- バックスラッシュが 2 回エスケープされるため、この場合は preg_quote を使用できません。
  6. preg_quote()

編集:元の質問について-引用を修正すると、もちろん、一重引用符と二重引用符を含む文字列内の任意の文字を使用できます。

于 2011-09-22T16:49:40.117 に答える
0

それが確かに役立つかどうかはわかりませんが、クエリのためにエスケープして、htmlのためにもう一度エスケープするべきではありませんか?

$query = sprintf("SELECT * FROM some_table WHERE some_column LIKE '%s' ", mysql_real_escape_string($user_input));

echo "<input name='user_input' type='text' size='50' value='".htmlentities($user_input)."'>";

編集

送信するたびに入力($ user_input)を変更(エスケープ)したくない場合があります。ただし、'と"だけが影響を受けた場合は、とにかく問題にならない可能性があります。

于 2011-09-22T16:36:24.133 に答える
0

あなたの文「SELECT * FROM some_table WHERE some_column LIKE '%$user_input%'」を印刷して、それが何をしているのか(そしてエスケープしているのか)を確認してください。

解決策ではありませんが、mysqli または pdo (http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php) を参照してください。準備済みステートメント用のユーティリティがあります。

于 2011-09-22T16:25:26.427 に答える