0

フォームがあり、ユーザーが入力します(文字列の最後にアポストロフィがあることに注意してください)

My Bday'

今、私はアポストロフィを削除したいのですが、そのように単純です...それらをエスケープせず、スラッシュを追加せず、ただそれらを取り除きます

まず、私は次のものを持っています:

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

echo "<br /><br /><br />event title is $event_title";

その結果、次のものが返されます。

event title is My Bday\\\'

なぜ3つのスラッシュ?

それで、私は先に進んで、以下を使用してこれに対処します:

$event_title = str_replace("'", "", $event_title); 

$event_title = stripslashes($event_title); 

その後、再度返品して結果を確認します

echo "<br /><br /><br />event title is $event_title";

私は次のようになります:

event title is My Bday\

何が起こっているのかアイデアはありますか?単にアポストフとスラッシュを取り除きたいのですが、どういうわけかそれは起こりません

ちなみにmagic_quotes_gpcはオフです

ストリップスラッシュを使用しない場合、MySQLが処理できるようにストリップスラッシュを残しておくと、次のエラーが発生します。

You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'Private',
event_notes = '' where user_event_id = '35'' at line 3

update user_events set event_date = '2012-11-17', event_title = 'My Bday\\\',
event_vis = 'Private', event_notes = '' where user_event_id = '35'

OK、さらに編集:

私はこれを試しました:

$event_title = $_POST['event_title'];

$event_title = str_replace("'", "", $event_title);

$event_title = trim($event_title);

$event_title = mysql_real_escape_string($event_title);

echo "<br /><br /><br />event title is $event_title";

そして私はこれを手に入れます:

event title is My Bday\\

私は単にアポストロフィを取り除きたいのです。明らかにここで何か他のことが起こっていますが、それは私を手に入れました!

4

3 に答える 3

3

何が起こっているのか:

mysql_real_escape_stringエスケープする文字の前にスラッシュを追加して、エスケープする必要のあるすべての文字をエスケープします。ただし、スラッシュだけを追加すると、DB内にエスケープされていない文字が格納されるため、挿入する前にスラッシュもエスケープする必要があります...

それがあなたが持っている理由ですMy BDay\\\'。この値がDBに保存されている場合、最終的な結果はになりますMy BDay\'

しかし、あなたがそうするとき、あなたはこれstr_replace("'", "", 'My BDay\\\'');で終わり、これMy BDay\\\を求めstripslashesた後、あなたは得るでしょうMy BDay\-それは絶対に正しいです!

したがって、呼び出した後の文字列の外観を気にせずにmysql_real_escape_string、その値をDBに保存し、取得した後、My BDay'再び...

編集どのようにあなたは電話した後、3つから1つのスラッシュになりstripslasshesますか?この関数は、文字列の先頭から末尾まで移動し、スラッシュでエスケープされた文字を探して、エスケープされたスラッシュを削除します。したがって、最初の2つのスラッシュを見つけて、1つを削除しますが、まだ2つ残っています(1つは処理されたばかりで、3つ目は3つ目です)。したがって、次の2つのスラッシュを処理すると、スラッシュが1つだけ残ります...

文字列にストリップスラッシュを呼び出すと、 ...My BDay\\\'になります。My BDay'

EDIT2私の悪い...次の2つのスラッシュは、おそらくmagic_quotes_gpcオンになっているために追加されます-オフにするか、を呼び出しますmysql_real_escape_string(stripslashes($string))

于 2012-05-15T09:13:19.867 に答える
0

1つのスラッシュはアポストロフィをエスケープし、もう1つのスラッシュはアポストロフィをエスケープします。

内部的にmysqlは\'how'を解釈します

于 2012-05-15T09:12:50.360 に答える
0

PHP設定でstring_splash設定がオンになっているため、文字列がフォームから渡されると、すでに除外されています... mysql_real_escape_stringを使用しています。これは、「excapecharacter」と一重引用符も除外します。そのため、3つのスラッシュがあります。

この関数を使ってみてください-私はよく使います

function sanitize( $value )
{
    if( get_magic_quotes_gpc() )
    {
          $value = stripslashes( $value );
    }
    //check if this function exists
    if( function_exists( "mysql_real_escape_string" ) )
    {
          $value = mysql_real_escape_string( $value );
    }
    //for PHP version < 4.3.0 use addslashes
    else
    {
          $value = addslashes( $value );
    }
    return $value;
}

特にphp4以上の年向けではありません...この関数は文字列をエスケープし、文字列を二重にエスケープしないようにします(これはbeignが尋ねた質問です)

if(function_exists( "mysql_real_escape_string"))-データベース接続が利用可能であり、

それ以外の場合、データベース接続が利用できず、php 4のサポートが追加された場合にのみ、条件が機能することを確認します。

于 2012-05-15T09:32:39.993 に答える