5

これは、1 つのステートメントで一重引用符と二重引用符を使用する際の問題である可能性があります。しかし、私はこのコードを持っています:

echo '<form>
      <input type="submit" value="$number" onClick="function();">
      </form>'

これの問題は、送信ボタン$numberがその変数の値ではなくフレーズを言うことです。

だから私は周りを見回して、この解決策を見つけました:

echo "<form>
      <input type='submit' value='$number' onClick='function();'>
      </form>

これは $number の値を正しく出力しますが、echo ステートメントを一重引用符で囲むことに慣れているので、そのままにしておきたいと思います。すべての一重引用符を二重引用符に、二重引用符を単一引用符に切り替えるだけで問題が解決するのはなぜですか? そして、コードの最初のビットを変更して、エコーで一重引用符を保持し、属性で二重引用符を保持できるようにしますか?

4

8 に答える 8

13

PHP では、二重引用符で囲まれた文字列は、それに含まれる変数に対して自動的に解析されますが、単一引用符で囲まれた文字列は解析されません。したがって:

$myVar = 21;
echo "myVar: $myVar"

これにより、次のテキストが出力されます。myVar: 21

一方:

$myVar = 21;
echo 'myVar: $myVar'

これにより、次のテキストが出力されます。myVar: $myVar

コードの問題の 1 つは、HTML では要素の属性の値を単一引用符ではなく二重引用符で囲む必要があることです。一部のブラウザーがこのフォームを受け入れる (または引用符をまったく受け入れない) ことは知っていますが、これは正しい方法ではありません。

あなたが望むものを正しく達成するためのさまざまな方法があります。

方法 1: 二重引用符で囲まれた文字列をエスケープする:

$myVar = 21;
echo "<div id=\"$myVar\"></div>";

これはかなり洗練されていない解決策かもしれませんが、うまくいきます。

方法 2: 一重引用符 (または二重引用符) で囲まれた文字列連結を使用する:

$myVar = 21;
echo '<div id="' . $myVar . '"></div>';

必要に応じて、関数呼び出しやその他の PHP コードを使用できるため、これは IMO よりも優れたソリューションを提供します。

警告:

$myVar内容が不明な場合(つまり、ユーザーが入力する場合)、HTML コードに直接配置することは、クロスサイト スクリプティング (XSS) の形でセキュリティ上の脆弱性になることに注意してください。ユーザーが次のように入力したとします。

lol"><script>alert('XSS!');</script></div><div id="lol2

これにより、結果の HTML コードに次の内容が含まれます。

<div id="lol"><script>alert('XSS!');</script></div><div id="lol2"></div>

これは無害な例にすぎませんが、攻撃者は同じ手法を簡単に使用して、ユーザーの Cookie を盗むことができます (そのユーザーとしてログインしているふりをするため)。ここでのメッセージは、変数の内容が 100% 確実でない場合は、HTML コードに直接挿入しないでください。代わりに、 を呼び出しますhtmlspecialchars($myVar)。これは次のように変換されます。

$myVar = $_POST['whatever'];
echo '<div id="' . htmlspecialchars($myVar) . '"></div>';
于 2012-06-30T05:00:32.940 に答える
2

PHP では、二重引用符内の変数が処理および評価されますが、一重引用符内ではすべてが文字列の一部と見なされます。

ここでのより良い説明: http://www.trans4mind.com/personal_development/phpTutorial/quotes.htm

上記のリンクからの二重引用符の例:

$something="Oh something";
echo "My answer is $something.<br>";
//result is: My answer is Oh something

上記のリンクからの一重引用符の例:

echo 'My answer is $something.<br>';
//result is: My answer is $something.
于 2012-06-30T04:53:31.370 に答える
1

一重引用符を使用すると、一重引用符を除いて、内部のすべてが文字どおりに解釈されます。二重引用符を使用する場合、ドル記号 ($) で始まるものはすべて、PHP によって変数と見なされます。変数を使用するときは、通常、二重引用符でエコーを開始するのが好きです。

于 2012-06-30T04:55:35.897 に答える
1

一重引用符を引き続き使用する場合は、追加演算子 (ピリオド) を使用する必要があります。

echo '<form>
      <input type="submit" value="' . $number . '" onClick="function();">
      </form>';
于 2012-06-30T04:56:27.830 に答える
1

これを行うだけで、歌とダンス全体を避けることができます。読みやすいと思います。

<form>
    <input type="submit" value="<?php echo $number; ?>" onClick="myFunction()">
</form>
于 2014-11-01T04:43:25.543 に答える
0

PHP は、一重引用符と二重引用符で囲まれた文字列を別のものとして区別します。一重引用符の文字列はリテラルです。そのまま出力する必要があります。二重引用符で囲まれた文字列は、PHP 変数に対して解釈 (スキャン) され、適切な置換が行われます。

これは単に言語の機能 (および便利な機能) です。実際、すべての言語で文字列に二重引用符を使用することに慣れることをお勧めします。受け入れられない言語はなく、静的に型付けされた言語 (C、C++、Java など) では、単一引用符は文字を示し、二重引用符は文字列を示します。つまり、Javaでは C や C++String foo = 'my string';と同様にエラーが発生します。char * foo = 'my string';ただし、char foo = 'a';そのまま有効ですString foo = "my string";

PHP から最後の数ナノ秒のパフォーマンスを引き出す必要がある場合にのみ、二重引用符で囲まれた文字列を単一引用符で囲まれた文字列に変換します。他の言語では問題ありません。Afaik、PHP は、この文字列固有の二重引用符と単一引用符を区別する唯一の言語です。

于 2012-06-30T04:58:19.487 に答える
0

PHP は、二重引用符で囲まれた文字列に対して変数補間と呼ばれるものを実行します。つまり、文字列に含まれている可能性のある変数が検索され、その値が文字列で置換されます。一重引用符を保持したい場合は、次のように文字列と変数を連結する必要があります。

echo '<form>
<input type="submit" value="' . $number . '" onClick="function();">
</form>';

または、二重引用符を保持したい場合は、出力する二重引用符をエスケープできます。

echo "<form>
<input type=\"submit\" value=\"$number\" onClick=\"function();\">
</form>"
于 2012-06-30T04:58:57.597 に答える