phpのwhile出力に対するJSを使った計算

このQ&Aのポイント
  • PHPでMYSQLからデータを取り出し、WHILEでテーブルに商品の情報を出力していますが、各項目の数字を変更し計算を再実行するとリロードが発生してしまいます。
  • この問題を改善するために、JSかAjaxを使用する方法を考えていますが、現在は一行しか動作しない状態です。
  • 各エレメントに個別の番号を割り当てることで解決できるかもしれませんが、JSには関係がないようにも見えます。
回答を見る
  • ベストアンサー

phpのwhile出力に対するJSを使った計算

JS初心者です。phpでmysqlからデータを取り出し、whileでテーブルに商品名等と単価・数・小計を出力していますが、各項目の数字を変更しphpで再計算させると当然ながらリロードが発生するのでテーブルの頭に戻って表示されてしまいます。この点を改善しなければならず、計算自体は単純なものですので、JSかAjaxでと思ったのですが、いずれの方法でも最初の一行しか動作いたしません。各エレメントの「id='x'」を「id='x<?=[renban]?>'」とすると横取りソフト上では「id=x3752」のように各行個別に番号が割り当てられているのですが、結果は同じで、JSには関係がないようにも見えます。下記ではwhileの中にJSが入っていますが、<SCRIPT TYPE="text/javascript"> <!-- // --> </SCRIPT> としてヘッダに置くと全く反応せず、ブラウザのエラー表示では「オブジェクトを指定して下さい」と出ます。大変困ってしまいました。どなたかご教授いただけますよう、よろしくお願いいたします。 以下見ずらいとは思いますが、実際のコードの抜粋です。問題はフォーム中ほどの部分です。 //ここまでDBからのデータ呼び出し部分 以下本題です while($row = mysql_fetch_array($result)){ PRINT<<<EOF <form action= "mv6.php" name="form1" method="POST" id="form1"> </tr><tr bgcolor="FFFFFF" onMouseOver="this.style.backgroundColor='#FFCCFF'" onMouseOut="this.style.backgroundColor='#FFFFFF'" > <td width="20"> <INPUT type='hidden' name='renban' value='$row[renban]'> <INPUT type='hidden' name="kind[$row[renban]]" value="ok"> <input type="checkbox" name="del[$row[renban]]" value="ok"></td> <td width="220"> <INPUT size='26' type='text' name='shu[$row[renban]]' value='$row[shu]'class = 'nonbor' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'" ></td> <td width="300" ><INPUT size='36' type='text' name='hin_na[$row[renban]]' value='$row[hin_na]' id = 'hin_na[$row[renban]]' class = 'nonbor' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"></td> <SCRIPT> function cal(){ x = document.getElementById('x').value; y = document.getElementById('y').value; z = x * y; document.getElementById('z').value = z; } </SCRIPT> <td width="90" ><INPUT size='12' type='text' name='x' value='$row[tanka]' id='x' class = 'nonborri' onKeyup="cal(this);" onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"></td> <td width="90"><INPUT size='12' type='text' name='y' value='$row[kazu]' id='y' class = 'nonborri' onKeyup="cal(this);" onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"></td> <td width="100"><INPUT size='13' type='text' name='z' value='' id='z' class = 'nonborri' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"></td> <td width="240"><INPUT size='40' type='text' name='bikou[$row[renban]]' value='$row[bikou]' class = 'nonbor' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"> </td> </tr> </TABLE> EOF; }

質問者が選んだベストアンサー

  • ベストアンサー
  • is_may
  • ベストアンサー率65% (58/89)
回答No.1

