3

私はたくさんのトピックを調べてきましたが、まだ機能するものを見つけていません。または、機能しているかもしれませんが、PHP/MySQL にはかなり慣れていないので、何かが足りないだけかもしれません。

ユーザーがアイテムの名前を入力して (MySQL) データベースで検索できるページがあります。次に、結果の表を生成して表示し、一部のデータをリンクに変換します。リンクされた用語は、データベースの他のフィールドを検索するためのクエリとして使用されます。

検索用語の1つにアポストロフィが含まれている場合を除いて、すべてが機能します。インジェクションの問題を防ぎたいのは明らかですが、アポストロフィで検索する必要もあります。ここに私が持っているコードがあります:

$query = mysql_real_escape_string($query);
$query = htmlspecialchars($query);
$queryentered = $query;
$query = strtolower($query);

クエリに渡す URL は次のとおりです。

echo " from <a href='index.php?volume=".$results2['book']."' class='where'>"
.$results2['book']."</a>";

そしてクエリ:

$raw_results = mysql_query("SELECT * FROM $database1 WHERE $wh LIKE '%$query%'
ORDER BY displayname") or die(mysql_error());

私は何を正しくエンコードしていませんか? 検索を実行すると、「[検索用語] の結果が見つかりません」と表示され、アポストロフィの \' が表示されます。

4

3 に答える 3

2

このスニペットの順序はまったく間違っています。

$query = mysql_real_escape_string($query);
$query = htmlspecialchars($query);
$queryentered = $query;
$query = strtolower($query);

エスケープは、データベースクエリ文字列の連結の直前の最後に実行する必要があります。この場合、strtolowerはエスケープを元に戻さないため、関係ありません。さらに深刻なのは、実際にはHTMLのエスケープであり、SQLコンテキストには属していません。代わりに、メイン変数を上書きしないでください。

$queryentered = htmlspecialchars($query);
$query = strtolower($query);
$query = mysql_real_escape_string($query);

面倒なデータベースのエスケープは簡単に回避できます。PDOとプリペアドステートメントを調べます。

于 2012-11-12T03:33:35.860 に答える
1

プリペアドステートメントとPDOライブラリを使用することを強くお勧めします。

  • 本当に簡単に学ぶ
  • あなたの質問を解決しやすくします
  • (ほとんどの)任意のデータベースで動作します
  • あなたが言及する注射の問題を防ぐのに大いに役立ちます
  • スキルセットは、あなたが学ぶかもしれない他の言語に適用されます

クエリを記述し、接続文字列(データベースの種類と詳細を含む)を準備してから、クエリを実行するだけです。データを分離するために、パラメーターの配列がクエリとともに送信されます。

便利なリンク:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

http://id1.php.net/pdo

于 2012-11-12T03:30:24.700 に答える
1

問題は次の行にあります。

$query = htmlspecialchars($query);

Death's book あなたの最終的な ものを検索する$query と、death\&#039;s book! htmlspecialcharsクエリを削除しても問題ありません。

于 2012-11-12T03:34:25.130 に答える