0

javascript関数を呼び出すアンカーを動的に作成しています。1つの文字列パラメータで機能しますが、2つでは機能しません。パラメータの前後の引用符を正しくエスケープしていないと思います。答えを探して私は次のことに出くわしました

onclick="alert('<?echo $row['username']?>')"  

そして次に見つけたものは私を完全に困惑させました

echo('<button type="button" id="button'.$ctr.'"onClick="showMapsInfo(\''.str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr).'\');"><img src="img/maps_logo.gif"></button><br/>');

誰かが喜んでくれるなら

  1. ユーザー名を一重引用符で囲む必要がない理由を説明してください。

  2. 「ダミー」がある場合は、2番目の例を解読できるように、エスケープ文字について記述します。

4

5 に答える 5

1

最初の例を見てみましょう

onclick="alert('<?echo $row['username']?>')" 

ここで重要なのは、外部のすべて<? … ?>が純粋なHTMLであり、PHPインタープリターによって決して見られないということです。したがって、PHPに関連する唯一の部分は、内部のコード<? … ?>、つまりecho $row['username']。ここでは、エスケープする必要はありません。

対照的に、2番目の例

echo('<button type="button" id="button'.$ctr.'"onClick="showMapsInfo(\''.str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr).'\');"><img src="img/maps_logo.gif"></button><br/>');

純粋にPHPで書かれており、周囲のHTMLはありません。したがって、引用符には注意する必要があります。これを最初から作成して、ここで何が起こるかを見てみましょう。このようなものを作成するときは、おそらく次のように始めます

echo('<button type="button" id="button1" onClick="showMapsInfo(\'...\');"><img src="img/maps_logo.gif"></button><br/>');

一重引用符はすでに文字列の区切り文字として使用されているため、文字列内で。を使用してエスケープする必要があります\'。次に、javascript関数内の部分について説明します。さらに簡単に言えば、上記のコードは次のように要約されます

echo('showMapsInfo(\'...\');');

その結果、

showMapsInfo('...');

'...'部分の代わりにいくつかの動的部分を挿入する場合は、文字列をで終了し、 。'で連結して戻す必要があり.ます。$foobarそこに変数を挿入したいとすると、次のように記述します。

echo('showMapsInfo(\''.$foobar.'\');');

その結果、

showMapsInfo('<VALUE OF $foobar>');

あなたの例はこの文字列に挿入しません$foobarが、次の式を挿入します。

str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr)

これはstr_replace、コンテンツを再びエスケープするために使用しますが、少しひねりを加えています。PHPではエスケープされませんが、結果のJavascriptではエスケープされます。すべての一重引用符は出力で'エスケープされた一重引用符になりますが、出力としてバックスラッシュを生成するには、バックスラッシュ自体をエスケープする必要があるため、\'書き込む必要があります。\\'

于 2012-07-07T06:28:46.177 に答える
1

引用符を置き換えてからヒアドキュメントを使用すると、読みやすく、理解しやすくなります。

$maps_name = str_replace("'", "\\'", $maps_name);
$ctr       = str_replace("'", "\\'", $ctr);

echo <<<HTML

<button type="button" id="button$ctr" onClick="showMapsInfo('$maps_name', '$ctr');"><img src="img/maps_logo.gif"></button><br/>

HTML;
于 2012-07-07T06:29:41.240 に答える
0

json_encodejavascript変数に関数を使用できます。

echo sprintf(
  '<button type="button" id="button%s" onClick="showMapsInfo(%s, %s);">
   <img src="img/maps_logo.gif"></button><br/>',
    htmlspecialchars($ctr), json_encode($maps_name), json_encode($ctr));
于 2012-07-07T06:19:24.873 に答える
0
  1. ユーザー名を囲む一重引用符は、JavaScriptではなくPHP変数の一部であるため、エスケープする必要はありません。

  2. PHP変数をJavaScriptに挿入する方法については、こちらをご覧ください。詳細については、こちらをご覧ください

    変数が文字列の場合は、PHP変数を引用符で囲む必要があります。

于 2012-07-07T06:22:15.200 に答える
0

関数が機能しているときに一重引用符をエスケープすることに問題はないと思います

1つのパラメーターのみを使用して呼び出します。

パラメータ全体を正しく作成しているかどうか、コンマが適切に追加されているかどうか、JavaScriptでパラメータの周りに一重引用符が付いているかどうかを確認してください。

最後に、パラメータ文字列は次のようになります。

'param1'、'param2'

于 2012-07-07T06:25:45.840 に答える