現状では、まず一行目で「cal()」という関数や「x」、「y」という名前のテキストボックスが設置されます。この時点では問題ありませんが、二行目でまた一行目と全く同じ関数やテキストボックスが配置されてしまいます。JavaScriptが上手く動かないのはこのように同名の関数などが発生してしまうためです。 具体的な解決策としては、whileの前に$i=0;などのカウント変数を宣言し、whileが一度終わるときに$i++;として足します。そして「cal()」やJavaScript内のテキストボックスの参照名(x,y,z)、テキストボックス名やそのイベントハンドラの関数名など、繰り返し処理で重複してしまう名称には全部「$i」を付加します。 説明下手なので分かりにくいかと思いましたのでテスト実行したものを貼ります。 <table border="1"> <tr> <td></td> <td>種目</td> <td>品名</td> <td>X</td> <td>Y</td> <td>Z</td> <td>備考</td> </tr> <?php $i=1; while($i<10){ PRINT<<<EOF <form action= "mv6.php" name="form1" method="POST" id="form1"> </tr> <tr bgcolor="FFFFFF" onMouseOver="this.style.backgroundColor='#FFCCFF'" onMouseOut="this.style.backgroundColor='#FFFFFF'" > <td width="20"> <INPUT type='hidden' name='renban' value='$row[renban]'> <INPUT type='hidden' name="kind[$row[renban]]" value="ok"> <input type="checkbox" name="del[$row[renban]]" value="ok"> </td> <td width="220"> <INPUT size='26' type='text' name='shu[$row[renban]]' value='$row[shu]'class = 'nonbor' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'" > </td> <td width="300" > <INPUT size='36' type='text' name='hin_na[$row[renban]]' value='$row[hin_na]' id = 'hin_na[$row[renban]]' class = 'nonbor' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"> </td> <script language="javascript" type="text/javascript"><!-- bx$i=by$i=""; function cal$i(){ x = document.getElementById('x$i').value; y = document.getElementById('y$i').value; z = x * y; if(isNaN(x)){ document.getElementById('x$i').value=bx$i; } else if(isNaN(y)){ document.getElementById('y$i').value=by$i; } else { document.getElementById('z$i').value = z; bx$i = x; by$i = y; } } //--> </script> <td width="90" > <INPUT size='12' type='text' name='x$i' value='$row[tanka]' id='x' class = 'nonborri' onKeyup="cal$i(this);" onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"> </td> <td width="90"> <INPUT size='12' type='text' name='y$i' value='$row[kazu]' id='y' class = 'nonborri' onKeyup="cal$i(this);" onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"> </td> <td width="100"><INPUT size='13' type='text' name='z$i' value='' id='z' class = 'nonborri' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"> </td> <td width="240"><INPUT size='40' type='text' name='bikou[$row[renban]]' value='$row[bikou]' class = 'nonbor' onFocus="this.style.backgroundColor='#FFFF99'" onBlur="this.style.backgroundColor='ffffff'"> </td> </tr> EOF; $i++; } ?> </table>

yuw0516
質問者

お礼

御礼 is_may様、おかげさまで無事に解決することができました。 ありがとうございました。 見ず知らずの私からの質問に、ここまですばやく、懇切丁寧にお答えいただけてとても嬉しいです。 お忙しい中、テストをしていただいた上でコードを教えていただくなんて感激です。これで数日ぶりに今夜はゆっくり休めます。。 おおげさと思われるかも知れませんが、助けていただいて胸が熱くなる思いです。 これを機に私も力になれる質問にはお答えしていこうと思います。 本当にありがとうございました。感謝。

関連するQ&A

  • tableの各セルに同じ関数を対応させたい

    いつもお世話になっております。 今回はテーブルの各セルに同じ関数を対応させたいのですがいい方法が思い浮かばなかったので、そこをお聞きしたいです。 function swap(TD) {  if(TD.style && TD.style.backgroundColor)  {   TD.style.backgroundColor = '';  }  else  {   TD.style.backgroundColor = '#ff0000';  } } (略) <TD onclick="swap(this)"><INPUT type="hidden" name="xxx01" value="0"></TD> <TD onclick="swap(this)"><INPUT type="hidden" name="xxx02" value="0"></TD> <TD onclick="swap(this)"><INPUT type="hidden" name="xxx03" value="0"></TD> <TD onclick="swap(this)"><INPUT type="hidden" name="xxx04" value="0"></TD> swapという関数はセルの色を白と赤に交互に変えるものですが、ここにセルが白なら0を、赤なら1を各テキストに入れるという処理を加えたいです。 しかしながらnameがちょっと違うので一つ一つ関数を作らなくてはいけないのかと思っています。 nameのxxxの部分は共通で、お尻の数字が変わっていきます。 この規則性を使って何とかうまい方法はありませんでしょうか? ご教授お願いします。

  • サイト検索窓の文字色を、触れる前と入力する時で色を変えようとしています

    サイト検索窓の文字色を、触れる前と入力する時で色を変えようとしていますが、 うまくいかずに非常に困っております。 今のhtmlがこれです。 -------------------- <form name="myform" action="http://www~~" method="post"> <input type="text" name="search_name" value="サイト内検索" id="uid" onfocus="if (this.value == 'サイト内検索') { this.value='' }" onblur="if (this.value == '') { this.value='サイト内検索' }" /> <input type="submit" value="検索" name="button" id="btn" class="fadeBtn" /> </form> -------------------- cssで<input>のcolorを指定したら、 入力する前の表示も、入力した時の表示も同じ色になりました。 そこで、調べた結果以下のようにonfocusとonblurにcolorを指定したのですが、 うまくいきませんでした。 -------------------- <form name="myform" action="http://www~~" method="post"> <input type="text" name="search_name" value="サイト内検索" id="uid" onfocus="if (this.value == 'サイト内検索') { this.value='' } { this.style='color:#000000' }" onblur="if (this.value == '') { this.style='color:pink' } { this.value='サイト内検索' }" /> <input type="submit" value="検索" name="button" id="btn" class="fadeBtn" /> </form> -------------------- javaが必要なのでしょうか? javaには詳しくないため、必要でしたら教えていただきたいです。 どうぞご回答お願いします・・・。

  • マウスがinput,textarea,の上にのったときに背景画像を表示させたい

    たとえばマウスが上にのったときに色を変えるには下のソースを使ってるんですが、 <input type="submit" name="submit" value="DELETE"onmouseover="this.style.backgroundColor='#ffcee7'" onmouseout="this.style.backgroundColor='#FFFFFF'"> 背景画像を表示させたいときはどうやったらいいですか? おねがいします。

  • 背景色を戻したい

    いつもお世話になっています。 複数行のテーブルを作成して、ラジオボタンで選択行のみ背景色を変更する画面を作っています。 以下がソースです。 <HTML> <BODY bgcolor="#F0E68C">  <TABLE border="1" cellspacing="0">   <TR>    <TD width="5%">     <INPUT type="radio" name="count" onFocus="this.parentNode.parentNode.bgColor='#F4A460';" onBlur="this.parentNode.parentNode.bgColor='';"></TD>    <TD width="10%">1行目左</TD>    <TD width="10%">1行目右</TD>   </TR>   <TR bgcolor="#E9967A">    <TD width="5%">     <INPUT type="radio" name="count" onFocus="this.parentNode.parentNode.bgColor='#F4A460';" onBlur="this.parentNode.parentNode.bgColor='';"></TD>    <TD width="10%">2行目左</TD>    <TD width="10%">2行目右</TD>   </TR>   <TR>    <TD width="5%">     <INPUT type="radio" name="count" onFocus="this.parentNode.parentNode.bgColor='#F4A460';" onBlur="this.parentNode.parentNode.bgColor='';"></TD>    <TD width="10%">3行目左</TD>    <TD width="10%">3行目右</TD>   </TR>  </TABLE> </BODY> </HTML> ラジオボタンの選択が外れた場合、元の行背景色に戻したいのですが(『2行目』)、 <TR>のbgcolor="#E9967A"に戻らず、<BODY>のbgcolor="#F0E68C"になってしまいます。 どうしたら元の行背景色に戻すことができるのでしょうか? それとも他に方法があるのでしょうか? ご存知の方、教えてください・・・。

  • テーブルリンクに付いて

    下記のテーブルリンクを作成しましたがクリックしても説明文が表示されません どなたか教えて下さい <p align="center"> <TABLE HEIGHT=30 BORDER=1 BGCOLOR="#FFFFFF" CELLSPACING=0> <TR> <TD WIDTH=150 ALIGN="center" onClick="window.location.href='http://uye43ys.dousetsu.com/simpleVC_20110728074105.html'" onmouseover="this.style.backgroundColor='#80FFFF';" onmouseout="this.style.backgroundColor=''" STYLE="cursor:hand;">特典サービス</TD> <TD WIDTH=150 ALIGN="center" onClick="window.location.href='http://uye43ys.dousetsu.com/simpleVC_20110728075504.html'" onmouseover="this.style.backgroundColor='#80FFFF';" onmouseout="this.style.backgroundColor=''" STYLE="cursor:hand;">車検費用</TD>

  • Javascriptで自動計算の合計の式でエラー

    度々すみません。 前回こちらで質問させて頂きましたものです。 http://okwave.jp/qa/q8737139.html 教えて頂いた内容を確認してフォームの合計を表示するところまでは出来たのですが、合計する列をひとつ増設した所、D列の合計は教えて頂いた式で合計が無事表示されたのですが、C列の合計が合計ではなく文字の並びが表示されてしまいました。 色々調べてみたのですが、この現象の原因がよくわかりません。 何かエラーがあるのでしょうか。 お知恵を貸して頂けると嬉しいです。 宜しくお願いします。 <スクリプト> <script type='text/javascript'> function keisan(){ var price1 = (document.form1.a1.value) * (document.form1.b1.value) * (document.form1.c1.value); document.form1.金額1.value = price1 ; var price2 = (document.form1.a2.value) * (document.form1.b2.value) * (document.form1.c2.value); document.form1.金額2.value = price2 ; var price3 = (document.form1.a3.value) * (document.form1.b3.value) * (document.form1.c3.value); document.form1.金額3.value = price3 ; document.form1.total.value = price1 + price2 + price3; var f1 = (document.form1.c1.value); document.form1.c1.value = f1 ; var f2 = (document.form1.c2.value); document.form1.c2.value = f2 ; var f3 = (document.form1.c3.value); document.form1.c3.value = f3 ; document.form1.ctotal.value = f1 + f2 + f3; } </script> <HTMLソース> <body> <form method="post" name="form1"> <table width="473" border='1'> <tr> <td align='center'>&nbsp;</td> <td align='center'>A</td> <td align='center'>B</td> <td align='center'>C</td> <td align='center'>D</td> </tr> <tr> <td>1</td> <td><input type='text' name='a1' onchange='keisan()' style='width:50px' /></td> <td><input type='text' name='b1' onchange='keisan()' style='width:50px' /></td> <td><input type='text' name='c1' onchange='keisan()' style='width:25px' /></td> <td><input type='text' name='金額1' style='width:100px' /></td> </tr> <tr> <td>2</td> <td><input type='text' name='a2' onchange='keisan()' style='width:50px' /></td> <td><input type='text' name='b2' onchange='keisan()' style='width:50px' /></td> <td><input type='text' name='c2' onchange='keisan()' style='width:25px' /></td> <td><input type='text' name='金額2' style='width:100px' /></td> </tr> <tr> <td>3</td> <td><input type='text' name='a3' onchange='keisan()' style='width:50px' /></td> <td><input type='text' name='b3' onchange='keisan()' style='width:50px' /></td> <td><input type='text' name='c3' onchange='keisan()' style='width:25px' /></td> <td><input type='text' name='金額3' style='width:100px' /></td> </tr> <tr> <td colspan="3" align='right'>合計</td> <td><input type='text' name='ctotal' style='width:25px' /></td> <td><input type='text' name='total' style='width:100px' /></td> </tr> </table> </form> </body>

  • PHPとJSを使ったお問い合わせフォームについて

    こんにちは、セレクトボックスの選択部分を変更するとフォームの内容が変わるというフォームを作っているんですが色々試しても何がどうおかしいのかわからないので質問させていただきます。 PHPは特に触り始めて間もないのでわかりやすく教えてもらえると嬉しいです。 多分色々とおかしいことになってると思いますが出来るだけ分かりやすくよろしくお願いいたします。 【index.html】 <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> fieldset{ border: none; } </style> <script type="text/javascript"> function setForm(ex) { var target = ex.value; var group = ex.form.getElementsByTagName("FIELDSET"); var i=0, fs; while(fs=group[i++]) fs.style.display = fs.id == target?"block":"none"; } </script> </head> <body> <form action="form.php" method="post"> <table> <tr> <td>用件</td> <td> <select name="select1" onchange="setForm(this)"> <option value="">選択してください</option> <option value="A">ご質問</option> <option value="B">資料請求</option> <option value="A">その他</option> </select></td> </tr> </table> <fieldset id="A"> <table> <tr> <td>お名前</td> <td><input type="text" name="name" value=""></td> </tr> <tr> <td>Mail</td> <td><input type="text" name="mail" value=""></td> </tr> <tr> <td>サイトを知ったきっかけ</td> <td><input type="checkbox" name="chance[0]" value="friend">知り合い <input type="checkbox" name="chance[1]" value="serch">検索エンジン<td> </tr> <tr> <td>ご質問内容</td> <td><textarea name="message" cols="60" rows="5"></textarea></td> </tr> </table> </fieldset> <fieldset id="B"> <table> <tr> <td>お名前</td> <td><input type="text" name="name" value=""></td> </tr> <tr> <td>Mail</td> <td><input type="text" name="mail" value=""></td> </tr> <tr> <td>性別</td> <td><input type="radio" name="gender" value="man">男 <input type="radio" name="gender" vakue="woman">女</td> </tr> <tr> <td>住所</td> <td><input type="text" name="address" value=""></td> </tr> </table> </fieldset> <input type="submit" value="送信する" /> </form> </body> </html> </html> 【form.php】 <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <?php mb_language("japanese"); mb_internal_encoding("utf-8"); if(!empty($_POST['mail'])){ $to=$_POST['mail']; $name=$_POST['name']; $chance=$_POST['chance']; $message=$_POST['message']; $gender=$_POST['gender']; $address=$_POST['address']; $form=mb_encode_mimeheader(mb_convert_encoding("自分の名前","JIS","UTF-8"))."<aaa@aaa.com>"; $success=mb_send_mail($to,"名前:".$name."サイトを知ったきっかけ:".$chance."お問い合せ内容:".$messagge."性別:".$gender."住所:".$address,"from:".$from); } ?> <?php if ($success) { print('送信しました。'); } else { print('送信に失敗しました。'); } ?> </body> </html> よろしくお願いします!!!!

  • フォーム内容がメールでうまく取得できない

    ホームページ作り初心者です。 くだらない質問かもしれないのですが、行き詰まって悩んでいます…。 どうかよろしくお願い致します。 今、CGIを使ってフォームを作っています。 基本的なフォームでは問題がないので、CGI自体に問題はないと思います。 それが、メールフォームをテーブルで囲まれたデザインにした途端、フォーム内容がうまくメールで取得できなくなりました。 本当なら 「shopname = ○○○○  name = ○○○○  tel = ○○○○  email = ○○○○  question = ○○○○」 と送ってほしいのに、 「shopname =  ○○○○  name」 となんとも中途半端な内容が送られてきます…。 テーブルを使ったからCGIがうまく作動しないのか、HTMLがおかしいのか、CGIがおかしいのか、どこがいけないのかわかりません。 アドバイスいただけたら嬉しいです。 宜しくお願い致します。 以下、フォームのHTMLです。 --------------------------------------- <form action="./postmail.cgi" method="post" enctype="text/plain" name="form1" id="form1"> <table width="520" border="0" cellspacing="2" cellpadding="2" bgcolor="#7EBEB6"> <tr> <td width="152" bgcolor="#FFFFFF" class="style3"><center> 店舗名 </center></td> <td width="354" bgcolor="#FFFFFF"><input type="text" name="shopname" size="44" /> </td> </tr> <tr> <td width="152" bgcolor="#FFFFFF" class="style3"><center> ご担当者名 </center></td> <td width="354" bgcolor="#FFFFFF"><input type="text" name="name" size="44" id="name" /> </td> </tr> <tr> <td width="152" bgcolor="#FFFFFF" class="style3"><center> お電話番号 </center></td> <td width="354" bgcolor="#FFFFFF"><input type="text" name="tel" size="44" id="tel" /> </td> </tr> <tr> <td width="152" bgcolor="#FFFFFF" class="style3"><center> メールアドレス </center></td> <td width="354" bgcolor="#FFFFFF"><input type="text" name="email" size="44" id="email" /> </td> </tr> <tr> <td width="152" bgcolor="#FFFFFF" class="style3"><center> メールアドレス(確認用) </center></td> <td width="354" bgcolor="#FFFFFF"><input type="text" name="email2" size="44" id="email2" /> </td> </tr> <tr> <td width="152" bgcolor="#FFFFFF" class="style3"><center> お問い合わせ内容 </center></td> <td width="354" bgcolor="#FFFFFF"><textarea name="question" cols="43" rows="7"></textarea></td> </tr> </table> <br /> <input type="submit" name="button" id="button" value="送信" /> <input type="reset" name="button2" id="button2" value="すべてクリア" /> <br /> </form>

    • ベストアンサー
    • HTML
  • テキストボックスの背景色変更時に影ができてしまう

    テキストボックス選択時に背景色をJavaScriptで変更したく、下記のように書きました。 <input type="text" value="テキストボックスです" onfocus="this.style.backgroundColor='#cccccc'" onblur="this.style.backgroundColor='#ffffff'"> これをWindowsXP+IE6で実行したところ、背景色の処理はうまくいくのですが、画面のプロパティのテーマがデフォルトのWindowsXPの場合、元は影のないテキストボックスなのですが、背景色変更時に影つきのテキストボックスになってしまいます。 テーマがWindowsクラシックだと元々影つきなので変化しません。 背景色変更時に影つきにならないようにできませんでしょうか? それともこれはIE6のバグなのでしょうか?

  • PHPでMySQLデータを呼び出し、whileループの中で別テーブルのデータをループするには

    MySQLからuserというテーブルのデータを呼び出し、表示すると同時にフォームとしてデータの変更もできるプログラムを作成しています。 その項目の中に別のusergrというテーブルのデータをリストボックスで表示させたいのですが、うまくいきません。 現状では下記のスクリプトでuserの1番のデータだけが表示されている状態です。(リストボックスも問題なく表示はされていますが…) まわりに聞ける人もいず、本などを見よう見まねで作成したため、根本的に誤ってるところがあるかと思いますが、どうかアドバイス頂けませんでしょうか。 $sql = "SELECT * FROM user"; $mysql->query($sql); while($row = $mysql->fetch()){ $no = $row["no"]; $name = $row["name"]; $division = $row["division"]; $email = $row["email"]; $tel = $row["tel"]; $group = $row["group"]; echo <<<EOT <td align="center">$no</td> <td align="center"><input type="text" name="name[$no]" value="$name" size="10"></td> <td align="center"><input type="text" name="division[$no]" value="$division" size="20"></td> <td align="center"><input type="text" name="email[$no]" value="$email" size="30"></td> <td align="center"><input type="text" name="tel[$no]" value="$tel" size="10"></td> <td align="center"> <select name="group[$no]"> EOT; $sql = "SELECT * FROM usergr LEFT JOIN user ON usergr.grno=user.group"; $mysql->query($sql); while($row = $mysql->fetch()){ $group = $row["group"]; $grno = $row["grno"]; $grname = $row["grname"]; if($row["grno"]==$group){ echo "<option value=\"{$row['grno']}\" selected=\"selected\">{$row['grname']}</option>"; } else { echo "<option value=\"{$row['grno']}\">{$row['grname']}</option>"; } } echo <<<EOT </select> </td> <td align="center"><input type="submit" name="submit_upd[$no]" value="変更"> <input type="submit" name="submit_del[$no]" value="削除"></td> </tr> EOT; }

    • ベストアンサー
    • PHP

専門家に質問してみよう