質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

4218閲覧

ボタンクリックでPHPのデータをJavaScriptに渡す

tarofess

総合スコア127

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/03/09 06:50

現在画面に複数のリストが表示されており、それぞれのリストのボタンが押されたらそのリストに紐づいている値をJavaScriptに渡して処理をさせたいのですが、うまくできません。
コードは以下のようになっています。

html

1<div class="contents"> 2 <ul> 3 <?php foreach ($list as $data) { ?> 4 <li class="contents_li"> 5 <img class="contents_image" src="<?php echo $data->image ?>"/> 6 <p class="contents_title"><?php echo $data->title; ?></p> 7 <a onclick="buy()" href="#"><input type="button" value="購入"></a> 8 <input type="hidden" name="name" value=<?php echo $data->name ?>> 9 </li> 10 <?php } ?> 11 </ul> 12</div>

javascript

1function buy() { 2 // 受け取ったデータに合わせた処理 3}

例えば<input type="hidden">のvalueの値をJavaScriptのbuy関数内でアラートで表示させるようにするにはどうやって書けばいいでしょうか?
onclickのbuy()に引数を持たせようとしてもうまくいきません。
jqueryは使わない方向で実現したいのですが、どうすればボタンクリックでPHPのデータをJavaScriptに渡すことができるでしょうか?
どなたか分かる方がいれば教えていただきです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

どうすればボタンクリックでPHPのデータをJavaScriptに渡すことができるでしょうか?

基本的な考え方として覚えておいてもらいたいのが、「そんなことはできません」です。
PHPはあくまでHTMLなり何なりWebブラウザで見るための情報を出力するだけだからです。
なので、どちらかというと「PHPでDBから取得した情報をHTMLに表示し、その情報をボタンクリックなどのイベントをもってjavascriptで受け取る」という考え方になります(表現の違いですが意味合いや理解が大きく違ってきます)

で、今回は$dataそれぞれにbuyがついているのでhiddenも必要なく、data->nameを渡すだけであれば下記で十分と思います。

php

1<input type="button" value="購入" onclick="buy('<?php echo $data->name ?>')">

javascript

1 2function buy(name) { 3 // 受け取ったデータに合わせた処理 4 alert(name); 5}

追記:
おそらくbuyの引数でうまくいかなかったのは、単なる文字列を引数とするのに''で囲っていなかったからではないかと思います。
Webブラウザで表示後「ソースを表示」などして実際に出力されたHTMLを見てみると気づけるかもしれませんね。

投稿2018/03/09 06:57

編集2018/03/09 06:59
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarofess

2018/03/09 07:28

ご回答ありがとうございます。 PHPとJavaScriptの意味合い理解しました。 ご指摘の通り''で囲っていなかったため引数で渡せていなかったようです。 現在渡している引数がnameだけなのですが、これが5個となった場合もbuyの引数に5個分渡していけばいいでしょうか? 「ソースを表示」で確認はあまりしていないので、「ソースを表示」で確認するクセをつけようと思います。
m.ts10806

2018/03/09 07:45

> 現在渡している引数がnameだけなのですが、これが5個となった場合もbuyの引数に5個分渡していけばいいでしょうか? ひとまず分かりやすいのであれば、それでも実現可能です。 oncliclk="buy('a','b','c','d','e')" function buy(a,b,c,d,e){ } ただ、これが本当に効率的かどうかは別問題です。 渡したい項目が増えればその分、両方に追記していかなければならないからです。 例えば現在のようにhiddenに対して一定のclassを与えておき、buyからはidを渡すだけにしておき、そのクラスの情報を取得するようにするとか、そのほうが変更が少なくなるかもしれません。 oncliclk="buy(1)" <input type=hidden name="name" value="a" class="data_1"> <input type=hidden name="status" value="00" class="data_1"> <input type=hidden name="price" value="1000" class="data_1"> function buy(id){ var elements = document.getElementsByClassName("data_"+id); for(i = 0;i<elements.length;i++){ alert(elements[i].value); } } ※ラジオボタンやチェックボックスの場合は工夫が必要。  あと未検証なのでイメージだけ持ってください。 > 「ソースを表示」で確認はあまりしていないので、 想定通りに出力されているかどうかは画面を見ただけでは分かりませんよね。hiddenはソース上にしか出ないわけですし。 必ず見るようにしてください。
tarofess

2018/03/09 08:01

ご提示のコードのようにclassを設定し、getElementsByClassNameでそれぞれのリストに紐付いた値を取得することができました。 確かにこれだと後々修正が入ってもやりやすそうです。 大変参考になりました。ありがとうございました。
guest

0

ボタンに直接設定すればaタグは要らないですね
こんな感じで

PHP

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 Array.prototype.forEach.call(document.querySelectorAll('.contents input[type=button][value=購入]'),function(x){ 4 x.addEventListener('click',function(e){ 5 var v=e.target.parentNode.querySelector('input[type=hidden][name=name]').value; 6 console.log(v); 7 }); 8 }); 9}); 10</script> 11<?PHP 12 13$list=json_decode('[ 14 {"image":"hoge1.jpg","title":"hoge1","name":"fuga1"}, 15 {"image":"hoge2.jpg","title":"hoge2","name":"fuga2"}, 16 {"image":"hoge3.jpg","title":"hoge3","name":"fuga3"} 17]'); 18?> 19<div class="contents"> 20<ul> 21<?php foreach ($list as $data) { ?> 22<li class="contents_li"> 23<img class="contents_image" src="<?php echo $data->image ?>"/> 24<p class="contents_title"><?php echo $data->title; ?></p> 25<input type="button" value="購入"> 26<input type="hidden" name="name" value="<?php echo $data->name ?>"> 27</li> 28<?php } ?> 29</ul> 30</div>

