4

私はかなりイライラしています。たとえば、O'Connor のように、一重引用符で囲んだ名前をデータベースに挿入できるようにしたいと考えています。

したがって、DB に挿入するときは、次のようにします。

 $lname = mysql_real_escape_string($_POST['lname']);

そして、DB に $lname を挿入します。

DB にある場合は、O\'Connor として表示されます。

したがって、Web アプリケーションでその姓を思い出すには、次のようにする必要があります。

 $lname = stripslashes($r["lname"]);

これはすべてうまくいくようです。ただし、姓を検索して結果を表示する検索機能があります。検索するときは、結果を得るために O\'Connor を検索する必要があります。

ご覧のとおり、検索した後、テキストボックスには検索されたばかりの値が (セッションを使用して) 自動的に保存されます。だから私のコードはこれです:

 $search = mysql_real_escape_string($_GET['search']);
 $_SESSION['search'] = $search;

前に言ったように、検索するときは「O\'Connor」を使用する必要があり、検索後、テキスト ボックスの値は「O\\\\'Connor」になります。

これを理解しようとするのはイライラします。私が間違っていることを誰かが知っていますか?ありがとう!

編集:

魔法の引用符に関する私のphp5.iniファイルは次のとおりです。

 ; Magic quotes
 ;

 ; Magic quotes for incoming GET/POST/Cookie data.
 magic_quotes_gpc = On

 ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
 magic_quotes_runtime = Off

 ; Use Sybase-style magic quotes (escape ' with '' instead of \').
 magic_quotes_sybase = Off

ただし、私のサイトは GoDaddy でホストされており、ファイルを編集する権限がありません :(

4

6 に答える 6

7

PHP 設定でマジック クォートが有効になっているようです。

実際に有効になっているかどうかを確認するには:

echo get_magic_quotes_gpc();

を無効にするには、php.ini ファイルを編集します。

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

または、次の行を .htaccess に追加します。

php_flag magic_quotes_gpc Off
于 2009-07-29T15:12:18.873 に答える
0

PHPのインストールに実際に実際のエスケープ文字列が含まれているかどうかを確認するためにfixinput関数を少し編集します(古いバージョンにはありません)。

  function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($value);
    }
    else {
      return mysql_escape_string($value);
    }
  }
于 2009-07-29T15:26:04.073 に答える
0

マジッククォートが有効になっています。これが意味するのは、postやget、または他の同様の場所に配置されたものはすべて自動的にエスケープされるため、初心者のプログラマーはそれほど心配する必要がないということです。私が正しく覚えていれば、現在のバージョンのPHPでは非推奨になっています。

これに対処し、どの構成からでも同じようにスクリプトを実行するために実行したいことは次のとおりです。

function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    return mysql_real_escape_string($value);
}

これをさらに変更して、数値以外のデータを引用符で囲むこともできます。これは一般的なバリエーションですが、これらの引用符は手動で配置する方がよいと思います。

于 2009-07-29T15:18:56.927 に答える
-1

get_magic_quotes_gpcオン/オフはチェックしません。

引用された$lname = mysql_real_escape_string(stripslashes($_POST['lname']));テキストがない場合は、スラッシュを削除しません。引用されている場合は、それらを削除します。

そしてそれは私にとって驚異的に機能します!

于 2009-07-29T15:35:00.093 に答える
-1

DB にある場合は、O\'Connor として表示されます。

したがって、Web アプリケーションでその姓を思い出すには、次のようにする必要があります。

 $lname = stripslashes($r["lname"]);

違う!で文字列をエスケープするとmysql_real_escape_string、クエリでのみエスケープされます。データベースはクエリを解釈するため、データはエスケープ文字なしでデータベースに格納されます。データベースからデータを引き出す場合は、使用する必要はありません。stripslashesそう思う場合は、データベース内のデータが破損していることを意味します。ほとんどの場合、魔法の引用符がオンになっているためです。

あなたがすべき:

  • 魔法の引用符をオフにするか、その効果を全体的に逆にします。詳しくはマニュアルをご覧ください。
  • バインドされたパラメーターを使用するか(最善の解決策) すべての変数を でエスケープしますmysql_real_escape_string。これは、クエリを作成している場所で行う必要があります。
  • データベースから引き出したものには何もしないでください。

特に、関数を、fixinputここの回答の一部にリストされている および バリアントにしないでください。http-request から来ていないデータを台無しにするので、問題を解決するのは間違った方法です。

于 2009-07-29T16:45:16.590 に答える
-2

あなたがする必要があるのは、検索クエリ、mysql_real_escape_string を取得することだけです。それは完全に問題ないはずです。ただし、これを行う最善の方法は、エスケープして保存しないことです。代わりに、すべてがデータベースに入るのをエスケープするだけです。

代わりに、次のようにします。

$_SESSION['検索'] = $_GET['検索'];
 $search = mysql_real_escape_string($_GET['search']);
于 2009-07-29T15:09:52.903 に答える