サーバサイド言語とjavascriptの基本的なイメージを描いてみようかと思います
今回は
cakePHP3.4,apache2.4
シンプルなWEB環境でのお話
先日私の隣の席の子が、
本当はデータがないはずなのにデータが入ってるんです!
なんでですか?
そんなはずはないんです!
どうしてですか??
と
怒涛の???を投げられて私も困ってしまい。。
困ったのは???を連続で来られて困っただけです。。
本物のコードは会社のものなので記載はできませんが
ざっくりイメージ的にはこんな感じです。
※formタグとか省略多いですが汲み取ってください
何がしたいイメージかというとformのテキストフィールドに入力すると、javascriptのhoge関数が実行されてPHPの変数 $val に $hogeが代入される
というのが隣の席の子のがメージする動作
多分ここまでみてあぁ〜と思う人もいるかもしれませんが話を続けます。
基本的にPHPはプレーンな感じで書いていくと
ファイルはhoge.phpとします
<?php
$hoge = "hoge";
?>
<html>
<body>
<?php echo $hoge; ?>
</body>
</html>
とファイルを作ればブラウザでhoge.phpにアクセスするとhogeと表示されるはずです。
cakePHPを使っているとctpを別で作成していますが、クライアント(ユーザー)
に送信する際はctpを読み込んでphpタグで囲まれた処理を行いHTMLファイルとして送信されます。
つまり先ほどの例でいうとctpでPHPの変数を代入していますが、
サーバサイドの処理の時点で$valには$hogeの値が代入されそれ以下の記載処理に使われます
それをcakePHPはクライアント送信用のHTMLファイルを(ファイルというよりHTML宣言された出力)作成してクライアントに送信します。
クライアントは受け取った出力をブラウザに表示します。
ここでポイントはJavaScriptはクライアントで解釈されて動作するものだということです。
なので質問者は、onChangeが実行されて初めて$valにはじめて値が入ると思っていますが、すでにサーバサイドで処理されて代入は終わっているのです。
そもそも質問者がonChangeを使って何をしたいのかわかりませんが、
クライアントに送信される前に処理されることを、クライアントで実行されるものと勘違いしていたことが間違いです。
ちなみにctpのJavaScriptで
<?php $val = $hoge; ?>
の部分、JavaScript
で処理されないようにコメントしようとしても
// <?php $val = $hoge; ?>
PHPでは処理されます。
$val はctpで(phpタグの中では)利用できます
$valに代入たくなければ
<?php //$val = $hoge; ?>
PHPでコメントしなければなりません。
クライアントに送信されるときにコメントされているようでもサーバサイドで実行されるものなのでサーバサイドで実行されないように、PHPのコメントで制御します。
このことからも質問者がしたいこととは違う挙動になっていることがわかります。
このようにどこで実行されて動いているのかを理解しなければ、こうなるはずだと思っていても全く違う動作になるわけです。
今回は、ちょっと質問を受けたことからクライアントとサーバサイドでの実行タイミングを説明したのでこちらにも書くことにしました。
コメント
コメントを投稿