[解決済み] PHPからJavaScriptに変数やデータを渡すにはどうしたらよいですか?
2022-03-14 03:47:52
質問内容
PHPで変数を持っていて、JavaScriptのコードでその値が必要です。PHPからJavaScriptに変数を渡すにはどうしたらよいでしょうか?
次のようなコードがあります。
<?php
$val = $myService->getValue(); // Makes an API and database call
同じページで、JavaScriptのコードがあり、そのコードには
$val
変数にパラメータとして渡す必要があります。
<script>
myPlugin.start($val); // I tried this, but it didn't work
<?php myPlugin.start($val); ?> // This didn't work either
myPlugin.start(<?=$val?>); // This works sometimes, but sometimes it fails
</script>
解決方法は?
実は、これにはいくつかのアプローチがあるんです。あるものは他のものより多くのオーバーヘッドを必要とし、またあるものは他のものより優れていると考えられています。
順不同。
- AJAXを使って、サーバーから必要なデータを取得する。
- ページのどこかにデータをエコーし、JavaScriptでDOMから情報を取得する。
- データを直接JavaScriptにエコーする。
今回は、上記の方法をそれぞれ検証し、その長所と短所、そして実装方法について見ていきましょう。
1. AJAXを使用してサーバーから必要なデータを取得する
この方法が最も良いとされているのは サーバーサイドとクライアントサイドのスクリプトは完全に分離されています。 .
プロフェッショナル
- レイヤー間の分離が良い - 明日からPHPを使わず、サーブレットやREST APIなどのサービスに移行する場合でも、JavaScriptのコードをあまり変更する必要はありません。
- より読みやすい - JavaScriptはJavaScript、PHPはPHPです。この2つを混ぜることなく、両方の言語でより読みやすいコードを得ることができます。
- 非同期データ転送を可能にする - PHPから情報を取得するのは、時間やリソースがかかる場合があります。時には、情報を待ってページをロードし、その情報がいつでも届くようにしたいとは思わないでしょう。
- データがマークアップ上に直接存在しない - つまり、マークアップは追加的なデータからきれいに保たれ、JavaScriptだけがそれを見るということです。
短所
- レイテンシー - AJAXはHTTPリクエストを作成し、HTTPリクエストはネットワークを介して運ばれ、ネットワーク遅延があります。
- 状態 - 別のHTTPリクエストで取得されたデータには、HTMLドキュメントを取得したHTTPリクエストの情報は含まれません。この情報が必要な場合 (たとえば、フォームの送信に応答して HTML ドキュメントが生成された場合)、何らかの方法で情報を転送する必要があります。もしあなたがデータをページに埋め込むことを拒否した場合(この技術を使用する場合)、レースコンディションの対象となる可能性のあるクッキーやセッションに制限されます。
実装例
AJAXでは、2つのページが必要です。1つはPHPが出力を生成するページで、もう1つはJavaScriptがその出力を取得するページです。
取得データ.php
/* Do some operation here, like talk to the database, the file-session
* The world beyond, limbo, the city of shimmers, and Canada.
*
* AJAX generally uses strings, but you can output JSON, HTML and XML as well.
* It all depends on the Content-type header that you send with your AJAX
* request. */
echo json_encode(42); // In the end, you need to echo the result.
// All data should be json_encode()d.
// You can json_encode() any value in PHP, arrays, strings,
//even objects.
index.php (または、実際のページがどのような名前であろうと)
<!-- snip -->
<script>
function reqListener () {
console.log(this.responseText);
}
var oReq = new XMLHttpRequest(); // New request object
oReq.onload = function() {
// This is where you handle what to do with the response.
// The actual data is found on this.responseText
alert(this.responseText); // Will alert: 42
};
oReq.open("get", "get-data.php", true);
// ^ Don't block the rest of the execution.
// Don't wait until the request finishes to
// continue.
oReq.send();
</script>
<!-- snip -->
上記の2つのファイルの組み合わせで、アラート
42
は、ファイルの読み込みが終了した時点で
その他の読み物
2. ページのどこかにデータをエコーし、JavaScriptでDOMから情報を取得する
この方法は、AJAXに比べるとあまり好ましくないが、それでも利点はある。それは、やはり 割と JavaScriptの中に直接PHPが入っていないという意味で、PHPとJavaScriptは分離されています。
プロフェッショナル
- <強い 高速 - DOM操作が速いことが多く、多くのデータを比較的早く保存し、アクセスすることができます。
短所
-
<強い
意味不明なマークアップの可能性
- 通常、何が起こるかというと、ある種の
<input type=hidden>
の方が情報を取り出しやすいので、情報を保存するためにinputNode.value
しかし、そうすると、HTMLの中に意味のない要素ができてしまうことになります。HTMLには<meta>
要素は文書に関するデータ用で、HTML 5ではdata-*
属性は、特定の要素に関連付けることができるJavaScriptで読み取るための特別なデータです。 - ソースを汚す - PHPが生成するデータは、HTMLソースに直接出力されます。つまり、より大きく、より焦点の定まらないHTMLソースを得ることができます。
- 構造化データを取得しにくい - 構造化データは有効なHTMLでなければならず、そうでなければ自分で文字列をエスケープしたり変換したりしなければならないでしょう。
- PHPとデータロジックの緊密な連携 - PHPはプレゼンテーションで使われるため、きれいに切り離すことができない。
実装例
これは、ユーザーには表示されないが、JavaScriptからは見える何らかの要素を作るというものである。
index.php
<!-- snip -->
<div id="dom-target" style="display: none;">
<?php
$output = "42"; // Again, do some operation, get the output.
echo htmlspecialchars($output); /* You have to escape because the result
will not be valid HTML otherwise. */
?>
</div>
<script>
var div = document.getElementById("dom-target");
var myData = div.textContent;
</script>
<!-- snip -->
3. データを直接JavaScriptにエコーする
これが一番わかりやすいかもしれませんね。
プロフェッショナル
- <強い 非常に簡単に実装できる - 実装するにも、理解するにも、ほとんど手間がかからない。
- ソースを汚さない - 変数はJavaScriptに直接出力されるため、DOMに影響を与えません。
短所
- <強い PHPとデータロジックの密な結合 - PHPはプレゼンテーションで使われるため、きれいに切り離すことができない。
実装例
実装は比較的簡単です。
<!-- snip -->
<script>
var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; // Don't forget the extra semicolon!
</script>
<!-- snip -->
がんばってください
関連
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
jsを使った簡単な照明スイッチのコード
-
Vueのフィルタの説明
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み] テスト
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
フロントエンド非同期(アシンク)ソリューション(全ソリューション)
-
JavaScriptのgetElementById()メソッド入門
-
[解決済み] PHP の文字列を JavaScript の変数に渡す (そして改行をエスケープする) [重複]。
-
[解決済み] PHP の配列を JavaScript の関数に渡す [重複] PHP の配列を JavaScript の関数に渡すには、次のようにします。