追記

hiddenをつかわないでdata-*の方が汎用性は高いですね

PHP

1<script> 2document.addEventListener('click',function(e){ 3 var t=e.target; 4 if(t.nodeName=="INPUT" && t.type=="button" && t.value=="購入"){ 5 console.log(t.dataset["name"]); 6 } 7}); 8</script> 9<?PHP 10 11$list=[ 12 (Object) ["image"=>"hoge1.jpg","title"=>"hoge1","name"=>"fuga1"], 13 (Object) ["image"=>"hoge2.jpg","title"=>"hoge2","name"=>"fuga2"], 14 (Object) ["image"=>"hoge3.jpg","title"=>"hoge3","name"=>"fuga3"] 15]; 16?> 17<div class="contents"> 18<ul> 19<?php foreach ($list as $data) { ?> 20<li class="contents_li"> 21<img class="contents_image" src="<?php echo $data->image ?>"/> 22<p class="contents_title"><?php echo $data->title; ?></p> 23<input type="button" value="購入" data-name="<?php echo $data->name ?>"> 24</li> 25<?php } ?> 26</ul> 27</div>

datasetが利用できないブラウザが対象の場合は
getAttribute("data-name")のような書き方をしてください

複数のデータを渡す

ひとつはそれぞれdata-*形式で値をわたしてやること

PHP

1<input type="button" value="購入" data-name="<?php echo $data->name; ?>" data-title="<?php echo $data->title; ?>">

javascript

1console.log(t.dataset["name"]); 2console.log(t.dataset["title"]);

もう一つは、JSON形式で渡してやること

PHP

1 <input type="button" value="購入" data-list='<?php echo '{"name":"'.$data->name.'","title":"'.$data->title.'"}'; ?>'> 2/* 改良版 */ 3 <input type="button" value="購入" data-list="<?php echo htmlspecialchars(json_encode(["name"=>$data->name,"title"=>$data->title]));?>"></li>

この場合受けとった側はパースしてやる必要があります

javascript

1 console.log(JSON.parse(t.dataset["list"]));

投稿2018/03/09 07:08

編集2018/03/09 08:31
yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarofess

2018/03/09 07:31

ご回答ありがとうございます。 そういう風にボタンに直接設定できるんですね。 JavaScriptは色々な表現ができてこんがらがります...。 data-nameの設定の場合だと、ボタンに一つのデータが紐づいていますが、データが複数ある場合はどのように設定すればいいでしょうか?
yambejp

2018/03/09 07:50

追記しておきました
tarofess

2018/03/09 08:04

jsonでそのように指定することもできるのですね。 jsonの方が個人的に見やすいのでこっちの方がいいですね。 色々なやり方があって大変参考になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問