最初の例を見てみましょう
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ではエスケープされます。すべての一重引用符は出力で'
エスケープされた一重引用符になりますが、出力としてバックスラッシュを生成するには、バックスラッシュ自体をエスケープする必要があるため、\'
書き込む必要があります。\\'